aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmldesigner/designercore/model/rewriterview.cpp')
-rw-r--r--src/plugins/qmldesigner/designercore/model/rewriterview.cpp98
1 files changed, 81 insertions, 17 deletions
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
index 17d40daca3..3c481573d2 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
@@ -16,12 +16,14 @@
#include <filemanager/objectlengthcalculator.h>
#include <modelnode.h>
#include <modelnodepositionstorage.h>
+#include <nodemetainfo.h>
#include <nodeproperty.h>
+#include <projectstorage/projectstorage.h>
+#include <qmlobjectnode.h>
+#include <qmltimelinekeyframegroup.h>
#include <rewritingexception.h>
#include <signalhandlerproperty.h>
#include <variantproperty.h>
-#include <qmlobjectnode.h>
-#include <qmltimelinekeyframegroup.h>
#include <qmljs/parser/qmljsengine_p.h>
#include <qmljs/qmljsmodelmanagerinterface.h>
@@ -56,9 +58,9 @@ RewriterView::RewriterView(ExternalDependenciesInterface &externalDependencies,
DifferenceHandling differenceHandling)
: AbstractView{externalDependencies}
, m_differenceHandling(differenceHandling)
- , m_positionStorage(new ModelNodePositionStorage)
- , m_modelToTextMerger(new Internal::ModelToTextMerger(this))
- , m_textToModelMerger(new Internal::TextToModelMerger(this))
+ , m_positionStorage(std::make_unique<ModelNodePositionStorage>())
+ , m_modelToTextMerger(std::make_unique<Internal::ModelToTextMerger>(this))
+ , m_textToModelMerger(std::make_unique<Internal::TextToModelMerger>(this))
{
m_amendTimer.setSingleShot(true);
@@ -78,12 +80,12 @@ RewriterView::~RewriterView() = default;
Internal::ModelToTextMerger *RewriterView::modelToTextMerger() const
{
- return m_modelToTextMerger.data();
+ return m_modelToTextMerger.get();
}
Internal::TextToModelMerger *RewriterView::textToModelMerger() const
{
- return m_textToModelMerger.data();
+ return m_textToModelMerger.get();
}
void RewriterView::modelAttached(Model *model)
@@ -92,7 +94,7 @@ void RewriterView::modelAttached(Model *model)
AbstractView::modelAttached(model);
- ModelAmender differenceHandler(m_textToModelMerger.data());
+ ModelAmender differenceHandler(m_textToModelMerger.get());
const QString qmlSource = m_textModifier->text();
if (m_textToModelMerger->load(qmlSource, differenceHandler))
m_lastCorrectQmlSource = qmlSource;
@@ -104,6 +106,7 @@ void RewriterView::modelAttached(Model *model)
m_modelAttachPending = true;
QTimer::singleShot(1000, this, [this, model](){
modelAttached(model);
+ restoreAuxiliaryData();
});
}
}
@@ -492,7 +495,7 @@ void RewriterView::amendQmlText()
const QString newQmlText = m_textModifier->text();
- ModelAmender differenceHandler(m_textToModelMerger.data());
+ ModelAmender differenceHandler(m_textToModelMerger.get());
if (m_textToModelMerger->load(newQmlText, differenceHandler))
m_lastCorrectQmlSource = newQmlText;
emitCustomNotification(EndRewriterAmend);
@@ -593,7 +596,7 @@ QString RewriterView::auxiliaryDataAsQML() const
hasAuxData = true;
QString strValue = value.toString();
- auto metaType = static_cast<QMetaType::Type>(value.type());
+ const int metaType = value.typeId();
if (metaType == QMetaType::QString
|| metaType == QMetaType::QColor) {
@@ -698,7 +701,7 @@ void RewriterView::forceAmend()
Internal::ModelNodePositionStorage *RewriterView::positionStorage() const
{
- return m_positionStorage.data();
+ return m_positionStorage.get();
}
QList<DocumentMessage> RewriterView::warnings() const
@@ -755,7 +758,7 @@ void RewriterView::resetToLastCorrectQml()
{
m_textModifier->textDocument()->undo();
m_textModifier->textDocument()->clearUndoRedoStacks(QTextDocument::RedoStack);
- ModelAmender differenceHandler(m_textToModelMerger.data());
+ ModelAmender differenceHandler(m_textToModelMerger.get());
Internal::WriteLocker::unlock(model());
m_textToModelMerger->load(m_textModifier->text(), differenceHandler);
Internal::WriteLocker::lock(model());
@@ -1004,6 +1007,61 @@ QSet<QPair<QString, QString> > RewriterView::qrcMapping() const
return m_textToModelMerger->qrcMapping();
}
+namespace {
+#ifdef QDS_USE_PROJECTSTORAGE
+
+ModuleIds generateModuleIds(const ModelNodes &nodes)
+{
+ ModuleIds moduleIds;
+ moduleIds.reserve(Utils::usize(nodes));
+ for (const auto &node : nodes) {
+ auto exportedNames = node.metaInfo().allExportedTypeNames();
+ if (exportedNames.size())
+ moduleIds.push_back(exportedNames.front().moduleId);
+ }
+
+ std::sort(moduleIds.begin(), moduleIds.end());
+ moduleIds.erase(std::unique(moduleIds.begin(), moduleIds.end()), moduleIds.end());
+
+ return moduleIds;
+}
+
+QStringList generateImports(ModuleIds moduleIds, const ProjectStorageType &projectStorage)
+{
+ QStringList imports;
+ imports.reserve(std::ssize(moduleIds));
+
+ for (auto moduleId : moduleIds) {
+ using Storage::ModuleKind;
+ auto module = projectStorage.module(moduleId);
+ switch (module.kind) {
+ case ModuleKind::QmlLibrary:
+ imports.push_back("import " + module.name.toQString());
+ break;
+ case ModuleKind::PathLibrary:
+ imports.push_back("import \"" + module.name.toQString() + "\"");
+ break;
+ case ModuleKind::CppLibrary:
+ break;
+ }
+ }
+
+ return imports;
+}
+
+QStringList generateImports(const ModelNodes &nodes)
+{
+ if (nodes.empty())
+ return {};
+
+ auto moduleIds = generateModuleIds(nodes);
+
+ return generateImports(moduleIds, *nodes.front().model()->projectStorage());
+}
+
+#endif
+} // namespace
+
void RewriterView::moveToComponent(const ModelNode &modelNode)
{
if (!modelNode.isValid())
@@ -1012,20 +1070,26 @@ void RewriterView::moveToComponent(const ModelNode &modelNode)
int offset = nodeOffset(modelNode);
const QList<ModelNode> nodes = modelNode.allSubModelNodesAndThisNode();
- QSet<QString> directPaths;
+#ifdef QDS_USE_PROJECTSTORAGE
+ auto directPaths = generateImports(nodes);
+#else
+ QSet<QString> directPathsSet;
// Always add QtQuick import
QString quickImport = model()->qtQuickItemMetaInfo().requiredImportString();
if (!quickImport.isEmpty())
- directPaths.insert(quickImport);
+ directPathsSet.insert(quickImport);
for (const ModelNode &partialNode : nodes) {
QString importStr = partialNode.metaInfo().requiredImportString();
if (importStr.size())
- directPaths << importStr;
+ directPathsSet << importStr;
}
- QString importData = Utils::sorted(directPaths.values()).join(QChar::LineFeed);
+ auto directPaths = directPathsSet.values();
+#endif
+
+ QString importData = Utils::sorted(directPaths).join(QChar::LineFeed);
if (importData.size())
importData.append(QString(2, QChar::LineFeed));
@@ -1091,7 +1155,7 @@ void RewriterView::qmlTextChanged()
switch (m_differenceHandling) {
case Validate: {
- ModelValidator differenceHandler(m_textToModelMerger.data());
+ ModelValidator differenceHandler(m_textToModelMerger.get());
if (m_textToModelMerger->load(newQmlText, differenceHandler))
m_lastCorrectQmlSource = newQmlText;
break;