diff libgui/graphics/Canvas.cc @ 19867:6ba3d0f7c6e8

improve mouse zooming for Qt plotting (bug #44302) * Figure.h (enum MouseMode): Split ZoomMode into ZoomInMode and ZoomOutMode. Change all uses. * Canvas.cc (Canvas::canvasMouseReleaseEvent, Canvas::canvasWheelEvent): Make meaning of zoom factor consistent with zoom function. Make direction of wheel event consistent with other programs. * __init_fltk__.cc (plot_window::handle): Make meaning of zoom factor consistent with zoom function. * MouseModeActionGroup.cc (MouseModeActionGroup::MouseModeActionGroup): Provide buttons for zooming in and out. * graphics.cc (figure::properties::set_toolkit): Handle zoom direction. (do_zoom): Make factor > 1 zoom in.
author John W. Eaton <jwe@octave.org>
date Thu, 26 Feb 2015 19:24:59 -0500
parents 98cc7c741c5a
children 815db217f6f4
line wrap: on
line diff
--- a/libgui/graphics/Canvas.cc	Thu Feb 26 13:54:11 2015 -0500
+++ b/libgui/graphics/Canvas.cc	Thu Feb 26 19:24:59 2015 -0500
@@ -71,7 +71,8 @@
           w->setCursor (Qt::OpenHandCursor);
           break;
 
-        case ZoomMode:
+        case ZoomInMode:
+        case ZoomOutMode:
           // FIXME: distinguish zoom in/out.
           w->setCursor (QBitmap (":/images/zoom.png"));
           break;
@@ -206,7 +207,7 @@
 
       draw (m_handle);
 
-      if (m_mouseMode == ZoomMode && m_mouseAxes.ok ())
+      if (m_mouseMode == ZoomInMode && m_mouseAxes.ok ())
         drawZoomBox (m_mouseAnchor, m_mouseCurrent);
     }
 }
@@ -235,7 +236,8 @@
           }
           break;
 
-        case ZoomMode:
+        case ZoomInMode:
+        case ZoomOutMode:
           m_mouseCurrent = event->pos ();
           redraw (true);
           break;
@@ -546,7 +548,8 @@
 
         case PanMode:
         case RotateMode:
-        case ZoomMode:
+        case ZoomInMode:
+        case ZoomOutMode:
           if (axesObj)
             {
               bool redraw_figure = true;
@@ -609,7 +612,8 @@
 
 void Canvas::canvasMouseReleaseEvent (QMouseEvent* event)
 {
-  if (m_mouseMode == ZoomMode && m_mouseAxes.ok ())
+  if ((m_mouseMode == ZoomInMode || m_mouseMode == ZoomOutMode)
+      && m_mouseAxes.ok ())
     {
       gh_manager::auto_lock lock;
       graphics_object ax = gh_manager::get_object (m_mouseAxes);
@@ -626,9 +630,7 @@
 
           if (m_mouseAnchor == event->pos ())
             {
-              // FIXME: check direction here.
-
-              double factor = 2.0;
+              double factor = m_mouseMode == ZoomInMode ? 2.0 : 0.5;
 
               ap.zoom (zm, factor);
             }
@@ -720,7 +722,10 @@
 
               if (zoom_enabled (figObj))
                 {
-                  newMouseMode = ZoomMode;
+                  if (event->delta () > 0)
+                    newMouseMode = ZoomInMode;
+                  else
+                    newMouseMode = ZoomOutMode;
 
                   mode = zoom_mode (figObj);
                 }
@@ -736,7 +741,8 @@
 
           switch (newMouseMode)
             {
-            case ZoomMode:
+            case ZoomInMode:
+            case ZoomOutMode:
               {
                 axes::properties& ap = Utils::properties<axes> (axesObj);
 
@@ -744,21 +750,13 @@
                 double wheel_zoom_speed = ap.get_mousewheelzoom ();
 
                 // Determine if we're zooming in or out.
-                double factor = (event->delta () > 0
+                double factor = (newMouseMode == ZoomInMode
                                  ? 1 / (1.0 - wheel_zoom_speed)
                                  : 1.0 - wheel_zoom_speed);
 
-                ap.zoom (mode, factor);
+                // FIXME: should we zoom about point for 2D plots?
 
-#if 0
-                Matrix view = ap.get_view ().matrix_value ();
-                if (view(1) != 90)
-                  {
-                    Matrix zlimits = ap.get_zlim ().matrix_value ();
-                    zlimits = factor * zlimits;
-                    ap.set_zlim (zlimits);
-                  }
-#endif
+                ap.zoom (mode, factor);
               }
               break;