diff options
author | Aleksei German <aleksei.german@qt.io> | 2022-09-27 18:18:37 +0200 |
---|---|---|
committer | Aleksei German <aleksei.german@qt.io> | 2022-10-21 11:50:43 +0000 |
commit | c897eacf4975b846c4a520ea5607b86553bdbdb9 (patch) | |
tree | 698521344be286046ce7916c70c92074a4889506 | |
parent | acfd71831cdea3f9177ee86ed1b5f7f9c7e2aa29 (diff) |
QmlDesigner: Improve connection editor stability
Task-number: QDS-8039
Change-Id: Ie200eb080b82558925582a7720e40fc39e93ec63
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
3 files changed, 34 insertions, 18 deletions
diff --git a/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp b/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp index 60f703bdf9..1779db6df5 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp @@ -305,7 +305,8 @@ void ActionEditor::updateWindowName(const QString &targetName) } void ActionEditor::invokeEditor(SignalHandlerProperty signalHandler, - std::function<void(SignalHandlerProperty)> onReject, + std::function<void(SignalHandlerProperty)> removeSignalFunction, + bool removeOnReject, QObject * parent) { if (!signalHandler.isValid()) @@ -336,15 +337,23 @@ void ActionEditor::invokeEditor(SignalHandlerProperty signalHandler, if (!editor) return; if (editor->m_modelNode.isValid()) { - editor->m_modelNode.view()->executeInTransaction("ActionEditor::" - "invokeEditorAccepted", - [=]() { - editor->m_modelNode - .signalHandlerProperty( - signalHandler.name()) - .setSource( - editor->connectionValue()); - }); + editor->m_modelNode.view() + ->executeInTransaction("ActionEditor::" + "invokeEditorAccepted", + [=]() { + if (!editor) + return; + + const QString newSource = editor->connectionValue(); + if ((newSource.isNull() || newSource.trimmed().isEmpty()) + && removeSignalFunction) { + removeSignalFunction(signalHandler); + } else { + editor->m_modelNode + .signalHandlerProperty(signalHandler.name()) + .setSource(newSource); + } + }); } //closing editor widget somewhy triggers rejected() signal. Lets disconect before it affects us: @@ -356,10 +365,10 @@ void ActionEditor::invokeEditor(SignalHandlerProperty signalHandler, if (!editor) return; - if (onReject) { + if (removeOnReject && removeSignalFunction) { editor->m_modelNode.view()->executeInTransaction("ActionEditor::" "invokeEditorOnRejectFunc", - [=]() { onReject(signalHandler); }); + [=]() { removeSignalFunction(signalHandler); }); } //closing editor widget somewhy triggers rejected() signal 2nd time. Lets disconect before it affects us: diff --git a/src/plugins/qmldesigner/components/bindingeditor/actioneditor.h b/src/plugins/qmldesigner/components/bindingeditor/actioneditor.h index 1a9e2c8754..4e481681a1 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/actioneditor.h +++ b/src/plugins/qmldesigner/components/bindingeditor/actioneditor.h @@ -68,7 +68,8 @@ public: Q_INVOKABLE void updateWindowName(const QString &targetName = {}); static void invokeEditor(SignalHandlerProperty signalHandler, - std::function<void(SignalHandlerProperty)> onReject = nullptr, + std::function<void(SignalHandlerProperty)> removeSignalFunction = nullptr, + bool removeOnReject = false, QObject *parent = nullptr); signals: diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 0edb548770..02dc868a31 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -568,6 +568,8 @@ ModelNode createNewConnection(ModelNode targetNode) void removeSignal(SignalHandlerProperty signalHandler) { + if (!signalHandler.isValid()) + return; auto connectionNode = signalHandler.parentModelNode(); auto connectionSignals = connectionNode.signalProperties(); if (connectionSignals.size() > 1) { @@ -681,10 +683,14 @@ public: QString( QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Open Connections Editor")), [=](const SelectionContext &) { - signalHandler.parentModelNode().view()->executeInTransaction( - "ConnectionsModelNodeActionGroup::" - "openConnectionsEditor", - [signalHandler]() { ActionEditor::invokeEditor(signalHandler); }); + signalHandler.parentModelNode() + .view() + ->executeInTransaction("ConnectionsModelNodeActionGroup::" + "openConnectionsEditor", + [signalHandler]() { + ActionEditor::invokeEditor(signalHandler, + removeSignal); + }); }); activeSignalHandlerGroup->addAction(openEditorAction); @@ -747,7 +753,7 @@ public: newHandler.setSource( QString("console.log(\"%1.%2\")").arg(currentNode.id(), signalStr)); - ActionEditor::invokeEditor(newHandler, removeSignal); + ActionEditor::invokeEditor(newHandler, removeSignal, true); }); }); newSignal->addAction(openEditorAction); |