changeset 17142:e4968b4613a5

Overhaul default menubar (still not perfect). * scripts/plot/figure.m: Always call __add_default_menu__. * scripts/plot/private/__add_default_menu__.m: Check that toolkit is FLTK before proceeding. Don't do redundant check that input is figure handle. Don't turn off handlevisibility for submenus, they are already hidden from above. Restrict findall() search to a depth of 1. Add __default_menu__ tags to Edit and Help menus so they can be identified. Don't call drawnow unnecessarily in callback routines. Use gcbf() so that Save filename is stored on a per figure basis rather than globally. Eliminate assigning to unused variables. Add HACK to turn off menubar if property is set to "none" on figure.
author Rik <rik@octave.org>
date Thu, 01 Aug 2013 10:18:54 -0700
parents 723a08d266d2
children 603ce503babd
files scripts/plot/figure.m scripts/plot/private/__add_default_menu__.m
diffstat 2 files changed, 55 insertions(+), 51 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/figure.m
+++ b/scripts/plot/figure.m
@@ -97,9 +97,7 @@
     print_usage ();
   endif
 
-  if (strcmp (get (f, "__graphics_toolkit__"), "fltk"))
-    __add_default_menu__ (f);
-  endif
+  __add_default_menu__ (f);
 
   if (nargout > 0)
     h = f;
--- a/scripts/plot/private/__add_default_menu__.m
+++ b/scripts/plot/private/__add_default_menu__.m
@@ -19,48 +19,49 @@
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {} __add_default_menu__ (@var{fig})
 ## Add default menu to figure.  All uimenu handles have
-## set their property "handlevisibility" to "off".
+## their "HandleVisibility" property set to "off".
 ## @end deftypefn
 
 ## Author: Kai Habel
 
 function __add_default_menu__ (fig)
 
-  if (isfigure (fig))
-    obj = findall (fig, "label", "&File", "tag", "__default_menu__");
-    if (length (obj) == 0)
-      __f = uimenu (fig, "label", "&File", "handlevisibility", "off", "tag", "__default_menu__");
-        sa = uimenu (__f, "label", "Save &As", "handlevisibility", "off",
-                          "callback", @save_cb);
-        sv = uimenu (__f, "label", "&Save", "handlevisibility", "off",
-                          "callback", @save_cb);
-        cl = uimenu (__f, "label", "&Close", "handlevisibility", "off",
-                          "callback", "close(gcf)");
-
-      __e = uimenu (fig, "label", "&Edit", "handlevisibility", "off");
-        gr = uimenu (__e, "label", "&Grid", "handlevisibility", "off",
-                          "callback", @grid_cb);
-        as = uimenu (__e, "label", "Auto&scale", "handlevisibility", "off",
-                          "callback", @autoscale_cb);
-        gm = uimenu (__e, "label", "GUI &Mode", "handlevisibility", "off");
-          gm2 = uimenu (gm, "label", "Pan+Zoom", "handlevisibility", "off",
-                            "callback", @guimode_cb);
-          gm3 = uimenu (gm, "label", "Rotate+Zoom", "handlevisibility", "off",
-                            "callback", @guimode_cb);
-          gmn = uimenu (gm, "label", "None", "handlevisibility", "off",
-                            "callback", @guimode_cb);
-      __h = uimenu (fig, "label", "&Help", "handlevisibility", "off");
-        ab = uimenu (__h, "label", "A&bout", "handlevisibility", "off", "enable", "off");
-    endif
-  else
-    error ("expecting figure handle", "handlevisibility", "off");
+  ## Only FLTK toolkit currently provides menubar
+  if (! strcmp (get (fig, "__graphics_toolkit__"), "fltk"))
+    return;
   endif
 
-endfunction
+  obj = findall (fig, "-depth", 1, "tag", "__default_menu__", "label", "&File");
+  if (isempty (obj))
+    ## FIXME: uimenu() will cause menubar to be displayed, even though property
+    ##        menubar remains set at "none".  So, forcibly turn menubar status
+    ##        on and then off to force figure to hide menubar.
+    menubar_state = get (fig, "menubar");
+    set (fig, "menubar", "figure");
+    drawnow ();
+
+    __f = uimenu (fig, "label", "&File", "handlevisibility", "off",
+                       "tag", "__default_menu__");
+      uimenu (__f, "label", "Save &As", "callback", @save_cb);
+      uimenu (__f, "label", "&Save", "callback", @save_cb);
+      uimenu (__f, "label", "&Close", "callback", "close (gcf)");
 
-function grid_cb (h, e)
-  grid;
-  drawnow; # should not be required
+    __e = uimenu (fig, "label", "&Edit", "handlevisibility", "off",
+                       "tag", "__default_menu__");
+      uimenu (__e, "label", "&Grid", "callback", @grid_cb);
+      uimenu (__e, "label", "Auto&scale", "callback", @autoscale_cb);
+      gm = uimenu (__e, "label", "GUI &Mode");
+        uimenu (gm, "label", "Pan+Zoom", "callback", @guimode_cb);
+        uimenu (gm, "label", "Rotate+Zoom", "callback", @guimode_cb);
+        uimenu (gm, "label", "None", "callback", @guimode_cb);
+
+    __h = uimenu (fig, "label", "&Help", "handlevisibility", "off",
+                       "tag", "__default_menu__");
+      uimenu (__h, "label", "A&bout", "enable", "off");
+
+    set (fig, "menubar", menubar_state);
+  endif
+
 endfunction
 
 function save_cb (h, e)
@@ -78,32 +79,37 @@
 endfunction
 
 function __save_as__ (caller)
-
-  [filename, filedir] = uiputfile ({"*.pdf;*.ps;*.gif;*.png;*.jpg","Supported Graphic Formats"},
-                                  "Save Figure",
-                                  pwd);
+  [filename, filedir] = uiputfile ({"*.pdf;*.ps;*.gif;*.png;*.jpg",
+                                    "Supported Graphic Formats"},
+                                   "Save Figure",
+                                   pwd);
   if (filename != 0)
-    fname = strcat (filedir, filesep, filename);
-    obj = findall ("label", "&Save");
-    if (length (obj) > 0)
+    fname = [filedir filesep() filename];
+    obj = findall (gcbf, "label", "&Save");
+    if (! isempty (obj))
       set (obj(1), "userdata", fname);
     endif
     saveas (caller, fname);
   endif
 endfunction
 
+function grid_cb (h, e)
+  grid;
+endfunction
+
 function autoscale_cb (h, e)
   axis ("auto");
-  drawnow; #should not be required
 endfunction
 
 function guimode_cb (h, e)
   lbl = get (h, "label");
-  if (strncmp (lbl, "Pan+Zoom", 8))
-    gui_mode ("2D");
-  elseif (strncmp (lbl, "Rotate+Zoom", 11))
-    gui_mode ("3D");
-  elseif (strncmp (lbl, "None", 4))
-    gui_mode ("None");
-  endif
+  switch (lbl)
+    case "Pan+Zoom"
+      gui_mode ("2D");
+    case "Rotate+Zoom"
+      gui_mode ("3D");
+    case "None"
+      gui_mode ("None");
+  endswitch
 endfunction
+