summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2010-02-26 13:03:21 +0000
committerMatthias Melcher <fltk@matthiasm.com>2010-02-26 13:03:21 +0000
commit4a802a315952a1392a82e3dc42c7316b540320f9 (patch)
treefb600b123307a93ee0532fdc976df353f8ecdc62
parent47bcd46d26814b78897b315325b83de57bc78d1d (diff)
Fixed menu item counting issue in Fluid (STR #2322), Added Fl_Menu_::find_item by callback
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7150 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-rw-r--r--CHANGES2
-rw-r--r--FL/Fl_Menu_.H1
-rw-r--r--fluid/fluid.cxx49
-rw-r--r--src/Fl_Menu_.cxx36
4 files changed, 61 insertions, 27 deletions
diff --git a/CHANGES b/CHANGES
index 97572ed6d..39697fe71 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,7 @@
CHANGES IN FLTK 1.3.0
+ - Fixed menu item counting issue in Fluid (STR #2322)
+ - Added Fl_Menu_::find_item by callback
- Removed redundant Fl_Group casts
- Added indexing to Fl_Preferences
- Integrated default menu into Demo test app
diff --git a/FL/Fl_Menu_.H b/FL/Fl_Menu_.H
index 27812bb80..20ec75e7d 100644
--- a/FL/Fl_Menu_.H
+++ b/FL/Fl_Menu_.H
@@ -65,6 +65,7 @@ public:
int item_pathname(char *name, int namelen, const Fl_Menu_Item *finditem=0) const;
const Fl_Menu_Item* picked(const Fl_Menu_Item*);
const Fl_Menu_Item* find_item(const char *name);
+ const Fl_Menu_Item* find_item(Fl_Callback*);
const Fl_Menu_Item* test_shortcut() {return picked(menu()->test_shortcut());}
void global();
diff --git a/fluid/fluid.cxx b/fluid/fluid.cxx
index 49f8b50cd..abab5455b 100644
--- a/fluid/fluid.cxx
+++ b/fluid/fluid.cxx
@@ -111,6 +111,11 @@ void update_history(const char *);
// Shell command support...
void show_shell_window();
+Fl_Menu_Item *save_item = 0L;
+Fl_Menu_Item *history_item = 0L;
+Fl_Menu_Item *widgetbin_item = 0L;
+Fl_Menu_Item *sourceview_item = 0L;
+
////////////////////////////////////////////////////////////////
static const char *filename;
@@ -1623,7 +1628,6 @@ Fl_Menu_Item Main_Menu[] = {
{"&New...", FL_COMMAND+'n', new_cb, 0},
{"&Open...", FL_COMMAND+'o', open_cb, 0},
{"&Insert...", FL_COMMAND+'i', open_cb, (void*)1, FL_MENU_DIVIDER},
-#define SAVE_ITEM 4
{"&Save", FL_COMMAND+'s', save_cb, 0},
{"Save &As...", FL_COMMAND+FL_SHIFT+'s', save_cb, (void*)1},
{"Sa&ve A Copy...", 0, save_cb, (void*)2},
@@ -1632,7 +1636,6 @@ Fl_Menu_Item Main_Menu[] = {
{"&Print...", FL_COMMAND+'p', print_menu_cb},
{"Write &Code...", FL_COMMAND+FL_SHIFT+'c', write_cb, 0},
{"&Write Strings...", FL_COMMAND+FL_SHIFT+'w', write_strings_cb, 0, FL_MENU_DIVIDER},
-#define HISTORY_ITEM 12
{relative_history[0], FL_COMMAND+'0', open_history_cb, absolute_history[0]},
{relative_history[1], FL_COMMAND+'1', open_history_cb, absolute_history[1]},
{relative_history[2], FL_COMMAND+'2', open_history_cb, absolute_history[2]},
@@ -1662,9 +1665,7 @@ Fl_Menu_Item Main_Menu[] = {
{"&Group", FL_F+7, group_cb},
{"Ung&roup", FL_F+8, ungroup_cb,0, FL_MENU_DIVIDER},
{"Hide O&verlays",FL_COMMAND+FL_SHIFT+'o',toggle_overlays},
-#define WIDGETBIN_ITEM 41
{"Show Widget &Bin...",FL_ALT+'b',toggle_widgetbin_cb},
-#define SOURCEVIEW_ITEM 42
{"Show Source Code...",FL_ALT+FL_SHIFT+'s', (Fl_Callback*)toggle_sourceview_cb, 0, FL_MENU_DIVIDER},
{"Pro&ject Settings...",FL_ALT+'p',show_project_cb},
{"GU&I Settings...",FL_ALT+FL_SHIFT+'p',show_settings_cb},
@@ -1754,10 +1755,10 @@ void toggle_widgetbin_cb(Fl_Widget *, void *) {
if (widgetbin_panel->visible()) {
widgetbin_panel->hide();
- Main_Menu[WIDGETBIN_ITEM].label("Show Widget &Bin...");
+ widgetbin_item->label("Show Widget &Bin...");
} else {
widgetbin_panel->show();
- Main_Menu[WIDGETBIN_ITEM].label("Hide Widget &Bin");
+ widgetbin_item->label("Hide Widget &Bin");
}
}
@@ -1781,10 +1782,10 @@ void toggle_sourceview_cb(Fl_Double_Window *, void *) {
if (sourceview_panel->visible()) {
sourceview_panel->hide();
- Main_Menu[SOURCEVIEW_ITEM].label("Show Source Code...");
+ sourceview_item->label("Show Source Code...");
} else {
sourceview_panel->show();
- Main_Menu[SOURCEVIEW_ITEM].label("Hide Source Code...");
+ sourceview_item->label("Hide Source Code...");
update_sourceview_cb(0,0);
}
}
@@ -1801,9 +1802,6 @@ void make_main_window() {
fluid_prefs.get("show_guides", show_guides, 0);
fluid_prefs.get("widget_size", Fl_Widget_Type::default_size, 14);
fluid_prefs.get("show_comments", show_comments, 1);
-
- load_history();
-
make_layout_window();
make_settings_window();
make_shell_window();
@@ -1819,10 +1817,19 @@ void make_main_window() {
main_window->resizable(o);
main_menubar = new Fl_Menu_Bar(0,0,BROWSERWIDTH,MENUHEIGHT);
main_menubar->menu(Main_Menu);
+ // quick access to all dynamic menu items
+ save_item = (Fl_Menu_Item*)main_menubar->find_item(save_cb);
+ history_item = (Fl_Menu_Item*)main_menubar->find_item(open_history_cb);
+ widgetbin_item = (Fl_Menu_Item*)main_menubar->find_item(toggle_widgetbin_cb);
+ sourceview_item = (Fl_Menu_Item*)main_menubar->find_item((Fl_Callback*)toggle_sourceview_cb);
main_menubar->global();
fill_in_New_Menu();
main_window->end();
}
+
+ if (!compile_only) {
+ load_history();
+ }
}
// Load file history from preferences...
@@ -1841,14 +1848,14 @@ void load_history() {
fl_filename_relative(relative_history[i], sizeof(relative_history[i]),
absolute_history[i]);
- if (i == 9) Main_Menu[i + HISTORY_ITEM].flags = FL_MENU_DIVIDER;
- else Main_Menu[i + HISTORY_ITEM].flags = 0;
+ if (i == 9) history_item[i].flags = FL_MENU_DIVIDER;
+ else history_item[i].flags = 0;
} else break;
}
for (; i < 10; i ++) {
- if (i) Main_Menu[i + HISTORY_ITEM - 1].flags |= FL_MENU_DIVIDER;
- Main_Menu[i + HISTORY_ITEM].hide();
+ if (i) history_item[i-1].flags |= FL_MENU_DIVIDER;
+ history_item[i].hide();
}
}
@@ -1891,15 +1898,15 @@ void update_history(const char *flname) {
for (i = 0; i < max_files; i ++) {
fluid_prefs.set( Fl_Preferences::Name("file%d", i), absolute_history[i]);
if (absolute_history[i][0]) {
- if (i == 9) Main_Menu[i + HISTORY_ITEM].flags = FL_MENU_DIVIDER;
- else Main_Menu[i + HISTORY_ITEM].flags = 0;
+ if (i == 9) history_item[i].flags = FL_MENU_DIVIDER;
+ else history_item[i].flags = 0;
} else break;
}
for (; i < 10; i ++) {
fluid_prefs.set( Fl_Preferences::Name("file%d", i), "");
- if (i) Main_Menu[i + HISTORY_ITEM - 1].flags |= FL_MENU_DIVIDER;
- Main_Menu[i + HISTORY_ITEM].hide();
+ if (i) history_item[i-1].flags |= FL_MENU_DIVIDER;
+ history_item[i].hide();
}
}
@@ -2270,8 +2277,8 @@ void set_modflag(int mf) {
}
// Enable/disable the Save menu item...
- if (modflag) Main_Menu[SAVE_ITEM].activate();
- else Main_Menu[SAVE_ITEM].deactivate();
+ if (modflag) save_item->activate();
+ else save_item->deactivate();
}
////////////////////////////////////////////////////////////////
diff --git a/src/Fl_Menu_.cxx b/src/Fl_Menu_.cxx
index 0775ecfce..62c73600e 100644
--- a/src/Fl_Menu_.cxx
+++ b/src/Fl_Menu_.cxx
@@ -99,11 +99,10 @@ int Fl_Menu_::item_pathname(char *name, int namelen, const Fl_Menu_Item *findite
}
/**
- Find menu item index, given a menu pathname such as "Edit/Copy".
-
- Will also return submenu items, eg. "Edit".
-
- Returns NULL if not found.
+ Find menu item index, given a menu pathname such as "Edit/Copy".
+
+ This method finds a menu item in a menu array, also traversing submenus, but
+ not submenu pointers.
\b Example:
\code
@@ -121,8 +120,11 @@ int Fl_Menu_::item_pathname(char *name, int namelen, const Fl_Menu_Item *findite
}
\endcode
\returns The item found, or NULL if not found.
- \see item_pathname()
+ \see
+ \param name path and name of the menu item
+ \return NULL if not found
+ \see Fl_Menu_::find_item(Fl_Callback*), item_pathname()
*/
const Fl_Menu_Item * Fl_Menu_::find_item(const char *name) {
char menupath[1024] = ""; // File/Export
@@ -158,6 +160,28 @@ const Fl_Menu_Item * Fl_Menu_::find_item(const char *name) {
}
/**
+ Find menu item index given a callback.
+
+ This method finds a menu item in a menu array, also traversing submenus, but
+ not submenu pointers. This is useful if an application uses
+ internationalisation and a menu item can not be found using its label. This
+ search is also much faster.
+
+ \param cb find the first item with this callback
+ \return NULL if not found
+ \see Fl_Menu_::find_item(const char*)
+ */
+const Fl_Menu_Item * Fl_Menu_::find_item(Fl_Callback *cb) {
+ for ( int t=0; t < size(); t++ ) {
+ const Fl_Menu_Item *m = menu_ + t;
+ if (m->callback_==cb) {
+ return m;
+ }
+ }
+ return (const Fl_Menu_Item *)0;
+}
+
+/**
The value is the index into menu() of the last item chosen by
the user. It is zero initially. You can set it as an integer, or set
it with a pointer to a menu item. The set routines return non-zero if