Hi,

this patch improves Distance Polyline editing by allowing deletion of previously added points while editing, using the backspace key.

Regards,
Michael
From 6f8f5e05be1527c1bbe0e32032bac7c72a7e4dd1 Mon Sep 17 00:00:00 2001
From: Michael Klein <[email protected]>
Date: Fri, 27 Apr 2012 23:47:01 +0200
Subject: [PATCH 1/2] handle backspace key when editing distance overlays

---
 src/CCanvas.cpp          |   20 +++++------------
 src/CCanvas.h            |    1 -
 src/CMouseOverlay.cpp    |    6 +++++
 src/CMouseOverlay.h      |    1 +
 src/COverlayDistance.cpp |   55 +++++++++++++++++++++++++++++++++++++++++-----
 src/COverlayDistance.h   |    3 ++-
 src/IOverlay.h           |    6 +++++
 7 files changed, 71 insertions(+), 21 deletions(-)

diff --git a/src/CCanvas.cpp b/src/CCanvas.cpp
index 28f28bb..1a1c5e4 100644
--- a/src/CCanvas.cpp
+++ b/src/CCanvas.cpp
@@ -96,8 +96,6 @@ CCanvas::CCanvas(QWidget * parent)
     mouseColorPicker = new CMouseColorPicker(this);
     mouseSelWpt     = new CMouseSelWpt(this);
 
-    cursorFocus = false;
-
     profile = new CPlot(CPlotData::eLinear, CPlot::eIcon, this);
     profile->resize(300,120);
     profile->hide();
@@ -142,7 +140,7 @@ void CCanvas::slotCopyPosition()
 
 void CCanvas::setMouseMode(mouse_mode_e mode)
 {
-    QApplication::restoreOverrideCursor();
+    leaveEvent(0);
 
     if(mouse) mouse->looseFocus();
     COverlayDB::self().looseFocus();
@@ -215,7 +213,7 @@ void CCanvas::setMouseMode(mouse_mode_e mode)
     }
     if(underMouse())
     {
-        QApplication::setOverrideCursor(*mouse);
+        enterEvent(0);
     }
     mouseMode = mode;
     update();
@@ -297,21 +295,15 @@ void CCanvas::keyReleaseEvent(QKeyEvent * e)
 
 void CCanvas::enterEvent(QEvent * )
 {
-    if (!cursorFocus)
-    {
-        QApplication::setOverrideCursor(*mouse);
-        cursorFocus = true;
-    }
+    QApplication::setOverrideCursor(*mouse);
+    setMouseTracking(true);
 }
 
 
 void CCanvas::leaveEvent(QEvent * )
 {
-    if (cursorFocus)
-    {
-        QApplication::restoreOverrideCursor();
-        cursorFocus = false;
-    }
+    QApplication::restoreOverrideCursor();
+    setMouseTracking(false);
 }
 
 
diff --git a/src/CCanvas.h b/src/CCanvas.h
index baa2699..1db3970 100644
--- a/src/CCanvas.h
+++ b/src/CCanvas.h
@@ -187,7 +187,6 @@ class CCanvas : public QWidget
         CMouseOverlay * mouseOverlay;
         CMouseColorPicker * mouseColorPicker;
         CMouseSelWpt * mouseSelWpt;
-        bool cursorFocus;
 
         /// current mouse mode
         mouse_mode_e mouseMode;
diff --git a/src/CMouseOverlay.cpp b/src/CMouseOverlay.cpp
index 4b3b90f..d7ad7f9 100644
--- a/src/CMouseOverlay.cpp
+++ b/src/CMouseOverlay.cpp
@@ -35,6 +35,12 @@ CMouseOverlay::~CMouseOverlay()
 }
 
 
+void CMouseOverlay::keyPressEvent(QKeyEvent * e)
+{
+    if(selOverlay) selOverlay->keyPressEvent(e);
+}
+
+
 void CMouseOverlay::mouseMoveEvent(QMouseEvent * e)
 {
     mouseMoveEventOverlay(e);
diff --git a/src/CMouseOverlay.h b/src/CMouseOverlay.h
index 2bdca40..1fab04f 100644
--- a/src/CMouseOverlay.h
+++ b/src/CMouseOverlay.h
@@ -29,6 +29,7 @@ class CMouseOverlay : public IMouse
         CMouseOverlay(CCanvas * canvas);
         virtual ~CMouseOverlay();
 
+        void keyPressEvent(QKeyEvent * e);
         void mouseMoveEvent(QMouseEvent * e);
         void mousePressEvent(QMouseEvent * e);
         void mouseReleaseEvent(QMouseEvent * e);
diff --git a/src/COverlayDistance.cpp b/src/COverlayDistance.cpp
index cda2962..2a96b8d 100644
--- a/src/COverlayDistance.cpp
+++ b/src/COverlayDistance.cpp
@@ -251,6 +251,51 @@ bool COverlayDistance::isCloseEnough(const QPoint& pt)
 }
 
 
