From 74894e59d1994984c0e64db4ad05dbfc33ef4763 Mon Sep 17 00:00:00 2001 From: Vasilis Liaskovitis Date: Fri, 29 Nov 2013 15:35:34 +0200 Subject: [PATCH] MapperGLCanvas: Add click and drag functionality Pressing the left-mouse button close enough to a vertex makes that vertex the current / active one to operate on. If the button is not released, the vertex can be dragged on the canvas. If on the source canvas, updates on the destination canvas can be seen dynamically. The user needs to click within a specific distance around a vertex otherwise the click will have no effect in vertex selection. Distances of all vertices from the point clicked are calculated (manhattan distance, but other can be used) and the vertex with the smallest distance is declared as the new active one. An active vertex variable is also added in the Shape class. Both mouse and key events update the active vertex of a shape (tested only with quad so far). So the active vertex is no longer a static variable in the key event handler, but is common state shared by both mouse and key event handlers. --- MapperGLCanvas.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++---- MapperGLCanvas.h | 4 ++++ Shape.h | 6 ++++- 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/MapperGLCanvas.cpp b/MapperGLCanvas.cpp index 3c0c538..9b4b32f 100644 --- a/MapperGLCanvas.cpp +++ b/MapperGLCanvas.cpp @@ -20,7 +20,7 @@ #include "MapperGLCanvas.h" MapperGLCanvas::MapperGLCanvas(QWidget* parent, const QGLWidget * shareWidget) - : QGLWidget(parent, shareWidget) + : QGLWidget(parent, shareWidget), _mousepressed(false) { } @@ -93,10 +93,56 @@ void MapperGLCanvas::enterDraw() //// glLoadIdentity (); // FIXME? is this needed here? } +void MapperGLCanvas::mousePressEvent(QMouseEvent* event) +{ + int i, dist, maxdist, mindist; + int xmouse = event->x(); + int ymouse = event->y(); + maxdist = mindist = 50; + if (event->buttons() & Qt::LeftButton) + { + // std::cout << "Left Mouse key pressed" << std::endl; + for (i = 0; i < 4; i++) + { + Quad& quad = getQuad(); + Point p = quad.getVertex(i); + dist = abs(xmouse - p.x) + abs(ymouse - p.y); + if (dist < maxdist && dist < mindist) + { + quad.setActiveVertex(i); + mindist = dist; + } + } + _mousepressed = true; + } +} + +void MapperGLCanvas::mouseReleaseEvent(QMouseEvent* event) +{ + // std::cout << "Mouse Release event " << std::endl; + _mousepressed = false; +} + +void MapperGLCanvas::mouseMoveEvent(QMouseEvent* event) +{ + + if (_mousepressed) + { + // std::cout << "Move event " << std::endl; + Quad& quad = getQuad(); + Point p = quad.getVertex(quad.getActiveVertex()); + p.x = event->x(); + p.y = event->y(); + + quad.setVertex(quad.getActiveVertex(), p); + update(); + emit quadChanged(); + } +} + void MapperGLCanvas::keyPressEvent(QKeyEvent* event) { std::cout << "Key pressed" << std::endl; - static int current = 0; int xMove = 0; int yMove = 0; switch (event->key()) { @@ -107,7 +153,10 @@ void MapperGLCanvas::keyPressEvent(QKeyEvent* event) emit quadSwitched(); } else - current = (current + 1) % 4; + { + Quad& quad = getQuad(); + quad.setActiveVertex((quad.getActiveVertex() + 1) % 4); + } break; case Qt::Key_Up: yMove = -1; @@ -128,10 +177,10 @@ void MapperGLCanvas::keyPressEvent(QKeyEvent* event) } Quad& quad = getQuad(); - Point p = quad.getVertex(current); + Point p = quad.getVertex(quad.getActiveVertex()); p.x += xMove; p.y += yMove; - quad.setVertex(current, p); + quad.setVertex(quad.getActiveVertex(), p); update(); diff --git a/MapperGLCanvas.h b/MapperGLCanvas.h index a5d3db2..6e33dbf 100644 --- a/MapperGLCanvas.h +++ b/MapperGLCanvas.h @@ -48,6 +48,9 @@ protected: void paintGL(); void keyPressEvent(QKeyEvent* event); + void mousePressEvent(QMouseEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void mouseReleaseEvent(QMouseEvent* event); void paintEvent(QPaintEvent* event); private: @@ -55,6 +58,7 @@ private: void enterDraw(); virtual void doDraw() = 0; void exitDraw(); + bool _mousepressed; signals: void quadChanged(); diff --git a/Shape.h b/Shape.h index 5e87a3d..f4d4a35 100644 --- a/Shape.h +++ b/Shape.h @@ -41,9 +41,11 @@ class Shape public: typedef std::tr1::shared_ptr ptr; std::vector vertices; + int active_vertex; Shape() {} Shape(std::vector vertices_) : - vertices(vertices_) + vertices(vertices_), + active_vertex(0) {} virtual ~Shape() {} @@ -62,6 +64,8 @@ public: vertices[i].x = x; vertices[i].y = y; } + void setActiveVertex(int x) {active_vertex = x;} + int getActiveVertex() {return active_vertex;} }; /**