#include "include/graphwidget.h" #include #include "include/node.h" #include "include/edge.h" #include "include/mainwindow.h" #include const QColor GraphWidget::m_paperColor(255,255,153); GraphWidget::GraphWidget(MainWindow *parent) : QGraphicsView(parent) , m_parent(parent) { m_scene = new QGraphicsScene(this); m_scene->setItemIndexMethod(QGraphicsScene::NoIndex); m_scene->setSceneRect(-400, -400, 800, 800); setScene(m_scene); setCacheMode(CacheBackground); setViewportUpdateMode(BoundingRectViewportUpdate); setRenderHint(QPainter::Antialiasing); setTransformationAnchor(AnchorUnderMouse); setMinimumSize(400, 400); m_graphlogic = new GraphLogic(this); } void GraphWidget::newScene() { m_graphlogic->removeAllNodes(); m_graphlogic->addFirstNode(); this->show(); } void GraphWidget::closeScene() { m_graphlogic->removeAllNodes(); this->hide(); } GraphLogic *GraphWidget::graphLogic() const { return m_graphlogic; } void GraphWidget::zoomIn() { scaleView(qreal(1.2)); } void GraphWidget::zoomOut() { scaleView(qreal(1 / 1.2)); } // MainWindow::keyPressEvent passes all keyevent to here, except // Ctrl + m (show/hide mainToolBar) and Ctrl + i (show/hide statusIconsToolbar) void GraphWidget::keyPressEvent(QKeyEvent *event) { // if GraphLogic handles the event then stop. if (m_graphlogic->processKeyEvent(event)) return; if (event->key() == Qt::Key_Plus) { zoomIn(); return; } if (event->key() == Qt::Key_Minus) { zoomOut(); return; } QGraphicsView::keyPressEvent(event); } void GraphWidget::wheelEvent(QWheelEvent *event) { event->modifiers() & Qt::ControlModifier ? (event->delta() > 0 ? m_graphlogic->scaleUp() : m_graphlogic->scaleDown()) : (event->delta() > 0 ? zoomIn() : zoomOut()); } void GraphWidget::drawBackground(QPainter *painter, const QRectF &rect) { Q_UNUSED(rect); painter->fillRect(m_scene->sceneRect(), GraphWidget::m_paperColor); painter->setBrush(Qt::NoBrush); painter->drawRect(m_scene->sceneRect()); } void GraphWidget::scaleView(qreal scaleFactor) { qreal factor = transform().scale(scaleFactor, scaleFactor). mapRect(QRectF(0, 0, 1, 1)).width(); // don't allow to scale up/down too much if (factor < 0.2 || factor > 10) return; scale(scaleFactor, scaleFactor); }