Added status bar with full file path and graph zoom
[hypercube:hypercube.git] / GUI / graphview.cpp
1 #include <QGraphicsScene>
2 #include <QWheelEvent>
3 #include <cmath>
4 #include "graphview.h"
5 #include "vertexitem.h"
6 #include "edgeitem.h"
7
8
9 /*!
10         \class GraphView
11         \brief A widget for displaying and manipulating Graph objects.
12
13         Lorem ipsum...
14 */
15
16
17 GraphView::GraphView(QWidget *parent)
18         : QGraphicsView(parent)
19 {
20         _graphSize = 0;
21         _dimensions = QPoint(0, 0);
22
23         _scene = new QGraphicsScene(this);
24         setScene(_scene);
25         _boundingRect = _scene->addRect(0, 0, 0, 0);
26         _boundingRect->setPen(Qt::DashLine);
27 }
28
29 GraphView::~GraphView()
30 {
31         delete _scene;
32 }
33
34 void GraphView::clear()
35 {
36         while (!_vertexList.isEmpty())
37                 delete _vertexList.takeFirst();
38         while (!_edgeList.isEmpty())
39                 delete _edgeList.takeFirst();
40
41         _graphSize = 0;
42 }
43
44 int GraphView::graphSize()
45 {
46         return _graphSize;
47 }
48
49 VertexItem* GraphView::vertex(int id)
50 {
51         return _vertexList.at(id);
52 }
53
54 VertexItem* GraphView::addVertex()
55 {
56         VertexItem *v = new VertexItem();
57         _scene->addItem(v);
58         _vertexList.append(v);
59
60         _graphSize++;
61
62         return v;
63 }
64
65 EdgeItem* GraphView::edge(int src, int dst)
66 {
67         VertexItem *v = _vertexList.at(src);
68
69         for (int i = 0; i < v->edges().size(); i++)
70                 if (v->edges().at(i)->destVertex() == _vertexList.at(dst))
71                         return v->edges().at(i);
72
73         return NULL;
74 }
75
76 EdgeItem* GraphView::addEdge(int src, int dst)
77 {
78         EdgeItem *e = new EdgeItem(_vertexList.at(src), _vertexList.at(dst));
79         _scene->addItem(e);
80         _edgeList.append(e);
81
82         return e;
83 }
84
85 QPoint GraphView::dimensions(void) const
86 {
87         return _dimensions;
88 }
89
90 void GraphView::setDimensions(const QPoint dimensions)
91 {
92         QPoint offset = ((dimensions / 2) - (_dimensions / 2));
93         for (int i = 0; i < _vertexList.size(); ++i)
94                 _vertexList.at(i)->moveBy(offset.x(), offset.y());
95
96
97         _boundingRect->setRect(0, 0, dimensions.x() - 1,
98           dimensions.y() - 1);
99
100         _scene->setSceneRect(0, 0, dimensions.x(), dimensions.y());
101         _dimensions = dimensions;
102 }
103
104
105 void GraphView::setVertexColor(const QColor &color)
106 {
107         for (int i = 0; i < _vertexList.size(); i++)
108                 _vertexList.at(i)->setColor(color);
109 }
110
111 void GraphView::setEdgeColor(const QColor &color)
112 {
113         for (int i = 0; i < _edgeList.size(); i++)
114                 _edgeList.at(i)->setColor(color);
115 }
116
117 void GraphView::setVertexSize(int size)
118 {
119         for (int i = 0; i < _vertexList.size(); i++)
120                 _vertexList.at(i)->setSize(size);
121 }
122
123 void GraphView::setEdgeSize(int size)
124 {
125         for (int i = 0; i < _edgeList.size(); i++)
126                 _edgeList.at(i)->setSize(size);
127 }
128
129 void GraphView::setVertexFontSize(int size)
130 {
131         for (int i = 0; i < _vertexList.size(); i++)
132                 _vertexList.at(i)->setFontSize(size);
133 }
134
135 void GraphView::setEdgeFontSize(int size)
136 {
137         for (int i = 0; i < _edgeList.size(); i++)
138                 _edgeList.at(i)->setFontSize(size);
139 }
140
141 void GraphView::setEdgeZValue(int value)
142 {
143         for (int i = 0; i < _edgeList.size(); i++)
144                 _edgeList.at(i)->setZValue(value);
145 }
146
147
148 void GraphView::wheelEvent(QWheelEvent *event)
149 {
150         scale(pow(2.0, -event->delta() / 400.0));
151         emit zoomed(transform().m11());
152 }
153
154 void GraphView::scale(qreal scaleFactor)
155 {
156         qreal factor = matrix().scale(scaleFactor, scaleFactor)
157           .mapRect(QRectF(0, 0, 1, 1)).width();
158
159         if (factor < 0.1 || factor > 10)
160                 return;
161
162         QGraphicsView::scale(scaleFactor, scaleFactor);
163 }