Bug 131683

Summary: Guideline is wrongly drawn after zoom operation
Product: [Applications] kst Reporter: Andrew Walker <arwalker>
Component: generalAssignee: kst
Status: RESOLVED FIXED    
Severity: normal    
Priority: NOR    
Version: 1.x   
Target Milestone: ---   
Platform: Compiled Sources   
OS: Linux   
Latest Commit: Version Fixed In:
Sentry Crash Report:

Description Andrew Walker 2006-08-01 20:46:07 UTC
Version:           HEAD (using KDE KDE 3.5.0)
Installed from:    Compiled From Sources
OS:                Linux

PROBLEM:
After most (all?) zoom operations a horizontal guideline is drawn when it should not be.

STEPS TO REPRODUCE:
Start Kst
Create a plot
In XY zoom mode zoom in using the mouse

RESULTS:
The plot is zoomed and a horizontal guideline is drawn

EXPECTED RESULTS:
The plot is zoomed and no guideline is drawn

NOTES:
This problem was introduced with the resolution of bug #111241
Comment 1 Andrew Walker 2006-08-03 22:44:09 UTC
SVN commit 569441 by arwalker:

BUG:131683 No longer draw spurious guidelines. Draw guideline immediately upon pressing shift or control key. Erase the guideline correctly after releasing the shift or control key.

 M  +44 -32    kst2dplot.cpp  


--- trunk/extragear/graphics/kst/src/libkstapp/kst2dplot.cpp #569440:569441
@@ -2395,10 +2395,8 @@
     if (view && GetPlotRegion().contains(_mouse.tracker)) {
       if (gzType == X_ZOOMBOX || gzType == Y_ZOOMBOX) {
         updateXYGuideline(view, QPoint(-1, -1), view->mapFromGlobal(QCursor::pos()), GetPlotRegion(), gzType);
-        _mouse.lastGuideline = view->mapFromGlobal(QCursor::pos());
       } else if (gzType == XY_ZOOMBOX) {
         updateXYGuideline(view, QPoint(-1, -1), view->mapFromGlobal(QCursor::pos()), GetPlotRegion(), gzType);
-        _mouse.lastGuideline = view->mapFromGlobal(QCursor::pos());
       }
     }
   }
@@ -3991,31 +3989,31 @@
   QPen newPen(Qt::black, 1, Qt::DotLine);
   p.setPen(newPen);
   p.setRasterOp(Qt::NotROP);
