summaryrefslogtreecommitdiff
path: root/src/diagramview.cpp
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-09 13:41:26 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-09 13:41:26 +0100
commite23b78998b04bc91d022dd82880179118203efb9 (patch)
tree8c3f9090d6465ff473781d54b26f950c6ed3c913 /src/diagramview.cpp
parent3bad0741c095f7aa5556b3d898cf995b238c3ac3 (diff)
downloaddbmodel-e23b78998b04bc91d022dd82880179118203efb9.tar.xz
Move grid drawing to DiagramView
Diffstat (limited to 'src/diagramview.cpp')
-rw-r--r--src/diagramview.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/diagramview.cpp b/src/diagramview.cpp
index 0c5a45b..e2a5779 100644
--- a/src/diagramview.cpp
+++ b/src/diagramview.cpp
@@ -14,10 +14,14 @@
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#include <cmath>
#include <QMouseEvent>
#include <QScrollBar>
#include <QDebug>
#include "diagramview.h"
+#include "diagramdocument.h"
+
+using namespace std;
DiagramView::DiagramView(QWidget *parent)
: QGraphicsView(parent), m_handScrolling(false)
@@ -25,6 +29,13 @@ DiagramView::DiagramView(QWidget *parent)
setAlignment(Qt::AlignLeft | Qt::AlignTop);
setRenderHint(QPainter::Antialiasing);
setDragMode(QGraphicsView::RubberBandDrag);
+ setRubberBandSelectionMode(Qt::ContainsItemBoundingRect);
+}
+
+DiagramDocument *
+DiagramView::document() const
+{
+ return static_cast<DiagramDocument *>(scene());
}
void
@@ -82,3 +93,48 @@ DiagramView::mouseReleaseEvent(QMouseEvent *event)
}
QGraphicsView::mouseReleaseEvent(event);
}
+
+void
+DiagramView::drawBackground(QPainter *painter, const QRectF &rect)
+{
+ DiagramDocument *doc = document();
+ if (doc && doc->isGridVisible()) {
+ drawGrid(painter, rect);
+ }
+}
+
+void
+DiagramView::drawGrid(QPainter *painter, const QRectF &rect)
+{
+ const int pointBufferSize = 5000;
+ static QPoint pointBuffer[pointBufferSize];
+ DiagramDocument *doc = document();
+ int gridSize = doc->gridSize();
+ int x0 = gridSize * floor(rect.left() / gridSize);
+ int y0 = gridSize * floor(rect.top() / gridSize);
+ int x1 = gridSize * ceil(rect.right() / gridSize);
+ int y1 = gridSize * ceil(rect.bottom() / gridSize);
+ painter->save();
+ QPen pen;
+ pen.setColor(doc->gridColor());
+ pen.setWidth(0);
+ painter->setPen(pen);
+ painter->setRenderHint(QPainter::Antialiasing, false);
+ int pointsUsed = 0;
+ for (int x = x0; x < x1; x += gridSize) {
+ for (int y = y0; y < y1; y += gridSize) {
+ pointBuffer[pointsUsed].setX(x);
+ pointBuffer[pointsUsed].setY(y);
+ pointsUsed++;
+ if (pointsUsed == pointBufferSize) {
+ painter->drawPoints(pointBuffer, pointsUsed);
+ pointsUsed = 0;
+ }
+ }
+ }
+ if (pointsUsed > 0) {
+ painter->drawPoints(pointBuffer, pointsUsed);
+ pointsUsed = 0;
+ }
+ painter->restore();
+}