changeset 20088:ac59136f1f10

update fltk uimenu position when adding to figure * libinterp/dldfcn/__init_fltk__.cc (fltk_uimenu::update_position): new function (fltk_uimenu::add_to_menu): delay creating menus with pos <= 0, assign position value based on number of menus created. * scripts/gui/uimenu.m: assert position of 0 instead of 9
author John Donoghue <john.donoghue@ieee.org>
date Wed, 08 Apr 2015 21:07:04 -0400
parents 8b501a0db1e9
children cbba639b956b
files libinterp/dldfcn/__init_fltk__.cc scripts/gui/uimenu.m
diffstat 2 files changed, 56 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/dldfcn/__init_fltk__.cc	Thu Apr 02 17:16:03 2015 -0400
+++ b/libinterp/dldfcn/__init_fltk__.cc	Wed Apr 08 21:07:04 2015 -0400
@@ -1,5 +1,6 @@
 /*
 
+
 Copyright (C) 2007-2015 Shai Ayal
 Copyright (C) 2014-2015 Andreas Weber
 
@@ -503,6 +504,11 @@
       }
   }
 
+  void update_position (uimenu::properties& uimenup, int pos)
+  {
+    uimenup.get_property ("position").set (octave_value (static_cast<double> (pos)), true, false);
+  }
+
   void add_entry (uimenu::properties& uimenup)
   {
 
@@ -555,9 +561,11 @@
 
   void add_to_menu (uimenu::properties& uimenup)
   {
+    std::vector<int> delayed_menus;
     Matrix kids = find_uimenu_children (uimenup);
     int len = kids.length ();
     std::string fltk_label = uimenup.get_fltk_label ();
+    int count = 0;
 
     add_entry (uimenup);
     update_foregroundcolor (uimenup);
@@ -574,15 +582,39 @@
           {
             uimenu::properties& kprop = dynamic_cast<uimenu::properties&>
                                         (kgo.get_properties ());
+
+            // if no pos yet, delay adding menu until after other menus
+            int pos = kprop.get_position ();
+            if (pos <= 0)
+              delayed_menus.push_back ((len - (ii + 1))); 
+            else
+             {
+               add_to_menu (kprop);
+             }
+          }
+      }
+
+    // create any delayed menus
+    for (size_t ii = 0; ii < delayed_menus.size (); ii++)
+      {
+        graphics_object kgo = gh_manager::get_object (kids (delayed_menus[ii]));
+
+        if (kgo.valid_object ())
+          {
+            uimenu::properties& kprop = dynamic_cast<uimenu::properties&>
+                                        (kgo.get_properties ());
             add_to_menu (kprop);
+            update_position (kprop, ++count);
           }
       }
   }
 
   void add_to_menu (figure::properties& figp)
   {
+    std::vector<int> delayed_menus;
     Matrix kids = find_uimenu_children (figp);
     int len = kids.length ();
+    int count = 0;
     menubar->clear ();
     for (octave_idx_type ii = 0; ii < len; ii++)
       {
@@ -592,7 +624,30 @@
           {
             uimenu::properties& kprop = dynamic_cast<uimenu::properties&>
                                         (kgo.get_properties ());
+
+            // if no pos yet, delay adding menu until after other menus
+            int pos = kprop.get_position ();
+            if (pos <= 0)
+              delayed_menus.push_back ((len - (ii + 1))); 
+            else
+             {
+               add_to_menu (kprop);
+               update_position (kprop, ++count);
+             }
+          }
+      }
+
+    // create any delayed menus
+    for (size_t ii = 0; ii < delayed_menus.size (); ii++)
+      {
+        graphics_object kgo = gh_manager::get_object (kids (delayed_menus[ii]));
+
+        if (kgo.valid_object ())
+          {
+            uimenu::properties& kprop = dynamic_cast<uimenu::properties&>
+                                        (kgo.get_properties ());
             add_to_menu (kprop);
+            update_position (kprop, ++count);
           }
       }
   }
--- a/scripts/gui/uimenu.m	Thu Apr 02 17:16:03 2015 -0400
+++ b/scripts/gui/uimenu.m	Wed Apr 08 21:07:04 2015 -0400
@@ -113,7 +113,7 @@
 %!   assert (get (ui, "checked"), "off");
 %!   assert (get (ui, "separator"), "off");
 %!   assert (get (ui, "enable"), "on");
-%!   assert (get (ui, "position"), 9);
+%!   assert (get (ui, "position"), 0);
 %! unwind_protect_cleanup
 %!   close (hf);
 %!   graphics_toolkit (toolkit);