changeset 26902:cb5c1ea2062c

Fix regression with toolbar and status bar visibility (bug #55795) * Figure.[h,cc] (Figure::showFigureToolBar): Rename to showFigureStatusBar and only handle status bar visibility here. (Figure::Figure): Set position first according to the figure properties. Initialize m_statusBar, set it invisible and then call showFigureStatusBar if needed. (Figure::update): Handle ID_MENUBAR and ID_TOOLBAR the same way. (UpdateBoundingBoxData): Remove unnecessary struct data type. * __add_default_menu__.m: Add listener on figure "toolbar" property to make it visible when necessary.
author Pantxo Diribarne <pantxo.diribarne@gmail.com>
date Tue, 12 Mar 2019 09:21:54 +0100
parents f422fc45b52f
children 73b141d5a888
files libgui/graphics/Figure.cc libgui/graphics/Figure.h scripts/plot/util/private/__add_default_menu__.m
diffstat 3 files changed, 47 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/graphics/Figure.cc	Wed Mar 13 11:38:31 2019 -0400
+++ b/libgui/graphics/Figure.cc	Tue Mar 12 09:21:54 2019 +0100
@@ -97,10 +97,11 @@
 
     figure::properties& fp = properties<figure> ();
 
-    // Register for the signal that indicates when a window has moved
-    // to a different screen
-    connect (win, SIGNAL (figureWindowShown ()),
-             this, SLOT (figureWindowShown ()));
+    // Adjust figure position
+    m_innerRect = boundingBoxToRect (fp.get_boundingbox (true));
+    m_outerRect = boundingBoxToRect (fp.get_boundingbox (false));
+
+    set_geometry (m_innerRect);
 
     // Menubar
     m_menuBar = new MenuBar (win);
@@ -109,16 +110,11 @@
 
     // Status bar
     m_statusBar = win->statusBar ();
-    int boffset = 0;
+    m_statusBar->setVisible (false);
 
     if (fp.toolbar_is ("figure")
         || (fp.toolbar_is ("auto") && fp.menubar_is ("figure")))
-      boffset += m_statusBar->sizeHint ().height ();
-
-    m_innerRect = boundingBoxToRect (fp.get_boundingbox (true));
-    m_outerRect = boundingBoxToRect (fp.get_boundingbox (false));
-
-    set_geometry (m_innerRect.adjusted (0, 0, 0, boffset));
+      showFigureStatusBar (true);
 
     // Enable mouse tracking unconditionally
     enableMouseTracking ();
@@ -146,6 +142,11 @@
     connect (this, SIGNAL (asyncUpdate (void)),
              this, SLOT (updateContainer (void)));
 
+    // Register for the signal that indicates when a window has moved
+    // to a different screen
+    connect (win, SIGNAL (figureWindowShown ()),
+             this, SLOT (figureWindowShown ()));
+
     win->addReceiver (this);
     m_container->addReceiver (this);
   }
@@ -383,18 +384,14 @@
           }
         break;
 
+      case figure::properties::ID_MENUBAR:
       case figure::properties::ID_TOOLBAR:
         if (fp.toolbar_is ("none"))
-          showFigureToolBar (false);
+          showFigureStatusBar (false);
         else if (fp.toolbar_is ("figure"))
-          showFigureToolBar (true);
+          showFigureStatusBar (true);
         else  // "auto"
-          showFigureToolBar (fp.menubar_is ("figure"));
-        break;
-
-      case figure::properties::ID_MENUBAR:
-        if (fp.toolbar_is ("auto"))
-          showFigureToolBar (fp.menubar_is ("figure"));
+          showFigureStatusBar (fp.menubar_is ("figure"));
         break;
 
       case figure::properties::ID_KEYPRESSFCN:
@@ -442,23 +439,21 @@
   }
 
   void
