diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2010-02-26 13:03:21 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2010-02-26 13:03:21 +0000 |
| commit | 4a802a315952a1392a82e3dc42c7316b540320f9 (patch) | |
| tree | fb600b123307a93ee0532fdc976df353f8ecdc62 | |
| parent | 47bcd46d26814b78897b315325b83de57bc78d1d (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-- | CHANGES | 2 | ||||
| -rw-r--r-- | FL/Fl_Menu_.H | 1 | ||||
| -rw-r--r-- | fluid/fluid.cxx | 49 | ||||
| -rw-r--r-- | src/Fl_Menu_.cxx | 36 |
4 files changed, 61 insertions, 27 deletions
@@ -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 |
