aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJochen Becher <jochen_becher@gmx.de>2016-02-22 20:59:28 +0100
committerJochen Becher <jochen_becher@gmx.de>2016-02-24 17:22:38 +0000
commitbbba9ccae39ef293a144c7843e49170392362d57 (patch)
tree6f5f70d644168ad09320d96cd7adee47778ff83d
parent537125155df99819f353b532943d34d6ba025440 (diff)
ModelEditor: Export diagram as image, pdf or svg
Change-Id: I19be1de5f0c8414b4d76dbbbb68e71183b7ce08e Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
-rw-r--r--src/libs/modelinglib/modelinglib.pro2
-rw-r--r--src/libs/modelinglib/modelinglib.qbs2
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp48
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h5
-rw-r--r--src/plugins/modeleditor/actionhandler.cpp26
-rw-r--r--src/plugins/modeleditor/actionhandler.h2
-rw-r--r--src/plugins/modeleditor/modeleditor.cpp39
-rw-r--r--src/plugins/modeleditor/modeleditor.h2
-rw-r--r--src/plugins/modeleditor/modeleditor_constants.h2
9 files changed, 119 insertions, 9 deletions
diff --git a/src/libs/modelinglib/modelinglib.pro b/src/libs/modelinglib/modelinglib.pro
index 1cdddf87a5..99357b8731 100644
--- a/src/libs/modelinglib/modelinglib.pro
+++ b/src/libs/modelinglib/modelinglib.pro
@@ -1,6 +1,8 @@
include(../../qtcreatorlibrary.pri)
+QT += svg
+
DEFINES += QMT_LIBRARY
INCLUDEPATH += $$PWD $$PWD/qtserialization/inc
diff --git a/src/libs/modelinglib/modelinglib.qbs b/src/libs/modelinglib/modelinglib.qbs
index 6df6663199..2c52ccd7a1 100644
--- a/src/libs/modelinglib/modelinglib.qbs
+++ b/src/libs/modelinglib/modelinglib.qbs
@@ -9,7 +9,7 @@ QtcLibrary {
"./qtserialization/inc",
])
- Depends { name: "Qt.widgets" }
+ Depends { name: "Qt"; submodules: ["widgets", "svg"] }
Depends { name: "Utils" }
Group {
diff --git a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp
index 18d3a42d1b..ba397652ab 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.cpp
@@ -57,10 +57,9 @@
#include <QBuffer>
#include <QPdfWriter>
+#include <QFile>
-#ifdef USE_SVG_CLIPBOARD
#include <QtSvg/QSvgGenerator>
-#endif
namespace qmt {
@@ -372,6 +371,8 @@ void DiagramSceneModel::copyToClipboard()
#ifdef USE_SVG_CLIPBOARD
{
+ const double border = 5;
+
QBuffer svgBuffer;
QSvgGenerator svgGenerator;
svgGenerator.setOutputDevice(&svgBuffer);
@@ -383,8 +384,8 @@ void DiagramSceneModel::copyToClipboard()
svgPainter.setRenderHint(QPainter::Antialiasing);
m_graphicsScene->render(&svgPainter,
QRectF(border, border,
- painter.device()->width() - 2 * border,
- painter.device()->height() - 2 * border),
+ svgPainter.device()->width() - 2 * border,
+ svgPainter.device()->height() - 2 * border),
sceneBoundingRect);
svgPainter.end();
mimeData->setData(QStringLiteral("image/svg+xml"), svgBuffer.buffer());
@@ -414,8 +415,9 @@ void DiagramSceneModel::copyToClipboard()
}
}
-bool DiagramSceneModel::exportPng(const QString &fileName)
+bool DiagramSceneModel::exportImage(const QString &fileName)
{
+ // TODO support exporting selected elements only
removeExtraSceneItems();
QRectF sceneBoundingRect = m_graphicsScene->itemsBoundingRect();
@@ -450,8 +452,9 @@ bool DiagramSceneModel::exportPng(const QString &fileName)
return success;
}
-void DiagramSceneModel::exportPdf(const QString &fileName)
+bool DiagramSceneModel::exportPdf(const QString &fileName)
{
+ // TODO support exporting selected elements only
removeExtraSceneItems();
QRectF sceneBoundingRect = m_graphicsScene->itemsBoundingRect();
@@ -479,6 +482,39 @@ void DiagramSceneModel::exportPdf(const QString &fileName)
pdfPainter.end();
addExtraSceneItems();
+
+ // TODO how to know that file was successfully created?
+ return true;
+}
+
+bool DiagramSceneModel::exportSvg(const QString &fileName)
+{
+ // TODO support exporting selected elements only
+ removeExtraSceneItems();
+
+ QRectF sceneBoundingRect = m_graphicsScene->itemsBoundingRect();
+
+ const double border = 5;
+
+ QSvgGenerator svgGenerator;
+ svgGenerator.setFileName(fileName);
+ QSize svgSceneSize = sceneBoundingRect.size().toSize();
+ svgGenerator.setSize(svgSceneSize);
+ svgGenerator.setViewBox(QRect(QPoint(0,0), svgSceneSize));
+ QPainter svgPainter;
+ svgPainter.begin(&svgGenerator);
+ svgPainter.setRenderHint(QPainter::Antialiasing);
+ m_graphicsScene->render(&svgPainter,
+ QRectF(border, border,
+ svgPainter.device()->width() - 2 * border,
+ svgPainter.device()->height() - 2 * border),
+ sceneBoundingRect);
+ svgPainter.end();
+
+ addExtraSceneItems();
+
+ // TODO how to know that file was successfully created?
+ return true;
}
void DiagramSceneModel::selectItem(QGraphicsItem *item, bool multiSelect)
diff --git a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h
index 18881e19de..16b6ecdda9 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h
+++ b/src/libs/modelinglib/qmt/diagram_scene/diagramscenemodel.h
@@ -113,8 +113,9 @@ public:
void selectElement(DElement *element);
void editElement(DElement *element);
void copyToClipboard();
- bool exportPng(const QString &fileName);
- void exportPdf(const QString &fileName);
+ bool exportImage(const QString &fileName);
+ bool exportPdf(const QString &fileName);
+ bool exportSvg(const QString &fileName);
void selectItem(QGraphicsItem *item, bool multiSelect);
void moveSelectedItems(QGraphicsItem *grabbedItem, const QPointF &delta);
diff --git a/src/plugins/modeleditor/actionhandler.cpp b/src/plugins/modeleditor/actionhandler.cpp
index 768e6872b6..77895787f2 100644
--- a/src/plugins/modeleditor/actionhandler.cpp
+++ b/src/plugins/modeleditor/actionhandler.cpp
@@ -36,6 +36,7 @@
#include <QAction>
#include <QShortcut>
+#include <QMenu>
namespace ModelEditor {
namespace Internal {
@@ -52,6 +53,7 @@ public:
QAction *deleteAction = 0;
QAction *selectAllAction = 0;
QAction *openParentDiagramAction = 0;
+ QAction *exportDiagramAction = 0;
};
ActionHandler::ActionHandler(const Core::Context &context, QObject *parent)
@@ -111,6 +113,11 @@ QAction *ActionHandler::openParentDiagramAction() const
return d->openParentDiagramAction;
}
+QAction *ActionHandler::exportDiagramAction() const
+{
+ return d->exportDiagramAction;
+}
+
void ActionHandler::createActions()
{
Core::ActionContainer *medit = Core::ActionManager::actionContainer(Core::Constants::M_EDIT);
@@ -131,6 +138,18 @@ void ActionHandler::createActions()
medit->addAction(deleteCommand, Core::Constants::G_EDIT_COPYPASTE);
d->deleteAction = deleteCommand->action();
d->selectAllAction = registerCommand(Core::Constants::SELECTALL, [this]() { selectAll(); }, d->context)->action();
+
+ Core::ActionContainer *menuModelEditor = Core::ActionManager::createMenu(Constants::MENU_ID);
+ menuModelEditor->menu()->setTitle(tr("Model Editor"));
+ Core::ActionContainer *menuTools = Core::ActionManager::actionContainer(Core::Constants::M_TOOLS);
+ menuTools->addMenu(menuModelEditor);
+
+ Core::Command *exportDiagramCommand = registerCommand(
+ Constants::EXPORT_DIAGRAM, [this]() { exportDiagram(); }, Core::Context(), true,
+ tr("Export Diagram..."));
+ menuModelEditor->addAction(exportDiagramCommand);
+ d->exportDiagramAction = exportDiagramCommand->action();
+
d->openParentDiagramAction = registerCommand(
Constants::OPEN_PARENT_DIAGRAM, [this]() { openParentDiagram(); }, Core::Context(), true,
tr("Open Parent Diagram"), QKeySequence(QStringLiteral("Ctrl+Shift+P")))->action();
@@ -230,6 +249,13 @@ void ActionHandler::onEditItem()
editor->editSelectedItem();
}
+void ActionHandler::exportDiagram()
+{
+ auto editor = qobject_cast<ModelEditor *>(Core::EditorManager::currentEditor());
+ if (editor)
+ editor->exportDiagram();
+}
+
Core::Command *ActionHandler::registerCommand(const Core::Id &id, const std::function<void()> &slot,
const Core::Context &context, bool scriptable, const QString &title,
const QKeySequence &keySequence)
diff --git a/src/plugins/modeleditor/actionhandler.h b/src/plugins/modeleditor/actionhandler.h
index 96dcc750be..b595db1436 100644
--- a/src/plugins/modeleditor/actionhandler.h
+++ b/src/plugins/modeleditor/actionhandler.h
@@ -64,6 +64,7 @@ public:
QAction *deleteAction() const;
QAction *selectAllAction() const;
QAction *openParentDiagramAction() const;
+ QAction *exportDiagramAction() const;
void createActions();
@@ -79,6 +80,7 @@ private slots:
void openParentDiagram();
void onEditProperties();
void onEditItem();
+ void exportDiagram();
private:
Core::Command *registerCommand(const Core::Id &id, const std::function<void()> &slot,
diff --git a/src/plugins/modeleditor/modeleditor.cpp b/src/plugins/modeleditor/modeleditor.cpp
index 6c8c12684e..fd642c0dcf 100644
--- a/src/plugins/modeleditor/modeleditor.cpp
+++ b/src/plugins/modeleditor/modeleditor.cpp
@@ -76,11 +76,14 @@
#include <QComboBox>
#include <QDir>
#include <QEvent>
+#include <QFileDialog>
#include <QFileInfo>
#include <QFrame>
#include <QHBoxLayout>
+#include <QImageWriter>
#include <QLabel>
#include <QMap>
+#include <QMessageBox>
#include <QPainter>
#include <QPixmap>
#include <QScrollArea>
@@ -121,6 +124,7 @@ public:
QWidget *toolbar = 0;
QComboBox *diagramSelector = 0;
SelectedArea selectedArea = SelectedArea::Nothing;
+ QString lastExportDirPath;
};
ModelEditor::ModelEditor(UiController *uiController, ActionHandler *actionHandler, QWidget *parent)
@@ -514,6 +518,41 @@ void ModelEditor::editSelectedItem()
onEditSelectedElement();
}
+void ModelEditor::exportDiagram()
+{
+ qmt::MDiagram *diagram = currentDiagram();
+ if (diagram) {
+ if (d->lastExportDirPath.isEmpty())
+ d->lastExportDirPath = d->document->filePath().toFileInfo().canonicalPath();
+ QString fileName = QFileDialog::getSaveFileName(
+ Core::ICore::dialogParent(),
+ tr("Export Diagram"), d->lastExportDirPath,
+ tr("Images (*.png *.jpeg *.jpg *.tif *.tiff);;PDF (*.pdf);;SVG (*.svg)"));
+ if (!fileName.isEmpty()) {
+ qmt::DocumentController *documentController = d->document->documentController();
+ qmt::DiagramSceneModel *sceneModel = documentController->diagramsManager()->diagramSceneModel(diagram);
+ bool success = false;
+ QString suffix = QFileInfo(fileName).suffix().toLower();
+ // TODO use QFileDialog::selectedNameFilter() as fallback if no suffix is given
+ if (suffix.isEmpty()) {
+ suffix = QStringLiteral(".png");
+ fileName += suffix;
+ }
+ if (suffix == QStringLiteral(".pdf"))
+ success = sceneModel->exportPdf(fileName);
+ else if (suffix == QStringLiteral(".svg"))
+ success = sceneModel->exportSvg(fileName);
+ else
+ success = sceneModel->exportImage(fileName);
+ if (success)
+ d->lastExportDirPath = QFileInfo(fileName).canonicalPath();
+ else
+ QMessageBox::critical(Core::ICore::dialogParent(), tr("Exporting Diagram Failed"),
+ tr("Exporting the diagram into file<br>\"%1\"<br>failed.").arg(fileName));
+ }
+ }
+}
+
qmt::MPackage *ModelEditor::guessSelectedPackage() const
{
qmt::MPackage *package = 0;
diff --git a/src/plugins/modeleditor/modeleditor.h b/src/plugins/modeleditor/modeleditor.h
index e764838189..b8ab618138 100644
--- a/src/plugins/modeleditor/modeleditor.h
+++ b/src/plugins/modeleditor/modeleditor.h
@@ -86,6 +86,8 @@ public:
void openParentDiagram();
void editProperties();
void editSelectedItem();
+ void exportDiagram();
+
qmt::MPackage *guessSelectedPackage() const;
private:
diff --git a/src/plugins/modeleditor/modeleditor_constants.h b/src/plugins/modeleditor/modeleditor_constants.h
index de75e940a5..32e8759b8e 100644
--- a/src/plugins/modeleditor/modeleditor_constants.h
+++ b/src/plugins/modeleditor/modeleditor_constants.h
@@ -35,6 +35,8 @@ const char MODEL_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("OpenWith::Editors",
const char REMOVE_SELECTED_ELEMENTS[] = "ModelEditor.RemoveSelectedElements";
const char DELETE_SELECTED_ELEMENTS[] = "ModelEditor.DeleteSelectedElements";
const char OPEN_PARENT_DIAGRAM[] = "ModelEditor.OpenParentDiagram";
+const char MENU_ID[] = "ModelEditor.Menu";
+const char EXPORT_DIAGRAM[] = "ModelEditor.ExportDiagram";
const char ACTION_ADD_PACKAGE[] = "ModelEditor.Action.AddPackage";
const char ACTION_ADD_COMPONENT[] = "ModelEditor.Action.AddComponent";
const char ACTION_ADD_CLASS[] = "ModelEditor.Action.AddClass";