summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-08 22:27:59 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-08 22:27:59 +0100
commit83ec1b4f1722ce891f3d5871e27ae66a7228abe4 (patch)
treeeb643f502880a79be88f81f0f5a8c1636f41b1a1
parentec5ba128e5a4dcb2c231a65f1d224012ecebd341 (diff)
downloaddbmodel-83ec1b4f1722ce891f3d5871e27ae66a7228abe4.tar.gz
dbmodel-83ec1b4f1722ce891f3d5871e27ae66a7228abe4.tar.bz2
Show grid
-rw-r--r--src/diagramdocument.cpp78
-rw-r--r--src/diagramdocument.h17
-rw-r--r--src/mainwindow.cpp17
-rw-r--r--src/mainwindow.h4
4 files changed, 115 insertions, 1 deletions
diff --git a/src/diagramdocument.cpp b/src/diagramdocument.cpp
index 71b38db..7ed2418 100644
--- a/src/diagramdocument.cpp
+++ b/src/diagramdocument.cpp
@@ -14,6 +14,7 @@
// 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 "diagramdocument.h"
#include "diagramobject.h"
#include "diagramconnection.h"
@@ -25,13 +26,88 @@
#include <QDebug>
#include <QFile>
#include <QTextStream>
+#include <QStyle>
+
+using namespace std;
+
+class DiagramDocument::DiagramDocumentPrivate
+{
+public:
+ DiagramDocumentPrivate() :
+ gridSize(10),
+ gridVisible(true),
+ gridPen(QColor(185, 185, 185), 0)
+ {}
+ int gridSize;
+ bool gridVisible;
+ QPen gridPen;
+};
DiagramDocument::DiagramDocument(QObject *parent)
- : QGraphicsScene(parent), m_mode(DiagramDocument::Select), m_line(NULL)
+ : QGraphicsScene(parent), d(new DiagramDocumentPrivate), m_mode(DiagramDocument::Select), m_line(NULL)
{
m_undoStack = new QUndoStack(this);
}
+int
+DiagramDocument::gridSize() const
+{
+ return d->gridSize;
+}
+
+void
+DiagramDocument::setGridSize(int size)
+{
+ d->gridSize = size;
+ update();
+}
+
+bool
+DiagramDocument::isGridVisible() const
+{
+ return d->gridVisible;
+}
+
+void
+DiagramDocument::setGridVisible(bool visible)
+{
+ d->gridVisible = visible;
+ update();
+}
+
+QColor
+DiagramDocument::gridColor() const
+{
+ return d->gridPen.color();
+}
+
+void
+DiagramDocument::setGridColor(const QColor &color)
+{
+ d->gridPen.setColor(color);
+ update();
+}
+
+void
+DiagramDocument::drawBackground(QPainter *painter, const QRectF &rect)
+{
+ if (d->gridVisible) {
+ qreal gridSize = d->gridSize;
+ qreal x0 = gridSize * floor(rect.left() / gridSize);
+ qreal y0 = gridSize * floor(rect.top() / gridSize);
+ qreal x1 = gridSize * ceil(rect.right() / gridSize);
+ qreal y1 = gridSize * ceil(rect.bottom() / gridSize);
+ painter->save();
+ painter->setPen(d->gridPen);
+ painter->setRenderHint(QPainter::Antialiasing, false);
+ // FIXME do this in one QPainter::drawPoints call
+ for (qreal x = x0; x < x1; x += gridSize)
+ for (qreal y = y0; y < y1; y += gridSize)
+ painter->drawPoint(x, y);
+ painter->restore();
+ }
+}
+
DiagramDocument::Mode
DiagramDocument::mode()
{
diff --git a/src/diagramdocument.h b/src/diagramdocument.h
index 747508b..a02ef09 100644
--- a/src/diagramdocument.h
+++ b/src/diagramdocument.h
@@ -34,6 +34,9 @@ class DiagramObject;
class DiagramDocument : public QGraphicsScene
{
Q_OBJECT
+ Q_PROPERTY(int gridSize READ gridSize WRITE setGridSize)
+ Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible)
+ Q_PROPERTY(QColor gridColor READ gridColor WRITE setGridColor)
public:
DiagramDocument(QObject *parent = 0);
@@ -66,6 +69,15 @@ public:
QList<DiagramConnection *> findConnections(DiagramObject *object);
template <class T> QList<T *> itemsByType();
+ int gridSize() const;
+ void setGridSize(int size);
+
+ bool isGridVisible() const;
+ void setGridVisible(bool visible);
+
+ QColor gridColor() const;
+ void setGridColor(const QColor &color);
+
signals:
void modeChanged(DiagramDocument::Mode mode);
@@ -79,7 +91,12 @@ protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+ void drawBackground(QPainter *painter, const QRectF &rect);
+
private:
+ class DiagramDocumentPrivate;
+ DiagramDocumentPrivate *const d;
+
bool m_trackingMoves;
QMap<DiagramItem *, QPointF> m_movedItems;
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index f714ad2..867bdbf 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -253,6 +253,18 @@ MainWindow::setupActions()
m_actionQuit->setIcon(IconProvider::findIcon(16, "application-exit.png"));
m_actionQuit->setShortcut(QKeySequence(tr("Ctrl+Q")));
connect(m_actionQuit, SIGNAL(triggered(bool)), SLOT(closeAll()));
+
+ m_actionShowGrid = new QAction(this);
+ m_actionShowGrid->setText(tr("Show &Grid"));
+ m_actionShowGrid->setCheckable(true);
+ connect(m_actionShowGrid, SIGNAL(triggered(bool)), SLOT(showGrid(bool)));
+}
+
+void
+MainWindow::showGrid(bool checked)
+{
+ m_model->undoStack()->push(
+ new SetObjectPropertyCommand(m_model, "gridVisible", checked));
}
void
@@ -334,6 +346,9 @@ MainWindow::setupMenuBar()
menu->addSeparator();
menu->addAction(m_actionDelete);
+ QMenu *viewMenu = menuBar()->addMenu(tr("&View"));
+ viewMenu->addAction(m_actionShowGrid);
+
menu = menuBar()->addMenu(tr("&Help"));
menu->addAction(m_actionAbout);
}
@@ -461,6 +476,8 @@ MainWindow::newModel(DiagramDocument *newModel)
m_undoGroup->addStack(m_model->undoStack());
m_undoGroup->setActiveStack(m_model->undoStack());
+ m_actionShowGrid->setChecked(m_model->isGridVisible());
+
connect(m_model,
SIGNAL(modeChanged(DiagramDocument::Mode)),
SLOT(updateMode(DiagramDocument::Mode)));
diff --git a/src/mainwindow.h b/src/mainwindow.h
index d5c3ba3..cc52934 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -71,6 +71,8 @@ public slots:
void updateClipboard(QClipboard::Mode mode);
void closeAll();
+ void showGrid(bool);
+
protected:
void setupUi();
void setupActions();
@@ -103,6 +105,8 @@ private:
QAction *m_actionClose;
QAction *m_actionQuit;
+ QAction *m_actionShowGrid;
+
QAction *m_actionCut;
QAction *m_actionCopy;
QAction *m_actionPaste;