forked from qt-creator/qt-creator
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:
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <designermcumanager.h>
|
||||
#include <documentmanager.h>
|
||||
#include <import.h>
|
||||
#include <modelnodeoperations.h>
|
||||
#include <qmlchangeset.h>
|
||||
#include <qmldesignerconstants.h>
|
||||
@@ -16,6 +17,8 @@
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
|
||||
#include <QTimer>
|
||||
|
||||
namespace EffectComposer {
|
||||
|
||||
EffectComposerContext::EffectComposerContext(QWidget *widget)
|
||||
@@ -183,4 +186,48 @@ void EffectComposerView::selectedNodesChanged(const QList<QmlDesigner::ModelNode
|
||||
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
|
||||
|
@@ -39,10 +39,12 @@ public:
|
||||
void modelAboutToBeDetached(QmlDesigner::Model *model) override;
|
||||
void selectedNodesChanged(const QList<QmlDesigner::ModelNode> &selectedNodeList,
|
||||
const QList<QmlDesigner::ModelNode> &lastSelectedNodeList) override;
|
||||
void nodeAboutToBeRemoved(const QmlDesigner::ModelNode &removedNode) override;
|
||||
|
||||
private:
|
||||
void customNotification(const AbstractView *view, const QString &identifier,
|
||||
const QList<QmlDesigner::ModelNode> &nodeList, const QList<QVariant> &data) override;
|
||||
void removeUnusedEffectImports();
|
||||
|
||||
QPointer<EffectComposerWidget> m_widget;
|
||||
QString m_currProjectPath;
|
||||
|
Reference in New Issue
Block a user