From e7ed85aaca660e1a4dc5ec348b0b1cc0f47ee949 Mon Sep 17 00:00:00 2001 From: Jochen Becher Date: Wed, 16 Dec 2015 21:28:30 +0100 Subject: [PATCH] ModelEditor: Copy selected elements to clipboard On Copy (Ctrl+C) the selected elements on a diagram are copied as an image into the clipboard. If no element is selected all elements are copied (as it was before). Change-Id: Ia24e1cae44ea3cc7303198fe7bfd3174c7a970cc Reviewed-by: Tobias Hunger --- .../qmt/diagram_scene/diagramscenemodel.cpp | 34 ++++++++++++++++++- .../documentcontroller.cpp | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/libs/3rdparty/modeling/qmt/diagram_scene/diagramscenemodel.cpp b/src/libs/3rdparty/modeling/qmt/diagram_scene/diagramscenemodel.cpp index 70dfef5fff6..fe10809a374 100644 --- a/src/libs/3rdparty/modeling/qmt/diagram_scene/diagramscenemodel.cpp +++ b/src/libs/3rdparty/modeling/qmt/diagram_scene/diagramscenemodel.cpp @@ -300,11 +300,25 @@ void DiagramSceneModel::copyToClipboard() { auto mimeData = new QMimeData(); + QSet selectedItems = m_selectedItems; + QSet secondarySelectedItems = m_secondarySelectedItems; + QGraphicsItem *focusItem = m_focusItem; // Selections would also render to the clipboard m_graphicsScene->clearSelection(); removeExtraSceneItems(); - QRectF sceneBoundingRect = m_graphicsScene->itemsBoundingRect(); + bool copyAll = selectedItems.isEmpty() && secondarySelectedItems.isEmpty(); + QRectF sceneBoundingRect; + if (copyAll) { + sceneBoundingRect = m_graphicsScene->itemsBoundingRect(); + } else { + foreach (QGraphicsItem *item, m_graphicsItems) { + if (selectedItems.contains(item) || secondarySelectedItems.contains(item)) + sceneBoundingRect |= item->mapRectToScene(item->boundingRect()); + else + item->hide(); + } + } { // Create the image with the size of the shrunk scene @@ -384,7 +398,25 @@ void DiagramSceneModel::copyToClipboard() QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); + if (!copyAll) { + // TODO once an annotation item had focus the call to show() will give it focus again. Bug in Qt? + foreach (QGraphicsItem *item, m_graphicsItems) + item->show(); + } + addExtraSceneItems(); + + foreach (QGraphicsItem *item, selectedItems) + item->setSelected(true); + + // reset focus item + if (focusItem) { + ISelectable *selectable = dynamic_cast(focusItem); + if (selectable) { + selectable->setFocusSelected(true); + m_focusItem = focusItem; + } + } } bool DiagramSceneModel::exportPng(const QString &fileName) diff --git a/src/libs/3rdparty/modeling/qmt/document_controller/documentcontroller.cpp b/src/libs/3rdparty/modeling/qmt/document_controller/documentcontroller.cpp index 912100e82c8..5e697ad1566 100644 --- a/src/libs/3rdparty/modeling/qmt/document_controller/documentcontroller.cpp +++ b/src/libs/3rdparty/modeling/qmt/document_controller/documentcontroller.cpp @@ -174,6 +174,7 @@ void DocumentController::copyFromModel(const MSelection &selection) void 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()); }