diff options
author | Jochen Becher <jochen_becher@gmx.de> | 2018-01-07 20:31:02 +0100 |
---|---|---|
committer | Jochen Becher <jochen_becher@gmx.de> | 2018-01-10 15:39:45 +0000 |
commit | 4d99f47974a5afaecffba354a58fe897ffb9f9c3 (patch) | |
tree | 370c333d92e362fad88f8688059a057ce391d969 /src/libs/modelinglib | |
parent | bcc550a4e25121c836ce5f6c83a80bcfa9973548 (diff) |
ModelEditor: Implement shared clipboard between all open model-editors
Change-Id: Id2eb6f78f8aa1a698a49d35db6cfceab14a38e0b
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/libs/modelinglib')
6 files changed, 52 insertions, 55 deletions
diff --git a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp index a794de55a76..00688013593 100644 --- a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp +++ b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp @@ -487,7 +487,7 @@ DContainer DiagramController::copyElements(const DSelection &diagramSelection, c return copiedElements; } -void DiagramController::pasteElements(const DContainer &diagramContainer, MDiagram *diagram) +void DiagramController::pasteElements(const DReferences &diagramContainer, MDiagram *diagram) { QMT_ASSERT(diagram, return); diff --git a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h index aa09636e5e3..e84cec69209 100644 --- a/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h +++ b/src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h @@ -120,7 +120,7 @@ public: DContainer cutElements(const DSelection &diagramSelection, MDiagram *diagram); DContainer copyElements(const DSelection &diagramSelection, const MDiagram *diagram); - void pasteElements(const DContainer &diagramContainer, MDiagram *diagram); + void pasteElements(const DReferences &diagramContainer, MDiagram *diagram); void deleteElements(const DSelection &diagramSelection, MDiagram *diagram); private: diff --git a/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp b/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp index 009e16d2d15..19db9ed5194 100644 --- a/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp +++ b/src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp @@ -35,7 +35,6 @@ #include "qmt/diagram_ui/diagramsmanager.h" #include "qmt/diagram_ui/sceneinspector.h" #include "qmt/model_controller/mcontainer.h" -#include "qmt/model_controller/modelcontroller.h" #include "qmt/model_controller/mselection.h" #include "qmt/model/mcanvasdiagram.h" #include "qmt/model/mclass.h" @@ -70,9 +69,7 @@ DocumentController::DocumentController(QObject *parent) : m_treeModel(new TreeModel(this)), m_sortedTreeModel(new SortedTreeModel(this)), m_diagramsManager(new DiagramsManager(this)), - m_sceneInspector(new SceneInspector(this)), - m_modelClipboard(new MContainer()), - m_diagramClipboard(new DContainer()) + m_sceneInspector(new SceneInspector(this)) { // project controller connect(m_projectController, &ProjectController::changed, this, &DocumentController::changed); @@ -135,44 +132,30 @@ DocumentController::~DocumentController() delete m_projectController; } -bool DocumentController::isModelClipboardEmpty() const -{ - return m_modelClipboard->isEmpty(); -} - -bool DocumentController::isDiagramClipboardEmpty() const -{ - return m_diagramClipboard->isEmpty(); -} - bool DocumentController::hasDiagramSelection(const MDiagram *diagram) const { return m_diagramsManager->diagramSceneModel(diagram)->hasSelection(); } -void DocumentController::cutFromModel(const MSelection &selection) +MContainer DocumentController::cutFromModel(const MSelection &selection) { - *m_modelClipboard = m_modelController->cutElements(selection); - emit modelClipboardChanged(isModelClipboardEmpty()); + return m_modelController->cutElements(selection); } -void DocumentController::cutFromDiagram(MDiagram *diagram) +DContainer DocumentController::cutFromDiagram(MDiagram *diagram) { - *m_diagramClipboard = m_diagramController->cutElements(m_diagramsManager->diagramSceneModel(diagram)->selectedElements(), diagram); - emit diagramClipboardChanged(isDiagramClipboardEmpty()); + return m_diagramController->cutElements(m_diagramsManager->diagramSceneModel(diagram)->selectedElements(), diagram); } -void DocumentController::copyFromModel(const MSelection &selection) +MContainer DocumentController::copyFromModel(const MSelection &selection) { - *m_modelClipboard = m_modelController->copyElements(selection); - emit modelClipboardChanged(isModelClipboardEmpty()); + return m_modelController->copyElements(selection); } -void DocumentController::copyFromDiagram(const qmt::MDiagram *diagram) +DContainer DocumentController::copyFromDiagram(const qmt::MDiagram *diagram) { m_diagramsManager->diagramSceneModel(diagram)->copyToClipboard(); - *m_diagramClipboard = m_diagramController->copyElements(m_diagramsManager->diagramSceneModel(diagram)->selectedElements(), diagram); - emit diagramClipboardChanged(isDiagramClipboardEmpty()); + return m_diagramController->copyElements(m_diagramsManager->diagramSceneModel(diagram)->selectedElements(), diagram); } void DocumentController::copyDiagram(const MDiagram *diagram) @@ -180,15 +163,15 @@ void DocumentController::copyDiagram(const MDiagram *diagram) m_diagramsManager->diagramSceneModel(diagram)->copyToClipboard(); } -void DocumentController::pasteIntoModel(MObject *modelObject) +void DocumentController::pasteIntoModel(MObject *modelObject, const MReferences &container, ModelController::PasteOption option) { if (modelObject) - m_modelController->pasteElements(modelObject, *m_modelClipboard); + m_modelController->pasteElements(modelObject, container, option); } -void DocumentController::pasteIntoDiagram(MDiagram *diagram) +void DocumentController::pasteIntoDiagram(MDiagram *diagram, const DReferences &container) { - m_diagramController->pasteElements(*m_diagramClipboard, diagram); + m_diagramController->pasteElements(container, diagram); } void DocumentController::deleteFromModel(const MSelection &selection) diff --git a/src/libs/modelinglib/qmt/document_controller/documentcontroller.h b/src/libs/modelinglib/qmt/document_controller/documentcontroller.h index 6b4eea96760..e6e0f9dca6b 100644 --- a/src/libs/modelinglib/qmt/document_controller/documentcontroller.h +++ b/src/libs/modelinglib/qmt/document_controller/documentcontroller.h @@ -27,12 +27,12 @@ #include <QObject> #include "qmt/infrastructure/qmt_global.h" +#include "qmt/model_controller/modelcontroller.h" namespace qmt { class ProjectController; class UndoController; -class ModelController; class DiagramController; class DiagramSceneController; class StyleController; @@ -49,6 +49,7 @@ class MDiagram; class MCanvasDiagram; class MContainer; class DContainer; +class DReferences; class MSelection; class MObject; @@ -61,8 +62,6 @@ public: signals: void changed(); - void modelClipboardChanged(bool isEmpty); - void diagramClipboardChanged(bool isEmpty); public: ProjectController *projectController() const { return m_projectController; } @@ -78,17 +77,15 @@ public: DiagramsManager *diagramsManager() const { return m_diagramsManager; } SceneInspector *sceneInspector() const { return m_sceneInspector; } - bool isModelClipboardEmpty() const; - bool isDiagramClipboardEmpty() const; bool hasDiagramSelection(const qmt::MDiagram *diagram) const; - void cutFromModel(const MSelection &selection); - void cutFromDiagram(MDiagram *diagram); - void copyFromModel(const MSelection &selection); - void copyFromDiagram(const MDiagram *diagram); + MContainer cutFromModel(const MSelection &selection); + DContainer cutFromDiagram(MDiagram *diagram); + MContainer copyFromModel(const MSelection &selection); + DContainer copyFromDiagram(const MDiagram *diagram); void copyDiagram(const MDiagram *diagram); - void pasteIntoModel(MObject *modelObject); - void pasteIntoDiagram(MDiagram *diagram); + void pasteIntoModel(MObject *modelObject, const MReferences &container, ModelController::PasteOption option); + void pasteIntoDiagram(MDiagram *diagram, const DReferences &container); void deleteFromModel(const MSelection &selection); void deleteFromDiagram(MDiagram *diagram); void removeFromDiagram(MDiagram *diagram); @@ -118,8 +115,6 @@ private: SortedTreeModel *m_sortedTreeModel = nullptr; DiagramsManager *m_diagramsManager = nullptr; SceneInspector *m_sceneInspector = nullptr; - QScopedPointer<MContainer> m_modelClipboard; - QScopedPointer<DContainer> m_diagramClipboard; }; } // namespace qmt diff --git a/src/libs/modelinglib/qmt/model_controller/modelcontroller.cpp b/src/libs/modelinglib/qmt/model_controller/modelcontroller.cpp index fc3072da27f..ff74d61ff33 100644 --- a/src/libs/modelinglib/qmt/model_controller/modelcontroller.cpp +++ b/src/libs/modelinglib/qmt/model_controller/modelcontroller.cpp @@ -604,16 +604,24 @@ void ModelController::setUndoController(UndoController *undoController) m_undoController = undoController; } +Uid ModelController::ownerKey(const Uid &key) const +{ + MElement *element = findElement(key); + if (!element) + return Uid::invalidUid(); + return ownerKey(element); +} + Uid ModelController::ownerKey(const MElement *element) const { QMT_ASSERT(element, return Uid()); MObject *owner = element->owner(); if (!owner) - return Uid(); + return Uid::invalidUid(); return owner->uid(); } -MElement *ModelController::findElement(const Uid &key) +MElement *ModelController::findElement(const Uid &key) const { if (MObject *object = findObject(key)) return object; @@ -915,17 +923,20 @@ MContainer ModelController::copyElements(const MSelection &modelSelection) return copiedElements; } -void ModelController::pasteElements(MObject *owner, const MContainer &modelContainer) +void ModelController::pasteElements(MObject *owner, const MReferences &modelContainer, PasteOption option) { // clone all elements and renew their keys QHash<Uid, Uid> renewedKeys; QList<MElement *> clonedElements; foreach (MElement *element, modelContainer.elements()) { - MCloneDeepVisitor visitor; - element->accept(&visitor); - MElement *clonedElement = visitor.cloned(); - renewElementKey(clonedElement, &renewedKeys); - clonedElements.append(clonedElement); + if (option == PasteAlwaysWithNewKeys || option == PasteAlwaysAndKeepKeys || !findElement(element->uid())) { + MCloneDeepVisitor visitor; + element->accept(&visitor); + MElement *clonedElement = visitor.cloned(); + if (option == PasteAlwaysWithNewKeys || (option == PasteAlwaysAndKeepKeys && findElement(element->uid()))) + renewElementKey(clonedElement, &renewedKeys); + clonedElements.append(clonedElement); + } } // fix all keys referencing between pasting elements foreach (MElement *clonedElement, clonedElements) diff --git a/src/libs/modelinglib/qmt/model_controller/modelcontroller.h b/src/libs/modelinglib/qmt/model_controller/modelcontroller.h index 345d5c0ce98..5b95d2a575b 100644 --- a/src/libs/modelinglib/qmt/model_controller/modelcontroller.h +++ b/src/libs/modelinglib/qmt/model_controller/modelcontroller.h @@ -61,6 +61,13 @@ class QMT_EXPORT ModelController : public QObject class MoveRelationCommand; public: + + enum PasteOption { + PasteAlwaysWithNewKeys, + PasteAlwaysAndKeepKeys, + PasteOnlyNewElements + }; + explicit ModelController(QObject *parent = nullptr); ~ModelController() override; @@ -93,8 +100,9 @@ public: UndoController *undoController() const { return m_undoController; } void setUndoController(UndoController *undoController); + Uid ownerKey(const Uid &key) const; Uid ownerKey(const MElement *element) const; - MElement *findElement(const Uid &key); + MElement *findElement(const Uid &key) const; template<class T> T *findElement(const Uid &key) { return dynamic_cast<T *>(findElement(key)); } @@ -124,7 +132,7 @@ public: MContainer cutElements(const MSelection &modelSelection); MContainer copyElements(const MSelection &modelSelection); - void pasteElements(MObject *owner, const MContainer &modelContainer); + void pasteElements(MObject *owner, const MReferences &modelContainer, PasteOption option); void deleteElements(const MSelection &modelSelection); private: |