diff --git a/sources/editor/elementview.cpp b/sources/editor/elementview.cpp index 5b6839e3a..04c717bad 100644 --- a/sources/editor/elementview.cpp +++ b/sources/editor/elementview.cpp @@ -18,6 +18,7 @@ #include "elementview.h" #include "qetelementeditor.h" #include "editorcommands.h" +#include "qetapp.h" /** Constructeur @param scene ElementScene visualisee par cette ElementView @@ -28,6 +29,7 @@ ElementView::ElementView(ElementScene *scene, QWidget *parent) : scene_(scene), offset_paste_count_(0) { + grabGesture(Qt::PinchGesture); setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); setInteractive(true); setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); @@ -112,6 +114,22 @@ void ElementView::zoomOut() { scale(0.75, 0.75); } +/** + Agrandit le schema avec le trackpad +*/ +void ElementView::zoomInSlowly() { + scale(1.02, 1.02); + adjustSceneRect(); +} + +/** + Retrecit le schema avec le trackpad +*/ +void ElementView::zoomOutSlowly() { + scale(0.98, 0.98); + adjustSceneRect(); +} + /** Agrandit ou rectrecit le schema de facon a ce que tous les elements du schema soient visibles a l'ecran. S'il n'y a aucun element sur le schema, @@ -126,7 +144,7 @@ void ElementView::zoomFit() { Reinitialise le zoom */ void ElementView::zoomReset() { - resetSceneRect(); + resetSceneRect(); resetMatrix(); scale(4.0, 4.0); } @@ -381,20 +399,74 @@ void ElementView::mouseReleaseEvent(QMouseEvent *e) { QGraphicsView::mouseReleaseEvent(e); } +/** + * @brief ElementView::gestures + * @return + */ +bool ElementView::gestures() const { + return(QETApp::settings().value("diagramview/gestures", false).toBool()); +} + + /** * @brief ElementView::wheelEvent * @param e */ void ElementView::wheelEvent(QWheelEvent *e) { //Zoom and scrolling - if (e -> buttons() != Qt::MidButton) { - if (!(e -> modifiers() & Qt::ControlModifier)) - e -> delta() > 0 ? zoomIn() : zoomOut(); +// if (e -> buttons() != Qt::MidButton) { +// if (!(e -> modifiers() & Qt::ControlModifier)) +// e -> delta() > 0 ? zoomIn() : zoomOut(); +// else +// QAbstractScrollArea::wheelEvent(e); +// } + if ( gestures() ) { + if (e -> modifiers() & Qt::ControlModifier) + e -> delta() > 0 ? zoomInSlowly() : zoomOutSlowly(); else - QAbstractScrollArea::wheelEvent(e); + QGraphicsView::wheelEvent(e); + } else { + e -> delta() > 0 ? zoomIn(): zoomOut(); } } +/** + Gere les evenements de la ElementView + @param e Evenement +*/ +bool ElementView::event(QEvent *e) { + // By default touch events are converted to mouse events. So + // after this event we will get a mouse event also but we want + // to handle touch events as gestures only. So we need this safeguard + // to block mouse events that are actually generated from touch. + if (e->type() == QEvent::Gesture) + return gestureEvent(static_cast(e)); + + return(QGraphicsView::event(e)); +} + +/** + * Utilise le pincement du trackpad pour zoomer + * @brief ElementView::gestureEvent + * @param event + * @return + */ +bool ElementView::gestureEvent(QGestureEvent *event){ + if (QGesture *gesture = event->gesture(Qt::PinchGesture)) { + QPinchGesture *pinch = static_cast(gesture); + if (pinch->changeFlags() & QPinchGesture::ScaleFactorChanged){ + qreal value = gesture->property("scaleFactor").toReal(); + if (value > 1){ + zoomInSlowly(); + }else{ + zoomOutSlowly(); + } + } + } + return true; +} + + /** Dessine l'arriere-plan de l'editeur, cad la grille. @param p Le QPainter a utiliser pour dessiner diff --git a/sources/editor/elementview.h b/sources/editor/elementview.h index 0541a3a9a..3bf7291e4 100644 --- a/sources/editor/elementview.h +++ b/sources/editor/elementview.h @@ -47,6 +47,8 @@ class ElementView : public QGraphicsView { void mousePressEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); + bool gestureEvent(QGestureEvent *event); + bool event(QEvent *event); void wheelEvent(QWheelEvent *); virtual void drawBackground(QPainter *, const QRectF &); @@ -58,6 +60,8 @@ class ElementView : public QGraphicsView { void setSelectionMode(); void zoomIn(); void zoomOut(); + void zoomInSlowly(); + void zoomOutSlowly(); void zoomFit(); void zoomReset(); void adjustSceneRect(); @@ -86,6 +90,7 @@ class ElementView : public QGraphicsView { QPointF start_top_left_corner_; QPointF reference_view_; QPointF center_view_; + bool gestures() const; bool is_moving_view_; ///< Indicate whether the visualisation mode has been enabled due to mouse/keyboard interactions }; #endif