diff scripts/plot/util/rotate3d.m @ 19697:dfea01b3425f

more mouse interaction features for Qt plotting widget * graphics.in.h, graphics.cc (figure::properties::__mouse_mode__, figure::properties::__pan_mode__, figure::properties::__rotate_mode__, figure::properties::__zoom_mode__): New properties. (figure::properties::set___mouse_mode__): New function. (axes::properties::pan, axes::properties::rotate3d, axes::properties::zoom): New functions. Handle zoom, and pan modes. (axes::properties::clear_zoom_stack): New arg, do_unzoom. Conditionally call unzoom. (axes::properties::unzoom): Also restore view property. (axes::properties::rotate_view): Conditionall save state to zoom stack. (axes::properties::push_zoom_stack): New function. (axes::properties::pan, axes::properties::rotate3d): Delete properties. (axes::properties::update_xlim, axes::properties::update_ylim, axes::properties::update_zlim): Don't clear zoom stack. Delete do_clr_zoom argument. (axes::properties::set_pan, axes::properties::set_rotate3d): Delete. (F__zoom__): New function. * Canvas.h, Canvas.cc (Canvas::toggleAxes, Canvas::toggleGrid): New pure virtual functions. (Canvas::setCursor, Canvas::canvasToggleAxes, Canvas::canvasToggleGrid, Canvas::canvasMouseDoubleClickEvent, Canvas::canvasWheelEvent): New functions. (zoom_enabled, pan_enabled, pan_mode, rotate_enabled, rotate_mode): New static functions. (Canvas::canvasMouseMoveEvent): Call axes::properties::rotate3d to do rotation. Handle panning. (Canvas::canvasMousePressEvent): Also handle "unzoom" action when in pan and rotate modes. (Canvas::canvasMouseReleaseEvent): Zoom by factor if mouse has not moved from mouse press event. * Figure.h, Figure.cc (MouseMode): New enum value, TextMode. (Figure::m_mouseMode, Figure::m_lastMouseMode): Delete member variables. (Figure::mouseMode, Figure::setMouseMode): Get info from and save info to figure properties. (Figure::updateFigureToolBarAndMenuBar, Figure::toggleAxes, Figure::toggleGrid): New functions. (Figure::m_mouseModeGroup): New member variable. (Figure::createFigureToolBarAndMenuBar): Add actions for toggling Axes and Grid. Maintain pointer to MouseModeActionGroup. (mouse_mode_to_string, mouse_mode_from_string): New functions. * GLCanvas.h, GLCanvas.cc (GLCanvas::toggleAxes, GLCanvas::ToggleGrid, GLCanvas::mouseDoubleClickEvent, GLCanvas::wheelEvent): New functions. * MouseModeActionGroup.h, MouseModeActionGroup.cc (MouseModeActionGroup::mouseMode): Delete. (MouseModeActionGroup::setMode): New function. (MouseModeActionGroup::MouseModeActionGroup): Also include action to insert text in the list. * figure.m: Set default pan, rotate, and zoom mode properties for the figure object. * pan.m, rotate3d.m, zoom.m: Improve compatibility with Matlab. Set mode properties for figure. * __init_fltk__.cc: Cope with changes to graphics properties.
author John W. Eaton <jwe@octave.org>
date Fri, 06 Feb 2015 13:06:54 -0500
parents 0f9c5a15c8fa
children 4197fc428c7d
line wrap: on
line diff
--- a/scripts/plot/util/rotate3d.m	Fri Feb 06 08:31:49 2015 -0800
+++ b/scripts/plot/util/rotate3d.m	Fri Feb 06 13:06:54 2015 -0500
@@ -20,53 +20,85 @@
 ## @deftypefn  {Command} {} rotate3d
 ## @deftypefnx {Command} {} rotate3d on
 ## @deftypefnx {Command} {} rotate3d off
