On 04/09/13 07:08, Roman Kantor wrote:
> I have got a number of complains from end users how the menu items behave -
> probably different than they are used to or how other toolkits behave.
> The complain is that clicking on ANY item causes the whole menu to close,
> even if it is:
>
> 1) A submenu. Usually submenu is just an entry point and "mouse hovering"
> opens the submenu automatically, an accidental clicking on this entry point
> should not
> close the whole menu. "Not closing" the menu would also indicate that no
> action was performed and choosing particular submenu-item is required to
> invoke an action
Right.
> 2) If menu item group is set of check-boxes (I have some application-settings
> options as menu checkboxes) and user wants to change a few settings at the
> same
> time, he/she needs to reopen the menu for each single item change. Sometimes
> user re-opens the menu even for single change just to visually confirm that
> the
> state was changed. In such a case they expect that menu closes only if you
> either hit "Esc" or click menu-opening widget (menu-bar or menu-button)
Yes, I could see where that would be a PITA, and have noticed it myself
in my own apps that use a list of checkboxes in a "preferences" submenu.
Arguably one should create a dialog for such things as preference
panels,
as menus tend not to be a good interface for such things. I use them
myself,
and realize as my app has matured, I should really make a preferences
dialog.
Still, I'd agree changing radio boxes/check boxes in menus probably
shouldn't
close the menu, and perhaps should be 'new' default behavior, with the
old
behavior selectable with a flag.
I don't know much about FLTK's menu internals, but perusing Fl_Menu.cxx,
it seems that while one is navigating the menus, the variable pp.state
maintains the current state of navigation while a menu is open, and
it's only
when that variable is set to "DONE_STATE" that the menus close.
Also: while sniffing around in Fl_Menu.cxx where I thought this change
should be made (around FL_RELEASE), I noticed this commented out section
(with #if 0) that might actually do what you want (see ***):
case FL_RELEASE:
// Mouse must either be held down/dragged some, or this must be
// the second click (not the one that popped up the menu):
if ( !Fl::event_is_click()
|| pp.state == PUSH_STATE
|| (pp.menubar && pp.current_item && !pp.current_item->submenu()) //
button
) {
#if 0 // makes the check/radio items leave the menu up ***
const Fl_Menu_Item* m = pp.current_item;
if (m && button && (m->flags & (FL_MENU_TOGGLE|FL_MENU_RADIO))) {
((Fl_Menu_*)button)->picked(m);
pp.p[pp.menu_number]->redraw();
} else
#endif
So it looks like someone's already been here with that in mind.
If uncommenting that works for you, I guess we should add a flag,
as you say, that lets the app control this. Otherwise, we're open
to patches..
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk