-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgraphicsview.cpp
134 lines (121 loc) · 4.19 KB
/
graphicsview.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "graphicsview.h"
#define ZOOMINFACTOR 1.1
#define ZOOMOUTFACTOR 0.90909
GraphicsView::GraphicsView(QWidget *parent)
: QGraphicsView::QGraphicsView(parent) {
// qDebug() << "Hello from GraphicsView";
// create new action that is wired to trigger zoomIn function, when
// appropriate shortcut is triggered
QAction *zoomInAction = new QAction(this);
zoomInAction->setShortcuts(QKeySequence::ZoomIn);
connect(zoomInAction, &QAction::triggered, this, &GraphicsView::zoomIn);
this->addAction(zoomInAction);
// create new action that is wired to trigger zoomOut function, when
// appropriate shortcut is triggered
QAction *zoomOutAction = new QAction(this);
zoomOutAction->setShortcuts(QKeySequence::ZoomOut);
connect(zoomOutAction, &QAction::triggered, this, &GraphicsView::zoomOut);
this->addAction(zoomOutAction);
// creates new rubberband rectangle to perform node selections
rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
rubberBandSelectionStarted = false;
}
void GraphicsView::wheelEvent(QWheelEvent *event) {
if (event->modifiers() == Qt::ControlModifier) {
// save off old current transformation anchor
const ViewportAnchor anchor = transformationAnchor();
// makes sure to zoom under mouse position
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
int angle = event->angleDelta().y();
if (angle > 0) {
zoomIn();
} else {
zoomOut();
}
// reset transformation anchor to old anchor
setTransformationAnchor(anchor);
} else {
QGraphicsView::wheelEvent(event);
}
}
void GraphicsView::keyPressEvent(QKeyEvent *event) {
switch (event->key()) {
case Qt::Key_Space: { // trigger dragging mode when pressing & holding
// space key
if (!event->isAutoRepeat()) {
if (dragMode() == QGraphicsView::NoDrag) {
// qDebug() << "Entering drag mode";
setDragMode(QGraphicsView::ScrollHandDrag);
setInteractive(false);
}
break;
}
}
case Qt::Key_0: { // CMD/Control + 0 resets zoom to fit everything
if (event->modifiers() == Qt::ControlModifier) {
// resize sceneRect of scene to fit all items, grows by design under normal use only
QRectF r = scene()->itemsBoundingRect();
scene()->setSceneRect(r);
// fit view to updated sceneRect
fitInView(scene()->sceneRect(), Qt::KeepAspectRatio);
}
}
default: {
QGraphicsView::keyPressEvent(event);
break;
}
}
}
void GraphicsView::zoomIn() { scale(ZOOMINFACTOR, ZOOMINFACTOR); }
void GraphicsView::zoomOut() { scale(ZOOMOUTFACTOR, ZOOMOUTFACTOR); }
void GraphicsView::keyReleaseEvent(QKeyEvent *event) {
switch (event->key()) {
case Qt::Key_Space: {
if (!event->isAutoRepeat()) {
if (dragMode() == QGraphicsView::ScrollHandDrag) {
setInteractive(true);
setDragMode(QGraphicsView::NoDrag);
// qDebug() << "Leaving drag mode";
}
break;
}
}
default: {
break;
QGraphicsView::keyReleaseEvent(event);
}
}
}
void GraphicsView::mousePressEvent(QMouseEvent *event) {
if (event->modifiers() == Qt::ShiftModifier &&
event->button() == Qt::LeftButton) {
rubberBandSelectionStarted = true;
origin = event->pos();
#ifndef NDEBUG
qDebug() << "Rubberband start pos:" << origin;
#endif
rubberBand->setGeometry(QRect(event->pos(), QSize()));
rubberBand->show();
}
QGraphicsView::mousePressEvent(event);
}
void GraphicsView::mouseMoveEvent(QMouseEvent *event) {
if (rubberBandSelectionStarted) {
rubberBand->setGeometry(QRect(origin, event->pos()));
}
QGraphicsView::mouseMoveEvent(event);
}
void GraphicsView::mouseReleaseEvent(QMouseEvent *event) {
// not checking if shift is still pressed as user might have released it in
// the meantime
if (rubberBandSelectionStarted && event->button() == Qt::LeftButton) {
rubberBand->hide();
rubberBandSelectionStarted = false;
QPainterPath pp;
pp.addRect(
QRectF(this->mapToScene(origin), this->mapToScene(event->pos())));
this->scene()->setSelectionArea(pp);
this->scene()->update();
}
QGraphicsView::mouseReleaseEvent(event);
}