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 <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
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user