-## @deftypefnx {Function File} {} rotate3d (@var{hax}, @dots{})
-## Control 3-D rotation mode of interactive graph in GUI.
+## @deftypefnx {Function File} {} rotate3d (@var{hfig}, @var{option})
+## Control the interactive 3-D rotation mode of a figure in the GUI.
 ##
-## The function state input may be either @qcode{"on"} or @qcode{"off"}
-## and can only be set for 3-D plots.
+## Given the option @qcode{"on"} or @qcode{"off"}, set the interactive
+## rotate mode on or off.
 ##
-## If the first argument @var{hax} is an axes handle, then operate on
-## this axis rather than the current axes returned by @code{gca}.
+## With no arguments, toggle the current rotate mode on or off.
 ##
-## To query the current mode use the @code{get} function.  For example:
+## If the first argument @var{hfig} is a figure, then operate on
+## the given figure rather than the current figure as returned by
+## @code{gcf}.
 ##
-## @example
-## mode = get (gca, "rotate3d");
-## @end example
 ## @seealso{pan, zoom}
 ## @end deftypefn
 
 function rotate3d (varargin)
 
-  if (numel (varargin) > 0 && isaxes (varargin{1}))
-    hax = varargin{1};
-    varargin(1) = [];
-  else
-    hax = gca ();
+  hfig = NaN;
+
+  nargs = nargin;
+
+  if (nargs > 2)
+    print_usage ();
+  endif
+
+  if (nargin == 1 && nargout > 0 && isfigure (varargin{1}))
+    error ("rotate_object_handle = rotate3d (hfig): not implemented");
   endif
 
-  toolkit = get (ancestor (hax, "figure"), "__graphics_toolkit__");
-  if (! strcmp (toolkit, "fltk"))
-    warning ("rotate3d: Only implemented for graphics_toolkit FLTK");
+  if (nargs == 2)
+    hfig = varargin{1};
+    if (isfigure (hfig))
+      varargin(1) = [];
+      nargs--;
+    else
+      error ("rotate3d: expecting figure handle as first argument");
+    endif
+  endif
+
+  if (isnan (hfig))
+    hfig = gcf ();
   endif
 
-  ndims = __calc_dimensions__ (hax);
-  if (ndims == 2)
-    warning ("rotate3d: Only available for 3D plots");
-  else
-    if (numel (varargin) > 1)
-      print_usage ();
-    elseif (numel (varargin) == 0)
-      # toggle
-      m = get (hax, "pan");
-      if (strcmp (get (hax, "rotate3d"), "on"))
-        set (hax, "rotate3d", "off");
-      else
-        set (hax, "rotate3d", "on");
-      endif
-    elseif (numel (varargin) == 1)
-      set (hax, "rotate3d", varargin{1});
+  if (nargs == 0)
+    rm = get (hfig, "__rotate_mode__");
+    if (strcmp (rm.Enable, "on"))
+      rm.Enable = "off";
+    else
+      rm.Enable = "on";
+    endif
+    set (hfig, "__rotate_mode__", rm);
+  elseif (nargs == 1)
+    arg = varargin{1};
+    if (ischar (arg))
+      switch (arg)
+        case {"on", "off"}
+          rm = get (hfig, "__rotate_mode__");
+          switch (arg)
+            case {"on", "off"}
+              rm.Enable = arg;
+              rm.Motion = "both";
+          endswitch
+          set (hfig, "__rotate_mode__", rm);
+          if (strcmp (arg, "off"))
+            set (hfig, "__mouse_mode__", "none");
+          else
+            ## FIXME: Is there a better way other than calling these
+            ## functions to set the other mouse mode Enable fields to
+            ## "off"?
+            pan ("off");
+            zoom ("off");
+            set (hfig, "__mouse_mode__", "rotate");
+          endif
+
+        otherwise
+          error ("rotate3d: unrecognized option '%s'", arg);
+      endswitch
+    else
+      error ("rotate3d: wrong type argument '%s'", class (arg));
     endif
   endif