diff options
author | Jochen Becher <jochen_becher@gmx.de> | 2016-06-24 18:53:54 +0200 |
---|---|---|
committer | Jochen Becher <jochen_becher@gmx.de> | 2016-06-27 09:41:34 +0000 |
commit | 4b01c6eb69d919da6bb4b9afa4bc63d2aa773714 (patch) | |
tree | bd32457fb84975e787813b31dc5cb1dd1d26cf8b /src/plugins/modeleditor/modeleditor.cpp | |
parent | 3e776dde5ebd49db6a0e772b09d931f0333a00ae (diff) | |
download | qt-creator-4b01c6eb69d919da6bb4b9afa4bc63d2aa773714.tar.gz |
ModelEditor: Synchronize browser and diagram selection
Change-Id: Idfbf2db98123e00bc3cef13869a0535a35e41f42
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/plugins/modeleditor/modeleditor.cpp')
-rw-r--r-- | src/plugins/modeleditor/modeleditor.cpp | 134 |
1 files changed, 126 insertions, 8 deletions
diff --git a/src/plugins/modeleditor/modeleditor.cpp b/src/plugins/modeleditor/modeleditor.cpp index f1dce77a72..f0fd3de9e8 100644 --- a/src/plugins/modeleditor/modeleditor.cpp +++ b/src/plugins/modeleditor/modeleditor.cpp @@ -94,6 +94,7 @@ #include <QToolBox> #include <QUndoStack> #include <QVBoxLayout> +#include <QMenu> #include <algorithm> @@ -127,6 +128,9 @@ public: QComboBox *diagramSelector = 0; SelectedArea selectedArea = SelectedArea::Nothing; QString lastExportDirPath; + QAction *syncBrowserWithDiagramAction = 0; + QAction *syncDiagramWithBrowserAction = 0; + QAction *syncEachOtherAction = 0; }; ModelEditor::ModelEditor(UiController *uiController, ActionHandler *actionHandler, QWidget *parent) @@ -168,9 +172,21 @@ bool ModelEditor::restoreState(const QByteArray &state) QDataStream stream(state); int version = 0; stream >> version; - if (version == 1) { + if (version >= 1) { qmt::Uid uid; stream >> uid; + if (version >= 2) { + bool sync = false; + bool syncBrowserWithDiagram = false; + bool syncDiagramWithBrowser = false; + bool syncEachOther = false; + stream >> sync >> syncBrowserWithDiagram >> syncDiagramWithBrowser >> syncEachOther; + d->actionHandler->synchronizeBrowserAction()->setChecked(sync); + d->syncBrowserWithDiagramAction->setChecked( + syncBrowserWithDiagram || (!syncDiagramWithBrowser && !syncEachOther)); + d->syncDiagramWithBrowserAction->setChecked(syncDiagramWithBrowser); + d->syncEachOtherAction->setChecked(syncEachOther); + } if (uid.isValid()) { qmt::MDiagram *diagram = d->document->documentController()->modelController()->findObject<qmt::MDiagram>(uid); if (diagram) { @@ -320,6 +336,23 @@ void ModelEditor::init(QWidget *parent) QIcon(QStringLiteral(":/modelinglib/48x48/canvas-diagram.png")), tr("Add Canvas Diagram"), d->toolbar)); toolbarLayout->addSpacing(20); + + auto syncToggleButton = new Core::CommandButton(Constants::ACTION_SYNC_BROWSER, d->toolbar); + syncToggleButton->setDefaultAction(d->actionHandler->synchronizeBrowserAction()); + QMenu *syncMenu = new QMenu(syncToggleButton); + QActionGroup *syncGroup = new QActionGroup(syncMenu); + d->syncBrowserWithDiagramAction = syncMenu->addAction(QStringLiteral("Synchronize Browser with Diagram")); + d->syncBrowserWithDiagramAction->setCheckable(true); + d->syncBrowserWithDiagramAction->setActionGroup(syncGroup); + d->syncDiagramWithBrowserAction = syncMenu->addAction(QStringLiteral("Synchronize Diagram with Browser")); + d->syncDiagramWithBrowserAction->setCheckable(true); + d->syncDiagramWithBrowserAction->setActionGroup(syncGroup); + d->syncEachOtherAction = syncMenu->addAction(QStringLiteral("Synchronize Each Other")); + d->syncEachOtherAction->setCheckable(true); + d->syncEachOtherAction->setActionGroup(syncGroup); + syncToggleButton->setMenu(syncMenu); + d->syncBrowserWithDiagramAction->setChecked(true); + toolbarLayout->addWidget(syncToggleButton); } void ModelEditor::initDocument() @@ -745,13 +778,17 @@ void ModelEditor::expandModelTreeToDepth(int depth) d->modelTreeView->expandToDepth(depth); } -QWidget *ModelEditor::createToolbarCommandButton(const Core::Id &id, const std::function<void()> &slot, - const QIcon &icon, const QString &toolTipBase, - QWidget *parent) +QToolButton *ModelEditor::createToolbarCommandButton(const Core::Id &id, const std::function<void()> &slot, + const QIcon &icon, const QString &toolTipBase, + QWidget *parent) { auto button = new Core::CommandButton(id, parent); - button->setIcon(icon); - button->setToolTipBase(toolTipBase); + auto action = new QAction(button); + action->setIcon(icon); + action->setToolTip(toolTipBase); + button->setDefaultAction(action); + //button->setIcon(icon); + //button->setToolTipBase(toolTipBase); connect(button, &Core::CommandButton::clicked, this, slot); return button; } @@ -854,6 +891,7 @@ void ModelEditor::onTreeViewSelectionChanged(const QItemSelection &selected, Q_UNUSED(selected); Q_UNUSED(deselected); + synchronizeDiagramWithBrowser(); updateSelectedArea(SelectedArea::TreeView); } @@ -911,8 +949,10 @@ void ModelEditor::onNewElementCreated(qmt::DElement *element, qmt::MDiagram *dia void ModelEditor::onDiagramSelectionChanged(const qmt::MDiagram *diagram) { - if (diagram == currentDiagram()) + if (diagram == currentDiagram()) { + synchronizeBrowserWithDiagram(diagram); updateSelectedArea(SelectedArea::Diagram); + } } void ModelEditor::onDiagramModified(const qmt::MDiagram *diagram) @@ -1258,11 +1298,15 @@ QByteArray ModelEditor::saveState(const qmt::MDiagram *diagram) const { QByteArray state; QDataStream stream(&state, QIODevice::WriteOnly); - stream << 1; // version number + stream << 2; // version number if (diagram) stream << diagram->uid(); else stream << qmt::Uid::invalidUid(); + stream << d->actionHandler->synchronizeBrowserAction()->isChecked() + << d->syncBrowserWithDiagramAction->isChecked() + << d->syncDiagramWithBrowserAction->isChecked() + << d->syncEachOtherAction->isChecked(); return state; } @@ -1287,5 +1331,79 @@ void ModelEditor::onEditSelectedElement() } } +bool ModelEditor::isSyncBrowserWithDiagram() const +{ + return d->actionHandler->synchronizeBrowserAction()->isChecked() + && (d->syncBrowserWithDiagramAction->isChecked() || d->syncEachOtherAction->isChecked()); +} + +bool ModelEditor::isSyncDiagramWithBrowser() const +{ + return d->actionHandler->synchronizeBrowserAction()->isChecked() + && (d->syncDiagramWithBrowserAction->isChecked() || d->syncEachOtherAction->isChecked()); +} + +void ModelEditor::synchronizeDiagramWithBrowser() +{ + if (isSyncDiagramWithBrowser()) { + if (currentDiagram()) { + bool done = false; + qmt::DocumentController *documentController = d->document->documentController(); + QModelIndexList indexes = d->modelTreeView->selectedSourceModelIndexes(); + if (!indexes.isEmpty()) { + foreach (const QModelIndex &index, indexes) { + if (index.isValid()) { + qmt::MElement *modelElement = documentController->treeModel()->element(index); + if (modelElement) { + foreach (qmt::DElement *diagramElement, currentDiagram()->diagramElements()) { + if (diagramElement->modelUid() == modelElement->uid()) { + // disconnect temporarily avoiding double update of properties Ui + disconnect(documentController->diagramsManager(), &qmt::DiagramsManager::diagramSelectionChanged, + this, &ModelEditor::onDiagramSelectionChanged); + d->diagramView->diagramSceneModel()->selectElement(diagramElement); + connect(documentController->diagramsManager(), &qmt::DiagramsManager::diagramSelectionChanged, + this, &ModelEditor::onDiagramSelectionChanged, Qt::QueuedConnection); + done = true; + break; + } + } + if (done) + break; + } + } + } + } + } + } +} + +void ModelEditor::synchronizeBrowserWithDiagram(const qmt::MDiagram *diagram) +{ + if (isSyncBrowserWithDiagram()) { + qmt::DocumentController *documentController = d->document->documentController(); + qmt::DSelection selection = documentController->diagramsManager()->diagramSceneModel(diagram)->selectedElements(); + if (!selection.isEmpty()) { + foreach (qmt::DSelection::Index index, selection.indices()) { + qmt::DElement *diagramElement = documentController->diagramController()->findElement(index.elementKey(), diagram); + if (diagramElement) { + qmt::MElement *modelElement = documentController->modelController()->findElement(diagramElement->modelUid()); + if (modelElement) { + QModelIndex index = d->modelTreeViewServant->treeModel()->indexOf(modelElement); + if (index.isValid()) { + // disconnect temporarily avoiding double update of properties Ui + disconnect(d->modelTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, + this, &ModelEditor::onTreeViewSelectionChanged); + d->modelTreeView->selectFromSourceModelIndex(index); + connect(d->modelTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, + this, &ModelEditor::onTreeViewSelectionChanged, Qt::QueuedConnection); + break; + } + } + } + } + } + } +} + } // namespace Internal } // namespace ModelEditor |