aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib
diff options
context:
space:
mode:
authorJochen Becher <jochen_becher@gmx.de>2018-01-07 20:31:02 +0100
committerJochen Becher <jochen_becher@gmx.de>2018-01-10 15:39:45 +0000
commit4d99f47974a5afaecffba354a58fe897ffb9f9c3 (patch)
tree370c333d92e362fad88f8688059a057ce391d969 /src/libs/modelinglib
parentbcc550a4e25121c836ce5f6c83a80bcfa9973548 (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')
-rw-r--r--src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.cpp2
-rw-r--r--src/libs/modelinglib/qmt/diagram_controller/diagramcontroller.h2
-rw-r--r--src/libs/modelinglib/qmt/document_controller/documentcontroller.cpp43
-rw-r--r--src/libs/modelinglib/qmt/document_controller/documentcontroller.h21
-rw-r--r--src/libs/modelinglib/qmt/model_controller/modelcontroller.cpp27
-rw-r--r--src/libs/modelinglib/qmt/model_controller/modelcontroller.h12
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: