# HG changeset patch # User John Donoghue # Date 1428541624 14400 # Node ID ac59136f1f10967e12f7619bf3f1cd2b0925209a # Parent 8b501a0db1e919a104210a26faf4b5091f7d4b07 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 diff -r 8b501a0db1e9 -r ac59136f1f10 libinterp/dldfcn/__init_fltk__.cc --- 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 (pos)), true, false); + } + void add_entry (uimenu::properties& uimenup) { @@ -555,9 +561,11 @@ void add_to_menu (uimenu::properties& uimenup) { + std::vector 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 (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 + (kgo.get_properties ()); add_to_menu (kprop); + update_position (kprop, ++count); } } } void add_to_menu (figure::properties& figp) { + std::vector 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 (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 + (kgo.get_properties ()); add_to_menu (kprop); + update_position (kprop, ++count); } } } diff -r 8b501a0db1e9 -r ac59136f1f10 scripts/gui/uimenu.m --- 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);