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 <tobias.hunger@theqtcompany.com>
This commit is contained in:
Jochen Becher
2015-12-16 21:28:30 +01:00
parent 6a71c63186
commit e7ed85aaca
2 changed files with 34 additions and 1 deletions

View File

@@ -300,11 +300,25 @@ void DiagramSceneModel::copyToClipboard()
{
auto mimeData = new QMimeData();
QSet<QGraphicsItem *> selectedItems = m_selectedItems;
QSet<QGraphicsItem *> 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<ISelectable *>(focusItem);
if (selectable) {
selectable->setFocusSelected(true);
m_focusItem = focusItem;
}
}
}
bool DiagramSceneModel::exportPng(const QString &fileName)

View File

@@ -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());
}