From 44e96a6ea74c76d1b3e0033c3c30e48ef4a5302d Mon Sep 17 00:00:00 2001 From: dfochi Date: Thu, 9 Jun 2016 20:46:27 +0000 Subject: [PATCH] Moving elements with keyboard arrows scrolls editor and expands scene to right or below the editor. Element movement to the left and above the editor is impeded. Plus and Minus buttons zoom in and out of the editor. git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@4549 bfdf4180-ca20-0410-9c96-a3a8aa849046 --- sources/diagram.cpp | 21 +++++++++-- sources/diagramview.cpp | 77 ++++++++++++++++++++++++++++++++++++++++- sources/diagramview.h | 1 + 3 files changed, 96 insertions(+), 3 deletions(-) diff --git a/sources/diagram.cpp b/sources/diagram.cpp index ed12619cf..2e9ee7100 100644 --- a/sources/diagram.cpp +++ b/sources/diagram.cpp @@ -235,11 +235,28 @@ void Diagram::keyPressEvent(QKeyEvent *e) bool transmit_event = true; if (!isReadOnly()) { QPointF movement; + qreal top_position = 0; + qreal left_position = 0; + QList selected_elmts = this->selectedContent().elements.toList(); if (!this->selectedContent().elements.isEmpty()) { switch(e -> key()) { - case Qt::Key_Left: movement = QPointF(-xGrid, 0.0); break; + case Qt::Key_Left: + foreach (QGraphicsItem *item, selected_elmts) { + left_position = item->mapRectFromScene(item->boundingRect()).x(); + if (left_position >= this->sceneRect().left() - item->boundingRect().width()) + return; + } + movement = QPointF(-xGrid, 0.0); + break; case Qt::Key_Right: movement = QPointF(+xGrid, 0.0); break; - case Qt::Key_Up: movement = QPointF(0.0, -yGrid); break; + case Qt::Key_Up: + foreach (QGraphicsItem *item, selected_elmts) { + top_position = item->mapRectFromScene(item->boundingRect()).y(); + if (top_position >= this->sceneRect().top() - item->boundingRect().height()) + return; + } + movement = QPointF(0.0, -yGrid); + break; case Qt::Key_Down: movement = QPointF(0.0, +yGrid); break; } if (!movement.isNull() && !focusItem()) { diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index 77e8b8c18..42889f8f1 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -354,8 +354,9 @@ void DiagramView::setSelectionMode() { */ void DiagramView::zoom(const qreal zoom_factor) { - if (zoom_factor >= 1) + if (zoom_factor >= 1){ scale(zoom_factor, zoom_factor); + } else { QSettings settings; @@ -363,6 +364,7 @@ void DiagramView::zoom(const qreal zoom_factor) (horizontalScrollBar()->maximum() || verticalScrollBar()->maximum()) ) scale(zoom_factor, zoom_factor); } + scene->adjustSceneRect(); adjustGridToZoom(); } @@ -604,6 +606,28 @@ switch(e -> key()) case Qt::Key_End: current_project->changeLastTab(); return; + case Qt::Key_Minus: + zoom(0.85); + return; + case Qt::Key_Plus: + zoom(1.15); + return; + case Qt::Key_Up: + if(!scene->selectedContent().elements.isEmpty()){ + scrollOnMovement(e); + } + case Qt::Key_Down: + if(!scene->selectedContent().elements.isEmpty()){ + scrollOnMovement(e); + } + case Qt::Key_Left: + if(!scene->selectedContent().elements.isEmpty()){ + scrollOnMovement(e); + } + case Qt::Key_Right: + if(!scene->selectedContent().elements.isEmpty()){ + scrollOnMovement(e); + } } switchToVisualisationModeIfNeeded(e); QGraphicsView::keyPressEvent(e); @@ -620,6 +644,57 @@ void DiagramView::keyReleaseEvent(QKeyEvent *e) { QGraphicsView::keyReleaseEvent(e); } +/** + Handles element movement when editor is zoomed in and scrolls vertical + and horizontal bar. If element is moved to the right side of the editor + or below the editor SceneRect is expanded +*/ +void DiagramView::scrollOnMovement(QKeyEvent *e){ + QList selected_elmts = scene ->selectedItems(); + QRectF viewed_scene = viewedSceneRect(); + foreach (QGraphicsItem *qgi, selected_elmts){ + qreal x = qgi->pos().x(); + qreal y = qgi->pos().y(); + qreal bottom = viewed_scene.bottom(); + qreal top = viewed_scene.top(); + qreal left = viewed_scene.left(); + qreal right = viewed_scene.right(); + qreal elmt_top = y + qgi->boundingRect().top(); + qreal elmt_bottom = y + qgi->boundingRect().bottom(); + qreal elmt_right = x + qgi->boundingRect().right(); + qreal elmt_left = x + qgi->boundingRect().left(); + bool elmt_right_of_left_margin = elmt_left>=left; + bool elmt_left_of_right_margin = elmt_right<=right; + bool elmt_below_top_margin = elmt_top>=top; + bool elmt_above_bottom_margin = elmt_bottom<=bottom; + if (!(elmt_right_of_left_margin && elmt_left_of_right_margin) || + !(elmt_below_top_margin && elmt_above_bottom_margin ) ) { + QScrollBar *h = horizontalScrollBar(); + QScrollBar *v = verticalScrollBar(); + int h_increment=0; + int v_increment=0; + if (e->key()==Qt::Key_Up && elmt_above_bottom_margin) + v_increment = 2*qgi->boundingRect().top(); + else if(e->key()==Qt::Key_Down && elmt_below_top_margin){ + v_increment = 2*qgi->boundingRect().bottom(); + } + else if (e->key()==Qt::Key_Left && elmt_left_of_right_margin) + h_increment = 2*qgi->boundingRect().left(); + else if (e->key()==Qt::Key_Right && elmt_right_of_left_margin){ + h_increment = 2*qgi->boundingRect().right(); + } + if (((elmt_right >= scene->sceneRect().right() - qgi->boundingRect().right()) || + (elmt_bottom >= scene->sceneRect().bottom() - qgi->boundingRect().bottom())) && + (e->key()==Qt::Key_Right || e->key()==Qt::Key_Down)){ + scene->adjustSceneRect(); + } + h -> setValue(h -> value() + h_increment); + v -> setValue(v -> value() + v_increment); + } + } +} + + /** @return le titre de cette vue ; cela correspond au titre du schema visualise precede de la mention "Schema". Si le titre du schema est vide, diff --git a/sources/diagramview.h b/sources/diagramview.h index b7353c333..f925c68c5 100644 --- a/sources/diagramview.h +++ b/sources/diagramview.h @@ -100,6 +100,7 @@ class DiagramView : public QGraphicsView void handleElementDrop(QDropEvent *); void handleTitleBlockDrop(QDropEvent *); void handleTextDrop(QDropEvent *); + void scrollOnMovement(QKeyEvent *); bool gestureEvent(QGestureEvent *event); QRectF viewedSceneRect() const; bool mustIntegrateTitleBlockTemplate(const TitleBlockTemplateLocation &) const;