-  Figure::showFigureToolBar (bool visible)
+  Figure::showFigureStatusBar (bool visible)
   {
-    if (m_figureToolBar
-        && (! m_figureToolBar->isHidden ()) != visible)
+    if (m_statusBar
+        && (! m_statusBar->isHidden ()) != visible)
       {
-        int dy1 = m_figureToolBar->sizeHint ().height ();
-        int dy2 = m_statusBar->sizeHint ().height ();
+        int dy = m_statusBar->sizeHint ().height ();
         QRect r = qWidget<QWidget> ()->geometry ();
 
         if (! visible)
-          r.adjust (0, dy1, 0, -dy2);
+          r.adjust (0, 0, 0, -dy);
         else
-          r.adjust (0, -dy1, 0, dy2);
+          r.adjust (0, 0, 0, dy);
 
         m_blockUpdates = true;
         set_geometry (r);
-        m_figureToolBar->setVisible (visible);
         m_statusBar->setVisible (visible);
         m_blockUpdates = false;
 
@@ -501,14 +496,6 @@
     return qWidget<QMainWindow> ()->menuBar ();
   }
 
-  struct UpdateBoundingBoxData
-  {
-    Matrix m_bbox;
-    bool m_internal;
-    graphics_handle m_handle;
-    Figure *m_figure;
-  };
-
   void
   Figure::updateBoundingBox (bool internal, int flags)
   {
@@ -709,7 +696,6 @@
       {
         QSize sz = bar->sizeHint ();
         QRect r = win->geometry ();
-        //qDebug () << "Figure::addCustomToolBar:" << r;
 
         r.adjust (0, -sz.height (), 0, 0);
 
@@ -719,7 +705,6 @@
         win->addToolBar (bar);
         m_blockUpdates = false;
 
-        //qDebug () << "Figure::addCustomToolBar:" << win->geometry ();
         updateBoundingBox (false);
       }
   }
--- a/libgui/graphics/Figure.h	Wed Mar 13 11:38:31 2019 -0400
+++ b/libgui/graphics/Figure.h	Tue Mar 12 09:21:54 2019 +0100
@@ -97,7 +97,7 @@
     void beingDeleted (void);
 
   private:
-    void showFigureToolBar (bool visible);
+    void showFigureStatusBar (bool visible);
     void addCustomToolBar (QToolBar *bar, bool visible, bool isdefault);
     void showCustomToolBar (QToolBar *bar, bool visible);
     void set_geometry (QRect r);
--- a/scripts/plot/util/private/__add_default_menu__.m	Wed Mar 13 11:38:31 2019 -0400
+++ b/scripts/plot/util/private/__add_default_menu__.m	Tue Mar 12 09:21:54 2019 +0100
@@ -137,9 +137,6 @@
          "offcallback", {@mouse_tools_cb, ht, "text"});
   endif
 
-  ## Add/Restore figure listeners
-  toggle_visibility_cb (hf, [], hmenu);
-  addlistener (hf, "menubar", {@toggle_visibility_cb, hmenu});
 
   if (! exist ("ht", "var"))
     ht = get (htb, "children")(end:-1:1);
@@ -147,17 +144,26 @@
     ht(! istoggletool) = [];
   endif
 
+  ## Add/Restore figure listeners
+  toggle_visibility_cb (hf, [], hmenu, htb);
+  addlistener (hf, "menubar", {@toggle_visibility_cb, hmenu, htb});
+  addlistener (hf, "toolbar", {@toggle_visibility_cb, hmenu, htb});
   addlistener (hf, "__mouse_mode__", {@mouse_tools_cb, ht, "mode"});
   addlistener (hf, "__zoom_mode__", {@mouse_tools_cb, ht, "mode"});
 
 endfunction
 
-function toggle_visibility_cb (hf, ~, hmenu)
-  if (strcmp (get (hf, "menubar"), "none"))
-    set (hmenu, "visible", "off")
-  else
-    set (hmenu, "visible", "on")
+function toggle_visibility_cb (hf, ~, hmenu, htb)
+  menu_state = ifelse (strcmp (get (hf, "menubar"), "figure"), "on", "off");
+  toolbar_state = "on";
+  if (strcmp (get (hf, "toolbar"), "auto"))
+    toolbar_state = menu_state;
+  elseif (strcmp (get (hf, "toolbar"), "none"))
+    toolbar_state = "off";
   endif
+  
+  set (hmenu, "visible", menu_state);
+  set (htb, "visible", toolbar_state);
 endfunction
 
 function open_cb (h, e)
@@ -231,13 +237,13 @@
   set (hf, "__pan_mode__", struct ("Enable", "off",
                                    "Motion", "both",
                                    "FigureHandle", hf),
-       "__rotate_mode__", struct ("Enable", "off",
-                                  "RotateStyle", "box",
-                                  "FigureHandle", hf),
-       "__zoom_mode__", struct ("Enable", "off",
-                                "Motion", "both",
-                                "Direction", "in",
-                                "FigureHandle", hf));
+           "__rotate_mode__", struct ("Enable", "off",
+                                      "RotateStyle", "box",
+                                      "FigureHandle", hf),
+           "__zoom_mode__", struct ("Enable", "off",
+                                    "Motion", "both",
+                                    "Direction", "in",
+                                    "FigureHandle", hf));
 endfunction
 
 function guimode_cb (h, e)
@@ -319,7 +325,7 @@
             set (hf, "__mouse_mode__" , "zoom");
           endif
           val.Enable = state;
-          set (hf, prop, val)
+          set (hf, prop, val);
 
         case {"pan", "rotate"}
           prop = ["__", typ, "_mode__"];
@@ -354,7 +360,7 @@
     if (strcmp (get (hax, "visible"), "on"))
       set (hax, "visible", "off");
     else
-      set (hax, "visible", "on")
+      set (hax, "visible", "on");
     endif
   endif
 endfunction
@@ -365,7 +371,7 @@
     if (strcmp (get (hax, "xgrid"), "on") && strcmp (get (hax, "ygrid"), "on"))
       grid (hax, "off");
     else
-      grid (hax, "on")
+      grid (hax, "on");
     endif
   endif
 endfunction