aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksei German <aleksei.german@qt.io>2022-09-27 18:18:37 +0200
committerAleksei German <aleksei.german@qt.io>2022-10-21 11:50:43 +0000
commitc897eacf4975b846c4a520ea5607b86553bdbdb9 (patch)
tree698521344be286046ce7916c70c92074a4889506
parentacfd71831cdea3f9177ee86ed1b5f7f9c7e2aa29 (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>
-rw-r--r--src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp33
-rw-r--r--src/plugins/qmldesigner/components/bindingeditor/actioneditor.h3
-rw-r--r--src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp16
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);