-  if (gzType == X_ZOOMBOX) {
-    if (pr.contains(oldPos)) {
-      if (_mouse.lastGuidelineType == X_ZOOMBOX) {
-        p.drawLine(oldPos.x(), pr.top(), oldPos.x(), pr.bottom());
-      } else if (_mouse.lastGuidelineType == Y_ZOOMBOX) {
-        p.drawLine(pr.left(), oldPos.y(), pr.right(), oldPos.y());
-      }
+    
+  if (pr.contains(oldPos)) {
+    if (_mouse.lastGuidelineType == X_ZOOMBOX) {
+      p.drawLine(oldPos.x(), pr.top(), oldPos.x(), pr.bottom());
+    } else if (_mouse.lastGuidelineType == Y_ZOOMBOX) {
+      p.drawLine(pr.left(), oldPos.y(), pr.right(), oldPos.y());
     }
-    if (pr.contains(newPos)) {
+  }
+  
+  _mouse.lastGuideline = QPoint(-1, -1);
+
+  if (pr.contains(newPos)) {
+    printf("a\n");
+    if (gzType == X_ZOOMBOX) {
       p.drawLine(newPos.x(), pr.top(), newPos.x(), pr.bottom());
-    }
-  } else {
-    if (pr.contains(oldPos)) {
-      if (_mouse.lastGuidelineType == X_ZOOMBOX) {
-        p.drawLine(oldPos.x(), pr.top(), oldPos.x(), pr.bottom());
-      } else if (_mouse.lastGuidelineType == Y_ZOOMBOX) {
-        p.drawLine(pr.left(), oldPos.y(), pr.right(), oldPos.y());
-      }
-    }
-    if (pr.contains(newPos)) {
+      _mouse.lastGuidelineType = gzType;
+      _mouse.lastGuideline = newPos;    
+    } else if (gzType == Y_ZOOMBOX) {
       p.drawLine(pr.left(), newPos.y(), pr.right(), newPos.y());
+      _mouse.lastGuidelineType = gzType;
+      _mouse.lastGuideline = newPos;    
     }
   }
+  
   p.end();
-  _mouse.lastGuidelineType = gzType;
 }
 
 
@@ -4038,28 +4036,21 @@
     ButtonState s = e->stateAfter();
     if (s == 0) {
       updateXYGuideline(view, _mouse.lastGuideline, _mouse.tracker, pr, gzType);
-      _mouse.lastGuideline = _mouse.tracker;
     } else if (s & Qt::ShiftButton) {
       updateXYGuideline(view, _mouse.lastGuideline, _mouse.tracker, pr, Y_ZOOMBOX);
-      _mouse.lastGuideline = _mouse.tracker;
     } else if (s & Qt::ControlButton) {
       updateXYGuideline(view, _mouse.lastGuideline, _mouse.tracker, pr, X_ZOOMBOX);
-      _mouse.lastGuideline = _mouse.tracker;
     } else {
       updateXYGuideline(view, _mouse.lastGuideline, QPoint(-1, -1), pr, gzType);
-      _mouse.lastGuideline = QPoint(-1, -1);
     }
   } else if (gzType == XY_ZOOMBOX) {
-      ButtonState s = e->stateAfter();
+    ButtonState s = e->stateAfter();
     if (s & Qt::ShiftButton) {
       updateXYGuideline(view, _mouse.lastGuideline, _mouse.tracker, pr, Y_ZOOMBOX);
-      _mouse.lastGuideline = _mouse.tracker;
     } else if (s & Qt::ControlButton) {
       updateXYGuideline(view, _mouse.lastGuideline, _mouse.tracker, pr, X_ZOOMBOX);
-      _mouse.lastGuideline = _mouse.tracker;
     } else {
       updateXYGuideline(view, _mouse.lastGuideline, QPoint(-1, -1), pr, gzType);
-      _mouse.lastGuideline = QPoint(-1, -1);
     }
   }
 
@@ -4445,7 +4436,8 @@
   KstMouseModeType newType = globalZoomType();
   QPoint c = _mouse.lastLocation;
   QRect pr = GetPlotRegion();
-  int x = _mouse.pressLocation.x(), y = _mouse.pressLocation.y();
+  int x = _mouse.pressLocation.x();
+  int y = _mouse.pressLocation.y();
 
   if (newType == Y_ZOOMBOX) {
     if (c.y() > pr.bottom()) {
@@ -4495,6 +4487,13 @@
       p.drawWinFocusRect(_mouse.mouseRect());
     }
   }
+
+  if (e->key() == Key_Shift) {
+    updateXYGuideline(view, _mouse.lastGuideline, QPoint(-1, -1), GetPlotRegion(), Y_ZOOMBOX);
+  } else if (e->key() == Key_Control) {
+    updateXYGuideline(view, _mouse.lastGuideline, QPoint(-1, -1), GetPlotRegion(), X_ZOOMBOX);
+  }
+    
   setCursorForMode(view, newType, c);
   e->accept();
 }
@@ -5080,7 +5079,8 @@
 void Kst2DPlot::keyPressEvent(QWidget *vw, QKeyEvent *e) {
   KstViewWidget *view = static_cast<KstViewWidget*>(vw);
   bool handled = true;
-
+  bool paint = true;
+  
   ButtonState s = e->stateAfter();
   QPoint cursorPos = _mouse.tracker;
   switch (e->key()) {
@@ -5213,13 +5213,25 @@
         setDirty();
       }
       break;
+    case Key_Shift:
+      updateXYGuideline(view, _mouse.lastGuideline, _mouse.tracker, GetPlotRegion(), Y_ZOOMBOX);
+      setCursorForMode(view, Y_ZOOMBOX, _mouse.tracker);
+      paint = false;
+      break;
+    case Key_Control:
+      updateXYGuideline(view, _mouse.lastGuideline, _mouse.tracker, GetPlotRegion(), X_ZOOMBOX);
+      setCursorForMode(view, X_ZOOMBOX, _mouse.tracker);
+      paint = false;
+      break;
     default:
       handled = false;
       break;
   }
 
   if (handled) {
-    view->paint();
+    if (paint) {
+      view->paint();
+    }
     e->accept();
     //emit modified();
     return;