From ec43ac04812629b2e76f181a3378cdc382d431cd Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Wed, 11 Dec 2019 11:25:13 +0100 Subject: [PATCH] QmlDesigner Connection View signals fixes Bug: QDS-1333 Change-Id: Ic0d4206888bd8c5bd3d5cef29225441f19efa59d Reviewed-by: Christian Stenger Reviewed-by: Thomas Hartmann --- .../components/bindingeditor/actioneditor.cpp | 2 +- .../connectioneditor/connectionmodel.cpp | 23 ++++++++++++++++++- .../connectioneditor/connectionmodel.h | 1 + .../connectioneditor/connectionview.cpp | 7 ++++++ .../connectioneditor/connectionview.h | 1 + .../connectioneditor/connectionviewwidget.cpp | 5 ++-- .../designercore/include/modelnode.h | 1 + .../designercore/model/modelnode.cpp | 10 ++++++++ 8 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp b/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp index e21000a1715..65866ad324a 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/actioneditor.cpp @@ -123,7 +123,7 @@ void ActionEditor::updateWindowName() { if (!m_dialog.isNull()) { - m_dialog->setWindowTitle(tr("Action Editor")); + m_dialog->setWindowTitle(tr("Connection Editor")); m_dialog->raise(); } } diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp index 87de1e5074f..1347c76045b 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.cpp @@ -290,7 +290,28 @@ void ConnectionModel::abstractPropertyChanged(const AbstractProperty &abstractPr void ConnectionModel::deleteConnectionByRow(int currentRow) { - signalHandlerPropertyForRow(currentRow).parentModelNode().destroy(); + SignalHandlerProperty targetSignal = signalHandlerPropertyForRow(currentRow); + QmlDesigner::ModelNode node = targetSignal.parentModelNode(); + QList allSignals = node.signalProperties(); + if (allSignals.size() > 1) { + if (allSignals.contains(targetSignal)) + node.removeProperty(targetSignal.name()); + } + else { + node.destroy(); + } +} + +void ConnectionModel::removeRowFromTable(const SignalHandlerProperty &property) +{ + for (int currentRow = 0; currentRow < rowCount(); currentRow++) { + SignalHandlerProperty targetSignal = signalHandlerPropertyForRow(currentRow); + + if (targetSignal == property) { + removeRow(currentRow); + break; + } + } } void ConnectionModel::handleException() diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.h b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.h index 1ae3aa2a255..b60275f6da0 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.h +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionmodel.h @@ -63,6 +63,7 @@ public: void abstractPropertyChanged(const AbstractProperty &abstractProperty); void deleteConnectionByRow(int currentRow); + void removeRowFromTable(const SignalHandlerProperty &property); protected: void addModelNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp index 08be13d7d54..0410ccf9089 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.cpp @@ -108,6 +108,8 @@ void ConnectionView::propertiesAboutToBeRemoved(const QList & dynamicPropertiesModel()->bindingRemoved(property.toBindingProperty()); } else if (property.isVariantProperty()) { //### dynamicPropertiesModel->bindingRemoved(property.toVariantProperty()); + } else if (property.isSignalHandlerProperty()) { + connectionModel()->removeRowFromTable(property.toSignalHandlerProperty()); } } } @@ -180,6 +182,11 @@ bool ConnectionView::hasWidget() const return true; } +bool ConnectionView::isWidgetEnabled() +{ + return widgetInfo().widget->isEnabled(); +} + QTableView *ConnectionView::connectionTableView() const { return connectionViewWidget()->connectionTableView(); diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionview.h b/src/plugins/qmldesigner/components/connectioneditor/connectionview.h index 09b653072e3..905fa02a587 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionview.h +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionview.h @@ -74,6 +74,7 @@ public: WidgetInfo widgetInfo() override; bool hasWidget() const override; + bool isWidgetEnabled(); QTableView *connectionTableView() const; QTableView *bindingTableView() const; diff --git a/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp b/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp index d0aa6bbbc7a..3777de72910 100644 --- a/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp +++ b/src/plugins/qmldesigner/components/connectioneditor/connectionviewwidget.cpp @@ -63,7 +63,8 @@ ConnectionViewWidget::ConnectionViewWidget(QWidget *parent) : [&]() { if (m_actionEditor->hasModelIndex()) { ConnectionModel *connectionModel = qobject_cast(ui->connectionView->model()); - if (connectionModel->rowCount() > m_actionEditor->modelIndex().row()) + if (connectionModel->connectionView()->isWidgetEnabled() + && (connectionModel->rowCount() > m_actionEditor->modelIndex().row())) { SignalHandlerProperty signalHandler = connectionModel->signalHandlerPropertyForRow(m_actionEditor->modelIndex().row()); @@ -166,7 +167,7 @@ void ConnectionViewWidget::contextMenuEvent(QContextMenuEvent *event) QMenu menu(this); - menu.addAction(tr("Open Action Editor"), [&]() { + menu.addAction(tr("Open Connection Editor"), [&]() { if (index.isValid()) { m_actionEditor->showWidget(mapToGlobal(event->pos()).x(), mapToGlobal(event->pos()).y()); m_actionEditor->setBindingValue(index.data().toString()); diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index 7f943dddd1c..1399e13e2d6 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -133,6 +133,7 @@ public: QList nodeProperties() const; QList nodeListProperties() const; QList bindingProperties() const; + QList signalProperties() const; PropertyNameList propertyNames() const; bool hasProperties() const; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 1fdc29aaa03..ab4bf9cca02 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -644,6 +644,16 @@ QList ModelNode::bindingProperties() const return propertyList; } +QList ModelNode::signalProperties() const +{ + QList propertyList; + + foreach (const AbstractProperty &property, properties()) + if (property.isSignalHandlerProperty()) + propertyList.append(property.toSignalHandlerProperty()); + return propertyList; +} + /*! \brief removes a property from this node \param name name of the property