/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #include "connectionview.h" #include "connectionviewwidget.h" #include "backendmodel.h" #include "bindingmodel.h" #include "connectionmodel.h" #include "dynamicpropertiesmodel.h" #include #include #include #include #include #include #include #include namespace QmlDesigner { namespace Internal { ConnectionView::ConnectionView(QObject *parent) : AbstractView(parent), m_connectionViewWidget(new ConnectionViewWidget()), m_connectionModel(new ConnectionModel(this)), m_bindingModel(new BindingModel(this)), m_dynamicPropertiesModel(new DynamicPropertiesModel(this)), m_backendModel(new BackendModel(this)) { connectionViewWidget()->setBindingModel(m_bindingModel); connectionViewWidget()->setConnectionModel(m_connectionModel); connectionViewWidget()->setDynamicPropertiesModel(m_dynamicPropertiesModel); connectionViewWidget()->setBackendModel(m_backendModel); } ConnectionView::~ConnectionView() = default; void ConnectionView::modelAttached(Model *model) { AbstractView::modelAttached(model); bindingModel()->selectionChanged(QList()); dynamicPropertiesModel()->selectionChanged(QList()); connectionModel()->resetModel(); connectionViewWidget()->resetItemViews(); backendModel()->resetModel(); } void ConnectionView::modelAboutToBeDetached(Model *model) { AbstractView::modelAboutToBeDetached(model); bindingModel()->selectionChanged(QList()); dynamicPropertiesModel()->selectionChanged(QList()); connectionModel()->resetModel(); connectionViewWidget()->resetItemViews(); } void ConnectionView::nodeCreated(const ModelNode & /*createdNode*/) { //bindings connectionModel()->resetModel(); } void ConnectionView::nodeRemoved(const ModelNode & /*removedNode*/, const NodeAbstractProperty & /*parentProperty*/, AbstractView::PropertyChangeFlags /*propertyChange*/) { connectionModel()->resetModel(); } void ConnectionView::nodeReparented(const ModelNode & /*node*/, const NodeAbstractProperty & /*newPropertyParent*/, const NodeAbstractProperty & /*oldPropertyParent*/, AbstractView::PropertyChangeFlags /*propertyChange*/) { connectionModel()->resetModel(); } void ConnectionView::nodeIdChanged(const ModelNode & /*node*/, const QString & /*newId*/, const QString & /*oldId*/) { connectionModel()->resetModel(); bindingModel()->resetModel(); dynamicPropertiesModel()->resetModel(); } void ConnectionView::propertiesRemoved(const QList &propertyList) { for (const AbstractProperty &property : propertyList) { if (property.isDefaultProperty()) connectionModel()->resetModel(); } } void ConnectionView::propertiesAboutToBeRemoved(const QList &propertyList) { for (const AbstractProperty &property : propertyList) { if (property.isBindingProperty()) { bindingModel()->bindingRemoved(property.toBindingProperty()); dynamicPropertiesModel()->bindingRemoved(property.toBindingProperty()); } else if (property.isVariantProperty()) { //### dynamicPropertiesModel->bindingRemoved(property.toVariantProperty()); } else if (property.isSignalHandlerProperty()) { connectionModel()->removeRowFromTable(property.toSignalHandlerProperty()); } } } void ConnectionView::variantPropertiesChanged(const QList &propertyList, AbstractView::PropertyChangeFlags /*propertyChange*/) { for (const VariantProperty &variantProperty : propertyList) { if (variantProperty.isDynamic()) dynamicPropertiesModel()->variantPropertyChanged(variantProperty); if (variantProperty.isDynamic() && variantProperty.parentModelNode().isRootNode()) backendModel()->resetModel(); connectionModel()->variantPropertyChanged(variantProperty); } } void ConnectionView::bindingPropertiesChanged(const QList &propertyList, AbstractView::PropertyChangeFlags /*propertyChange*/) { for (const BindingProperty &bindingProperty : propertyList) { bindingModel()->bindingChanged(bindingProperty); if (bindingProperty.isDynamic()) dynamicPropertiesModel()->bindingPropertyChanged(bindingProperty); if (bindingProperty.isDynamic() && bindingProperty.parentModelNode().isRootNode()) backendModel()->resetModel(); connectionModel()->bindingPropertyChanged(bindingProperty); } } void ConnectionView::signalHandlerPropertiesChanged(const QVector &propertyList, AbstractView::PropertyChangeFlags /*propertyChange*/) { for (const SignalHandlerProperty &signalHandlerProperty : propertyList) connectionModel()->abstractPropertyChanged(signalHandlerProperty); } void ConnectionView::selectedNodesChanged(const QList & selectedNodeList, const QList & /*lastSelectedNodeList*/) { bindingModel()->selectionChanged(selectedNodeList); dynamicPropertiesModel()->selectionChanged(selectedNodeList); connectionViewWidget()->bindingTableViewSelectionChanged(QModelIndex(), QModelIndex()); connectionViewWidget()->dynamicPropertiesTableViewSelectionChanged(QModelIndex(), QModelIndex()); if (connectionViewWidget()->currentTab() == ConnectionViewWidget::BindingTab || connectionViewWidget()->currentTab() == ConnectionViewWidget::DynamicPropertiesTab) emit connectionViewWidget()->setEnabledAddButton(selectedNodeList.count() == 1); } void ConnectionView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) { Q_UNUSED(node) // Check if the auxiliary data is actually the locked property or if it is unlocked if (name != QmlDesigner::lockedProperty || !data.toBool()) return; QItemSelectionModel *selectionModel = connectionTableView()->selectionModel(); if (!selectionModel->hasSelection()) return; QModelIndex modelIndex = selectionModel->currentIndex(); if (!modelIndex.isValid() || !model()) return; const int internalId = connectionModel()->data(connectionModel()->index(modelIndex.row(), ConnectionModel::TargetModelNodeRow), ConnectionModel::UserRoles::InternalIdRole).toInt(); ModelNode modelNode = modelNodeForInternalId(internalId); if (modelNode.isValid() && ModelNode::isThisOrAncestorLocked(modelNode)) selectionModel->clearSelection(); } void ConnectionView::importsChanged(const QList & /*addedImports*/, const QList & /*removedImports*/) { backendModel()->resetModel(); } WidgetInfo ConnectionView::widgetInfo() { return createWidgetInfo(m_connectionViewWidget.data(), QLatin1String("ConnectionView"), WidgetInfo::LeftPane, 0, tr("Connections")); } bool ConnectionView::hasWidget() const { return true; } bool ConnectionView::isWidgetEnabled() { return widgetInfo().widget->isEnabled(); } QTableView *ConnectionView::connectionTableView() const { return connectionViewWidget()->connectionTableView(); } QTableView *ConnectionView::bindingTableView() const { return connectionViewWidget()->bindingTableView(); } QTableView *ConnectionView::dynamicPropertiesTableView() const { return connectionViewWidget()->dynamicPropertiesTableView(); } QTableView *ConnectionView::backendView() const { return connectionViewWidget()->backendView(); } ConnectionViewWidget *ConnectionView::connectionViewWidget() const { return m_connectionViewWidget.data(); } ConnectionModel *ConnectionView::connectionModel() const { return m_connectionModel; } BindingModel *ConnectionView::bindingModel() const { return m_bindingModel; } DynamicPropertiesModel *ConnectionView::dynamicPropertiesModel() const { return m_dynamicPropertiesModel; } BackendModel *ConnectionView::backendModel() const { return m_backendModel; } ConnectionView *ConnectionView::instance() { static ConnectionView *s_instance = nullptr; if (s_instance) return s_instance; const auto views = QmlDesignerPlugin::instance()->viewManager().views(); for (auto *view : views) { ConnectionView *myView = qobject_cast(view); if (myView) s_instance = myView; } QTC_ASSERT(s_instance, return nullptr); return s_instance; } } // namesapce Internal } // namespace QmlDesigner