QmlDesigner: Clean up unused imports after effect node deletion

Import removal is done asynchronously as false node deletions can be
triggered by node reorganization that happens sometimes e.g. when
undo/redo is done.

Fixes: QDS-11741
Change-Id: I1d33e43ee205408c6a0fb2a45347ede13c02c4ed
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Miikka Heikkinen
2024-06-28 16:58:17 +03:00
parent 548cd083b4
commit 658142aed2
2 changed files with 49 additions and 0 deletions

View File

@@ -9,6 +9,7 @@
#include <designermcumanager.h> #include <designermcumanager.h>
#include <documentmanager.h> #include <documentmanager.h>
#include <import.h>
#include <modelnodeoperations.h> #include <modelnodeoperations.h>
#include <qmlchangeset.h> #include <qmlchangeset.h>
#include <qmldesignerconstants.h> #include <qmldesignerconstants.h>
@@ -16,6 +17,8 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <QTimer>
namespace EffectComposer { namespace EffectComposer {
EffectComposerContext::EffectComposerContext(QWidget *widget) EffectComposerContext::EffectComposerContext(QWidget *widget)
@@ -183,4 +186,48 @@ void EffectComposerView::selectedNodesChanged(const QList<QmlDesigner::ModelNode
m_widget->effectComposerModel()->setHasValidTarget(hasValidTarget); m_widget->effectComposerModel()->setHasValidTarget(hasValidTarget);
} }
void EffectComposerView::nodeAboutToBeRemoved(const QmlDesigner::ModelNode &removedNode)
{
QList<QmlDesigner::ModelNode> nodes = removedNode.allSubModelNodesAndThisNode();
bool effectRemoved = false;
for (const QmlDesigner::ModelNode &node : nodes) {
QmlDesigner::QmlItemNode qmlNode(node);
if (qmlNode.isEffectItem()) {
effectRemoved = true;
break;
}
}
if (effectRemoved)
QTimer::singleShot(0, this, &EffectComposerView::removeUnusedEffectImports);
}
void EffectComposerView::removeUnusedEffectImports()
{
QTC_ASSERT(model(), return);
const QString effectPrefix = m_componentUtils.composedEffectsTypePrefix();
const QmlDesigner::Imports &imports = model()->imports();
QHash<QString, QmlDesigner::Import> effectImports;
for (const QmlDesigner::Import &import : imports) {
if (import.url().startsWith(effectPrefix)) {
QString type = import.url().split('.').last();
effectImports.insert(type, import);
}
}
const QList<QmlDesigner::ModelNode> allNodes = allModelNodes();
for (const QmlDesigner::ModelNode &node : allNodes) {
if (QmlDesigner::QmlItemNode(node).isEffectItem())
effectImports.remove(node.simplifiedTypeName());
}
if (!effectImports.isEmpty()) {
QmlDesigner::Imports removeImports;
for (const QmlDesigner::Import &import : effectImports)
removeImports.append(import);
model()->changeImports({}, removeImports);
}
}
} // namespace EffectComposer } // namespace EffectComposer

View File

@@ -39,10 +39,12 @@ public:
void modelAboutToBeDetached(QmlDesigner::Model *model) override; void modelAboutToBeDetached(QmlDesigner::Model *model) override;
void selectedNodesChanged(const QList<QmlDesigner::ModelNode> &selectedNodeList, void selectedNodesChanged(const QList<QmlDesigner::ModelNode> &selectedNodeList,
const QList<QmlDesigner::ModelNode> &lastSelectedNodeList) override; const QList<QmlDesigner::ModelNode> &lastSelectedNodeList) override;
void nodeAboutToBeRemoved(const QmlDesigner::ModelNode &removedNode) override;
private: private:
void customNotification(const AbstractView *view, const QString &identifier, void customNotification(const AbstractView *view, const QString &identifier,
const QList<QmlDesigner::ModelNode> &nodeList, const QList<QVariant> &data) override; const QList<QmlDesigner::ModelNode> &nodeList, const QList<QVariant> &data) override;
void removeUnusedEffectImports();
QPointer<EffectComposerWidget> m_widget; QPointer<EffectComposerWidget> m_widget;
QString m_currProjectPath; QString m_currProjectPath;