+void COverlayDistance::keyPressEvent(QKeyEvent * e)
+{
+    if (e->key() == Qt::Key_Backspace)
+    {
+        if (!doFuncWheel && addType != eNone && thePoint && points.size() > 1)
+        {
+            int idx;
+            switch (addType)
+            {
+            case eBefore:
+                idx = points.indexOf(*thePoint);
+                if (idx < points.size())
+                {
+                    points.removeAt(idx+1);
+                    thePointAfter = (idx+1 < points.size()) ? &(points[idx+1]) 
: 0;
+                }
+                break;
+            case eAfter:
+                idx = points.indexOf(*thePoint);
+                if (idx > 0)
+                {
+                    points.removeAt(idx-1);
+                    thePointBefor = (idx > 1) ? &(points[idx-2]) : 0;
+                }
+                break;
+            case eAtEnd:
+                points.removeLast();
+                thePointBefor = (points.size() > 1) ? &(*(points.end() - 2)) : 
0;
+                thePoint      = &points.last();
+                break;
+            default:
+                break;
+            }
+            calcDistance();
+            emit sigChanged();
+            QPoint pos = 
theMainWindow->getCanvas()->mapFromGlobal(QCursor::pos());
+            QMouseEvent * ev = new QMouseEvent(QEvent::MouseMove, pos, 
Qt::NoButton,
+                                               QApplication::mouseButtons(),
+                                               
QApplication::keyboardModifiers());
+            QCoreApplication::postEvent(theMainWindow->getCanvas(), ev);
+        }
+    }
+}
+
+
 void COverlayDistance::mouseMoveEvent(QMouseEvent * e)
 {
 
@@ -300,12 +345,12 @@ void COverlayDistance::mouseMoveEvent(QMouseEvent * e)
             double u1, v1, u2, v2;
             IMap& map = CMapDB::self().getMap();
 
-            if(*thePoint == points.last())
+            if(points.size() > 1 && *thePoint == points.last())
             {
                 u1 = (points.end() - 2)->u;
                 v1 = (points.end() - 2)->v;
             }
-            else if(*thePoint == points.first())
+            else if(points.size() > 1 && *thePoint == points.first())
             {
                 u1 = (points.begin() + 1)->u;
                 v1 = (points.begin() + 1)->v;
@@ -549,10 +594,10 @@ void COverlayDistance::mousePressEvent(QMouseEvent * e)
             calcDistance();
             theMainWindow->getCanvas()->update();
 
-            if(addType == eNone)
-            {
+            //if(addType == eNone)   // why?
+            //{
                 emit sigChanged();
-            }
+            //}
             return;
         }
 
diff --git a/src/COverlayDistance.h b/src/COverlayDistance.h
index c83adf1..0f6560e 100644
--- a/src/COverlayDistance.h
+++ b/src/COverlayDistance.h
@@ -59,6 +59,7 @@ class COverlayDistance : public IOverlay
         /// draw the ployline, waypoints and action icons
         void draw(QPainter& p, const QRect& viewport);
 
+        void keyPressEvent(QKeyEvent * e);
         void mouseMoveEvent(QMouseEvent * e);
         void mousePressEvent(QMouseEvent * e);
         void mouseReleaseEvent(QMouseEvent * e);
@@ -133,7 +134,7 @@ class COverlayDistance : public IOverlay
         bool doSpecialCursor;
         /// set true while moving a point
         bool doMove;
-        /// set true while showing the function wheeƶ
+        /// set true while showing the function wheel
         bool doFuncWheel;
 
         enum addType_e{eNone, eBefore, eAfter, eAtEnd};
diff --git a/src/IOverlay.h b/src/IOverlay.h
index c8cf7bf..2b1f4b6 100644
--- a/src/IOverlay.h
+++ b/src/IOverlay.h
@@ -21,6 +21,7 @@
 
 #include "IItem.h"
 
+#include <QKeyEvent>
 #include <QObject>
 #include <QPixmap>
 #include <QPointer>
@@ -61,6 +62,11 @@ class IOverlay : public IItem
         */
         virtual bool mouseActionInProgress(){return false;}
 
+        /// get key press event when selected
+        virtual void keyPressEvent(QKeyEvent * e){}
+        /// get key release event when selected
+        virtual void keyRelaseEvent(QKeyEvent * e){}
+
         /// get mouse move event when selected
         virtual void mouseMoveEvent(QMouseEvent * e){}
         /// get mouse press event when selected
-- 
1.7.9.6

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Qlandkartegt-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qlandkartegt-users

Reply via email to