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.
This commit is contained in:
Vasilis Liaskovitis
2013-11-29 15:35:34 +02:00
parent 0e73f157f8
commit 74894e59d1
3 changed files with 63 additions and 6 deletions
+54 -5
View File
@@ -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();