summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJochen Becher <jochen_becher@gmx.de>2016-06-21 21:27:43 +0200
committerJochen Becher <jochen_becher@gmx.de>2016-06-24 16:58:30 +0000
commit80e5259999e1fc02a59c7529bdf457c504e25867 (patch)
treedf95647160aa8cdbaa03f7dbc30c5cb4864e36a9 /src
parent9ccb08987043b82ccec3e545f1556fa2f4fb32ec (diff)
downloadqt-creator-80e5259999e1fc02a59c7529bdf457c504e25867.tar.gz
ModelEditor: Implement zoom of diagrams.
All elements of a zoomed diagram must be dran anti-aliased. This change removes the extra handling of drawing vertical or horizontal lines without anti-alias. The complete graphics view is drawn anti-aliased instead. Change-Id: I6fc041b6d70da5a7a7bcb8e97d07990517380b90 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/parts/alignbuttonsitem.cpp1
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.cpp29
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.h1
-rw-r--r--src/libs/modelinglib/qmt/diagram_scene/parts/relationstarter.cpp1
-rw-r--r--src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp1
-rw-r--r--src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp21
-rw-r--r--src/plugins/modeleditor/actionhandler.cpp59
-rw-r--r--src/plugins/modeleditor/actionhandler.h6
-rw-r--r--src/plugins/modeleditor/modeleditor.cpp20
-rw-r--r--src/plugins/modeleditor/modeleditor.h3
-rw-r--r--src/plugins/modeleditor/modeleditor_constants.h3
11 files changed, 98 insertions, 47 deletions
diff --git a/src/libs/modelinglib/qmt/diagram_scene/parts/alignbuttonsitem.cpp b/src/libs/modelinglib/qmt/diagram_scene/parts/alignbuttonsitem.cpp
index 934e084666..f8482e992c 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/parts/alignbuttonsitem.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/parts/alignbuttonsitem.cpp
@@ -58,7 +58,6 @@ public:
Q_UNUSED(widget);
painter->save();
- painter->setRenderHint(QPainter::Antialiasing, true);
painter->setPen(pen());
painter->setBrush(brush());
painter->drawRoundedRect(rect(), 3, 3);
diff --git a/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.cpp b/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.cpp
index 59efce4667..7ea98f3aa7 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.cpp
@@ -40,23 +40,6 @@
namespace qmt {
-class ArrowItem::GraphicsPathItem : public QGraphicsPathItem
-{
-public:
- explicit GraphicsPathItem(QGraphicsItem *parent)
- : QGraphicsPathItem(parent)
- {
- }
-
- void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
- {
- painter->save();
- painter->setRenderHint(QPainter::Antialiasing, true);
- QGraphicsPathItem::paint(painter, option, widget);
- painter->restore();
- }
-};
-
class ArrowItem::GraphicsHeadItem : public QGraphicsItem
{
public:
@@ -182,7 +165,7 @@ public:
if (hasArrow) {
if (!m_arrowItem)
- m_arrowItem = new ArrowItem::GraphicsPathItem(this);
+ m_arrowItem = new QGraphicsPathItem(this);
if (m_head == ArrowItem::HeadOpen || m_head == ArrowItem::HeadTriangle) {
m_arrowItem->setPen(style->linePen());
@@ -210,7 +193,7 @@ public:
if (hasDiamond) {
if (!m_diamondItem)
- m_diamondItem = new ArrowItem::GraphicsPathItem(this);
+ m_diamondItem = new QGraphicsPathItem(this);
if (m_head == ArrowItem::HeadDiamond || m_head == ArrowItem::HeadDiamondFilledTriangle) {
m_diamondItem->setPen(style->linePen());
@@ -238,15 +221,15 @@ private:
ArrowItem::Head m_head = ArrowItem::HeadNone;
double m_arrowSize = 10.0;
double m_diamondSize = 15.0;
- ArrowItem::GraphicsPathItem *m_arrowItem = 0;
- ArrowItem::GraphicsPathItem *m_diamondItem = 0;
+ QGraphicsPathItem *m_arrowItem = 0;
+ QGraphicsPathItem *m_diamondItem = 0;
};
-class ArrowItem::GraphicsShaftItem : public ArrowItem::GraphicsPathItem
+class ArrowItem::GraphicsShaftItem : public QGraphicsPathItem
{
public:
explicit GraphicsShaftItem(QGraphicsItem *parent)
- : GraphicsPathItem(parent)
+ : QGraphicsPathItem(parent)
{
}
};
diff --git a/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.h b/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.h
index 1db2c532cd..c4865e5a69 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.h
+++ b/src/libs/modelinglib/qmt/diagram_scene/parts/arrowitem.h
@@ -37,7 +37,6 @@ class Style;
class ArrowItem : public QGraphicsItem
{
- class GraphicsPathItem;
class GraphicsHeadItem;
class GraphicsShaftItem;
diff --git a/src/libs/modelinglib/qmt/diagram_scene/parts/relationstarter.cpp b/src/libs/modelinglib/qmt/diagram_scene/parts/relationstarter.cpp
index 4d95534218..5c2ce279e6 100644
--- a/src/libs/modelinglib/qmt/diagram_scene/parts/relationstarter.cpp
+++ b/src/libs/modelinglib/qmt/diagram_scene/parts/relationstarter.cpp
@@ -63,7 +63,6 @@ void RelationStarter::paint(QPainter *painter, const QStyleOptionGraphicsItem *o
Q_UNUSED(widget);
painter->save();
- painter->setRenderHint(QPainter::Antialiasing, true);
painter->setPen(pen());
painter->setBrush(brush());
painter->drawRoundedRect(rect(), 3, 3);
diff --git a/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp b/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp
index 20c7bbceab..16f361a1ea 100644
--- a/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp
+++ b/src/libs/modelinglib/qmt/diagram_widgets_ui/diagramview.cpp
@@ -46,6 +46,7 @@ DiagramView::DiagramView(QWidget *parent)
setAlignment(Qt::AlignLeft | Qt::AlignTop);
setDragMode(QGraphicsView::RubberBandDrag);
setFrameShape(QFrame::NoFrame);
+ setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
}
DiagramView::~DiagramView()
diff --git a/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp b/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp
index 169e75b66c..552852c1e0 100644
--- a/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp
+++ b/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp
@@ -43,67 +43,47 @@ void ShapePaintVisitor::visitLine(const LineShape *shapeLine)
{
QPointF p1 = shapeLine->pos1().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size);
QPointF p2 = shapeLine->pos2().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size);
- m_painter->save();
- m_painter->setRenderHint(QPainter::Antialiasing, p1.x() != p2.x() && p1.y() != p2.y());
m_painter->drawLine(p1, p2);
- m_painter->restore();
}
void ShapePaintVisitor::visitRect(const RectShape *shapeRect)
{
- m_painter->save();
- m_painter->setRenderHint(QPainter::Antialiasing, false);
m_painter->drawRect(QRectF(shapeRect->pos().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size),
shapeRect->size().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size)));
- m_painter->restore();
}
void ShapePaintVisitor::visitRoundedRect(const RoundedRectShape *shapeRoundedRect)
{
qreal radiusX = shapeRoundedRect->radius().mapScaledTo(0, m_originalSize.width(), m_baseSize.width(), m_size.width());
qreal radiusY = shapeRoundedRect->radius().mapScaledTo(0, m_originalSize.height(), m_baseSize.height(), m_size.height());
- m_painter->save();
- m_painter->setRenderHint(QPainter::Antialiasing, true);
m_painter->drawRoundedRect(QRectF(shapeRoundedRect->pos().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size),
shapeRoundedRect->size().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size)),
radiusX, radiusY);
- m_painter->restore();
}
void ShapePaintVisitor::visitCircle(const CircleShape *shapeCircle)
{
- m_painter->save();
- m_painter->setRenderHint(QPainter::Antialiasing, true);
m_painter->drawEllipse(shapeCircle->center().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size),
shapeCircle->radius().mapScaledTo(m_scaledOrigin.x(), m_originalSize.width(), m_baseSize.width(), m_size.width()),
shapeCircle->radius().mapScaledTo(m_scaledOrigin.y(), m_originalSize.height(), m_baseSize.height(), m_size.height()));
- m_painter->restore();
}
void ShapePaintVisitor::visitEllipse(const EllipseShape *shapeEllipse)
{
QSizeF radius = shapeEllipse->radius().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size);
- m_painter->save();
- m_painter->setRenderHint(QPainter::Antialiasing, true);
m_painter->drawEllipse(shapeEllipse->center().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size),
radius.width(), radius.height());
- m_painter->restore();
}
void ShapePaintVisitor::visitArc(const ArcShape *shapeArc)
{
QSizeF radius = shapeArc->radius().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size);
- m_painter->save();
- m_painter->setRenderHint(QPainter::Antialiasing, true);
m_painter->drawArc(QRectF(shapeArc->center().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size) - QPointF(radius.width(), radius.height()), radius * 2.0),
shapeArc->startAngle() * 16, shapeArc->spanAngle() * 16);
- m_painter->restore();
}
void ShapePaintVisitor::visitPath(const PathShape *shapePath)
{
- m_painter->save();
- m_painter->setRenderHint(QPainter::Antialiasing, true);
QPainterPath path;
foreach (const PathShape::Element &element, shapePath->elements()) {
switch (element.m_elementType) {
@@ -138,7 +118,6 @@ void ShapePaintVisitor::visitPath(const PathShape *shapePath)
}
}
m_painter->drawPath(path);
- m_painter->restore();
}
ShapeSizeVisitor::ShapeSizeVisitor(const QPointF &scaledOrigin, const QSizeF &originalSize, const QSizeF &baseSize,
diff --git a/src/plugins/modeleditor/actionhandler.cpp b/src/plugins/modeleditor/actionhandler.cpp
index 97b5829552..a2dabcfdcd 100644
--- a/src/plugins/modeleditor/actionhandler.cpp
+++ b/src/plugins/modeleditor/actionhandler.cpp
@@ -54,6 +54,9 @@ public:
QAction *selectAllAction = 0;
QAction *openParentDiagramAction = 0;
QAction *exportDiagramAction = 0;
+ QAction *zoomInAction = 0;
+ QAction *zoomOutAction = 0;
+ QAction *resetZoomAction = 0;
};
ActionHandler::ActionHandler(const Core::Context &context, QObject *parent)
@@ -118,6 +121,21 @@ QAction *ActionHandler::exportDiagramAction() const
return d->exportDiagramAction;
}
+QAction *ActionHandler::zoomInAction() const
+{
+ return d->zoomInAction;
+}
+
+QAction *ActionHandler::zoomOutAction() const
+{
+ return d->zoomOutAction;
+}
+
+QAction *ActionHandler::resetZoom() const
+{
+ return d->resetZoomAction;
+}
+
void ActionHandler::createActions()
{
Core::ActionContainer *medit = Core::ActionManager::actionContainer(Core::Constants::M_EDIT);
@@ -150,6 +168,26 @@ void ActionHandler::createActions()
menuModelEditor->addAction(exportDiagramCommand);
d->exportDiagramAction = exportDiagramCommand->action();
+ menuModelEditor->addSeparator(d->context);
+
+ Core::Command *zoomInCommand = registerCommand(
+ Constants::ZOOM_IN, [this]() { zoomIn(); }, d->context, true,
+ tr("Zoom In"), QKeySequence(QStringLiteral("Ctrl++")));
+ menuModelEditor->addAction(zoomInCommand);
+ d->zoomInAction = zoomInCommand->action();
+
+ Core::Command *zoomOutCommand = registerCommand(
+ Constants::ZOOM_OUT, [this]() { zoomOut(); }, d->context, true,
+ tr("Zoom Out"), QKeySequence(QStringLiteral("Ctrl+-")));
+ menuModelEditor->addAction(zoomOutCommand);
+ d->zoomOutAction = zoomOutCommand->action();
+
+ Core::Command *resetZoomCommand = registerCommand(
+ Constants::RESET_ZOOM, [this]() { resetZoom(); }, d->context, true,
+ tr("Reset Zoom"), QKeySequence(QStringLiteral("Ctrl+0")));
+ menuModelEditor->addAction(resetZoomCommand);
+ d->zoomOutAction = resetZoomCommand->action();
+
d->openParentDiagramAction = registerCommand(
Constants::OPEN_PARENT_DIAGRAM, [this]() { openParentDiagram(); }, Core::Context(), true,
tr("Open Parent Diagram"), QKeySequence(QStringLiteral("Ctrl+Shift+P")))->action();
@@ -256,6 +294,27 @@ void ActionHandler::exportDiagram()
editor->exportDiagram();
}
+void ActionHandler::zoomIn()
+{
+ auto editor = qobject_cast<ModelEditor *>(Core::EditorManager::currentEditor());
+ if (editor)
+ editor->zoomIn();
+}
+
+void ActionHandler::zoomOut()
+{
+ auto editor = qobject_cast<ModelEditor *>(Core::EditorManager::currentEditor());
+ if (editor)
+ editor->zoomOut();
+}
+
+void ActionHandler::resetZoom()
+{
+ auto editor = qobject_cast<ModelEditor *>(Core::EditorManager::currentEditor());
+ if (editor)
+ editor->resetZoom();
+}
+
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 5bd2ce0e91..958d53997a 100644
--- a/src/plugins/modeleditor/actionhandler.h
+++ b/src/plugins/modeleditor/actionhandler.h
@@ -64,6 +64,9 @@ public:
QAction *selectAllAction() const;
QAction *openParentDiagramAction() const;
QAction *exportDiagramAction() const;
+ QAction *zoomInAction() const;
+ QAction *zoomOutAction() const;
+ QAction *resetZoom() const;
void createActions();
@@ -80,6 +83,9 @@ private slots:
void onEditProperties();
void onEditItem();
void exportDiagram();
+ void zoomIn();
+ void zoomOut();
+ void resetZoom();
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 db17e50c5a..72326cebe8 100644
--- a/src/plugins/modeleditor/modeleditor.cpp
+++ b/src/plugins/modeleditor/modeleditor.cpp
@@ -100,6 +100,7 @@ namespace ModelEditor {
namespace Internal {
static const char PROPERTYNAME_TOOLBARID[] = "ToolbarId";
+static const double ZOOM_FACTOR = 1.05;
class ModelEditor::ModelEditorPrivate
{
@@ -558,6 +559,25 @@ void ModelEditor::exportDiagram()
}
}
+void ModelEditor::zoomIn()
+{
+ QTransform transform = d->diagramView->transform();
+ transform.scale(ZOOM_FACTOR, ZOOM_FACTOR);
+ d->diagramView->setTransform(transform);
+}
+
+void ModelEditor::zoomOut()
+{
+ QTransform transform = d->diagramView->transform();
+ transform.scale(1.0 / ZOOM_FACTOR, 1.0 / ZOOM_FACTOR);
+ d->diagramView->setTransform(transform);
+}
+
+void ModelEditor::resetZoom()
+{
+ d->diagramView->setTransform(QTransform());
+}
+
qmt::MPackage *ModelEditor::guessSelectedPackage() const
{
qmt::MPackage *package = 0;
diff --git a/src/plugins/modeleditor/modeleditor.h b/src/plugins/modeleditor/modeleditor.h
index 5d741f1008..46eb8bba14 100644
--- a/src/plugins/modeleditor/modeleditor.h
+++ b/src/plugins/modeleditor/modeleditor.h
@@ -86,6 +86,9 @@ public:
void editProperties();
void editSelectedItem();
void exportDiagram();
+ void zoomIn();
+ void zoomOut();
+ void resetZoom();
qmt::MPackage *guessSelectedPackage() const;
diff --git a/src/plugins/modeleditor/modeleditor_constants.h b/src/plugins/modeleditor/modeleditor_constants.h
index a1314874f3..9ebdf13529 100644
--- a/src/plugins/modeleditor/modeleditor_constants.h
+++ b/src/plugins/modeleditor/modeleditor_constants.h
@@ -36,6 +36,9 @@ 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 ZOOM_IN[] = "ModelEditor.ZoomIn";
+const char ZOOM_OUT[] = "ModelEditor.ZoomOut";
+const char RESET_ZOOM[] = "ModelEditor.ResetZoom";
const char ACTION_ADD_PACKAGE[] = "ModelEditor.Action.AddPackage";
const char ACTION_ADD_COMPONENT[] = "ModelEditor.Action.AddComponent";
const char ACTION_ADD_CLASS[] = "ModelEditor.Action.AddClass";