diff options
-rw-r--r-- | src/diagramdocument.cpp | 78 | ||||
-rw-r--r-- | src/diagramdocument.h | 17 | ||||
-rw-r--r-- | src/mainwindow.cpp | 17 | ||||
-rw-r--r-- | src/mainwindow.h | 4 |
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; |