diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index 3f1be3a61..2e73058df 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -409,7 +409,7 @@ void DiagramView::pasteHere() { } /** - Manage the events click mouse : + Manage the events press click mouse : * click to add an independent text field */ void DiagramView::mousePressEvent(QMouseEvent *e) { @@ -423,20 +423,43 @@ void DiagramView::mousePressEvent(QMouseEvent *e) { is_adding_text = false; } } - // Select visualisation or selection mode + // workaround for drag view with hold wheel click and drag mouse + // see also mouseMoveEvent() and mouseReleaseEvent() if (e -> buttons() == Qt::MidButton) { - if (!is_moving_view_) { - setVisualisationMode(); - is_moving_view_ = true; - } - else{ - setSelectionMode(); - is_moving_view_ = false; - } + setCursor(Qt::ClosedHandCursor); + reference_view_ = mapToScene(e -> pos()); + center_view_ = mapToScene(this -> viewport() -> rect()).boundingRect().center(); + return; } QGraphicsView::mousePressEvent(e); } +/** + * @brief DiagramView::mouseMoveEvent + * Manage the event move mouse + */ +void DiagramView::mouseMoveEvent(QMouseEvent *e) { + if ((e -> buttons() & Qt::MidButton) == Qt::MidButton) { + QPointF move = reference_view_ - mapToScene(e -> pos()); + this -> centerOn(center_view_ + move); + center_view_ = mapToScene(this -> viewport() -> rect()).boundingRect().center(); + return; + } + QGraphicsView::mouseMoveEvent(e); +} + +/** + * @brief DiagramView::mouseReleaseEvent + * Manage event release click mouse + */ +void DiagramView::mouseReleaseEvent(QMouseEvent *e) { + if (e -> button() == Qt::MidButton) { + setCursor(Qt::ArrowCursor); + return; + } + QGraphicsView::mouseReleaseEvent(e); +} + /** Manage wheel event of mouse @param e QWheelEvent diff --git a/sources/diagramview.h b/sources/diagramview.h index da18124c4..238651f9a 100644 --- a/sources/diagramview.h +++ b/sources/diagramview.h @@ -52,6 +52,8 @@ class DiagramView : public QGraphicsView { bool fresh_focus_in_; ///< Indicate the focus was freshly gained ElementsLocation next_location_; QPoint next_position_; + QPointF reference_view_; + QPointF center_view_; // methods public: @@ -86,6 +88,8 @@ class DiagramView : public QGraphicsView { private: void mousePressEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); void dragEnterEvent(QDragEnterEvent *); void dragLeaveEvent(QDragLeaveEvent *); void dragMoveEvent(QDragMoveEvent *); diff --git a/sources/editor/elementview.cpp b/sources/editor/elementview.cpp index 95be3acd5..c5ac37c7e 100644 --- a/sources/editor/elementview.cpp +++ b/sources/editor/elementview.cpp @@ -336,18 +336,40 @@ ElementContent ElementView::pasteWithOffset(const QDomDocument &xml_document) { void ElementView::mousePressEvent(QMouseEvent *e) { // Select visualisation or selection mode if (e -> buttons() == Qt::MidButton) { - if (!is_moving_view_) { - setVisualisationMode(); - is_moving_view_ = true; - } - else{ - setSelectionMode(); - is_moving_view_ = false; - } + setCursor(Qt::ClosedHandCursor); + reference_view_ = mapToScene(e -> pos()); + center_view_ = mapToScene(this -> viewport() -> rect()).boundingRect().center(); + return; } QGraphicsView::mousePressEvent(e); } +/** + * @brief ElementView::mouseMoveEvent + * Manage the event move mouse + */ +void ElementView::mouseMoveEvent(QMouseEvent *e) { + if ((e -> buttons() & Qt::MidButton) == Qt::MidButton) { + QPointF move = reference_view_ - mapToScene(e -> pos()); + this -> centerOn(center_view_ + move); + center_view_ = mapToScene(this -> viewport() -> rect()).boundingRect().center(); + return; + } + QGraphicsView::mouseMoveEvent(e); +} + +/** + * @brief ElementView::mouseReleaseEvent + * Manage event release click mouse + */ +void ElementView::mouseReleaseEvent(QMouseEvent *e) { + if (e -> button() == Qt::MidButton) { + setCursor(Qt::ArrowCursor); + return; + } + QGraphicsView::mouseReleaseEvent(e); +} + /** Gere les actions liees a la rollette de la souris @param e QWheelEvent decrivant l'evenement rollette diff --git a/sources/editor/elementview.h b/sources/editor/elementview.h index f51075086..b250f25cc 100644 --- a/sources/editor/elementview.h +++ b/sources/editor/elementview.h @@ -43,6 +43,8 @@ class ElementView : public QGraphicsView { protected: void mousePressEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); void wheelEvent(QWheelEvent *); virtual void drawBackground(QPainter *, const QRectF &); @@ -79,6 +81,8 @@ class ElementView : public QGraphicsView { QString to_paste_in_area_; int offset_paste_count_; QPointF start_top_left_corner_; + QPointF reference_view_; + QPointF center_view_; bool is_moving_view_; ///< Indicate whether the visualisation mode has been enabled due to mouse/keyboard interactions }; #endif