diff --git a/ChangeLog b/ChangeLog index 9012d891..b900d8a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2015-11-25 Markus Gans + * Small menu improvements + 2015-11-24 Markus Gans * Improved mouse and keyboard handling in sub-menus diff --git a/src/fmenu.cpp b/src/fmenu.cpp index 4a51d8ab..aa3ca8dd 100644 --- a/src/fmenu.cpp +++ b/src/fmenu.cpp @@ -401,15 +401,10 @@ bool FMenu::selectPrevItem() //---------------------------------------------------------------------- void FMenu::keypressMenuBar (FKeyEvent*& ev) { - FWidget* super = getSuperMenu(); - if ( super ) - { - if ( isMenuBar(super) ) - { - FMenuBar* mbar = reinterpret_cast(super); - mbar->onKeyPress(ev); - } - } + FMenuBar* mbar = menuBar(); + + if ( mbar ) + mbar->onKeyPress(ev); } //---------------------------------------------------------------------- @@ -437,14 +432,27 @@ bool FMenu::hotkeyMenu (FKeyEvent*& ev) if ( found ) { - unselectItem(); - hideSubMenus(); - hide(); - hideSuperMenus(); - updateTerminal(); - flush_out(); - ev->accept(); - (*iter)->processClicked(); + if ( (*iter)->hasMenu() ) + { + FMenu* sub_menu = (*iter)->getMenu(); + unselectItem(); + (*iter)->setSelected(); + setSelectedItem (*iter); + redraw(); + openSubMenu (sub_menu); + sub_menu->redraw(); + } + else + { + unselectItem(); + hideSubMenus(); + hide(); + hideSuperMenus(); + updateTerminal(); + flush_out(); + ev->accept(); + (*iter)->processClicked(); + } return true; } } @@ -577,15 +585,15 @@ void FMenu::drawItems() FString txt; uInt txt_length; int hotkeypos, to_char; - int accel_key = (*iter)->accel_key; - bool has_menu = (*iter)->hasMenu(); - bool is_enabled = (*iter)->isEnabled(); - bool is_checked = (*iter)->isChecked(); - bool is_checkable = (*iter)->checkable; - bool is_radio_btn = (*iter)->radio_button; - bool is_selected = (*iter)->isSelected(); + int accel_key = (*iter)->accel_key; + bool has_menu = (*iter)->hasMenu(); + bool is_enabled = (*iter)->isEnabled(); + bool is_checked = (*iter)->isChecked(); + bool is_checkable = (*iter)->checkable; + bool is_radio_btn = (*iter)->radio_button; + bool is_selected = (*iter)->isSelected(); bool is_noUnderline = (((*iter)->getFlags() & NO_UNDERLINE) != 0); - bool is_separator = (*iter)->isSeparator(); + bool is_separator = (*iter)->isSeparator(); if ( is_separator ) { @@ -1180,10 +1188,11 @@ void FMenu::onMouseMove (FMouseEvent* ev) const FPoint& g = ev->getGlobalPos(); const FPoint& p = open_sub_menu->globalToLocalPos(g); int b = ev->getButton(); - ev = new FMouseEvent (MouseMove_Event, p, g, b); + FMouseEvent* _ev = new FMouseEvent (MouseMove_Event, p, g, b); open_sub_menu->mouse_down = true; setClickedWidget(open_sub_menu); - open_sub_menu->onMouseMove(ev); + open_sub_menu->onMouseMove(_ev); + delete _ev; } else if ( ! mouse_over_menu && mouse_over_supermenu ) { @@ -1191,10 +1200,11 @@ void FMenu::onMouseMove (FMouseEvent* ev) const FPoint& g = ev->getGlobalPos(); const FPoint& p = smenu->globalToLocalPos(g); int b = ev->getButton(); - ev = new FMouseEvent (MouseMove_Event, p, g, b); + FMouseEvent* _ev = new FMouseEvent (MouseMove_Event, p, g, b); smenu->mouse_down = true; setClickedWidget(smenu); - smenu->onMouseMove(ev); + smenu->onMouseMove(_ev); + delete _ev; } else if ( mouse_over_menubar ) { @@ -1203,12 +1213,12 @@ void FMenu::onMouseMove (FMouseEvent* ev) const FPoint& g = ev->getGlobalPos(); const FPoint& p = menubar->globalToLocalPos(g); int b = ev->getButton(); - ev = new FMouseEvent (MouseMove_Event, p, g, b); + FMouseEvent* _ev = new FMouseEvent (MouseMove_Event, p, g, b); setClickedWidget(menubar); FMenuBar* mbar = reinterpret_cast(menubar); mbar->mouse_down = true; - mbar->onMouseMove(ev); - delete ev; + mbar->onMouseMove(_ev); + delete _ev; } else if ( ! hasSelectedItem() && statusBar() && mouse_over_menu ) { diff --git a/src/fmenubar.cpp b/src/fmenubar.cpp index aa1a276a..4f48d521 100644 --- a/src/fmenubar.cpp +++ b/src/fmenubar.cpp @@ -772,10 +772,11 @@ void FMenuBar::onMouseMove (FMouseEvent* ev) const FPoint& g = ev->getGlobalPos(); const FPoint& p = menu->globalToLocalPos(g); int b = ev->getButton(); - ev = new FMouseEvent (MouseMove_Event, p, g, b); + FMouseEvent* _ev = new FMouseEvent (MouseMove_Event, p, g, b); menu->mouse_down = true; setClickedWidget(menu); - menu->onMouseMove(ev); + menu->onMouseMove(_ev); + delete _ev; } } } diff --git a/src/fmenuitem.cpp b/src/fmenuitem.cpp index 7e7d757e..99a70e56 100644 --- a/src/fmenuitem.cpp +++ b/src/fmenuitem.cpp @@ -174,11 +174,12 @@ void FMenuItem::init (FWidget* parent) { FMenuBar* menubar_ptr = dynamic_cast(parent); if ( menubar_ptr ) + { menubar_ptr->menu_dimension(); - // Meta + hotkey - if ( hotkey ) - menubar_ptr->addAccelerator (fc::Fmkey_meta + tolower(hotkey), this); + if ( hotkey ) // Meta + hotkey + menubar_ptr->addAccelerator (fc::Fmkey_meta + tolower(hotkey), this); + } this->addCallback ( @@ -382,9 +383,9 @@ void FMenuItem::onMouseDown (FMouseEvent* ev) if ( smenu ) { const FPoint& p2 = smenu->globalToLocalPos(g); - ev = new FMouseEvent (MouseMove_Event, p2, g, b); - smenu->onMouseDown(ev); - delete ev; + FMouseEvent* _ev = new FMouseEvent (MouseDown_Event, p2, g, b); + smenu->onMouseDown(_ev); + delete _ev; } } @@ -394,9 +395,9 @@ void FMenuItem::onMouseDown (FMouseEvent* ev) if ( mbar ) { const FPoint& p2 = mbar->globalToLocalPos(g); - ev = new FMouseEvent (MouseMove_Event, p2, g, b); - mbar->onMouseDown(ev); - delete ev; + FMouseEvent* _ev = new FMouseEvent (MouseDown_Event, p2, g, b); + mbar->onMouseDown(_ev); + delete _ev; } } } @@ -416,9 +417,9 @@ void FMenuItem::onMouseUp (FMouseEvent* ev) if ( smenu ) { const FPoint& p2 = smenu->globalToLocalPos(g); - ev = new FMouseEvent (MouseMove_Event, p2, g, b); - smenu->onMouseUp(ev); - delete ev; + FMouseEvent* _ev = new FMouseEvent (MouseUp_Event, p2, g, b); + smenu->onMouseUp(_ev); + delete _ev; } } @@ -428,9 +429,9 @@ void FMenuItem::onMouseUp (FMouseEvent* ev) if ( mbar ) { const FPoint& p2 = mbar->globalToLocalPos(g); - ev = new FMouseEvent (MouseMove_Event, p2, g, b); - mbar->onMouseUp(ev); - delete ev; + FMouseEvent* _ev = new FMouseEvent (MouseUp_Event, p2, g, b); + mbar->onMouseUp(_ev); + delete _ev; } } } @@ -450,9 +451,9 @@ void FMenuItem::onMouseMove (FMouseEvent* ev) if ( smenu ) { const FPoint& p2 = smenu->globalToLocalPos(g); - ev = new FMouseEvent (MouseMove_Event, p2, g, b); - smenu->onMouseMove(ev); - delete ev; + FMouseEvent* _ev = new FMouseEvent (MouseMove_Event, p2, g, b); + smenu->onMouseMove(_ev); + delete _ev; } } @@ -462,9 +463,9 @@ void FMenuItem::onMouseMove (FMouseEvent* ev) if ( mbar ) { const FPoint& p2 = mbar->globalToLocalPos(g); - ev = new FMouseEvent (MouseMove_Event, p2, g, b); - mbar->onMouseMove(ev); - delete ev; + FMouseEvent* _ev = new FMouseEvent (MouseMove_Event, p2, g, b); + mbar->onMouseMove(_ev); + delete _ev; } } @@ -650,27 +651,27 @@ void FMenuItem::unsetSelected() //---------------------------------------------------------------------- void FMenuItem::openMenu() { - FMenu* menu; + FMenu* dd_menu; // Drop-down menu FMenu* open_menu; if ( hasMenu() ) { - menu = getMenu(); - if ( menu->isVisible() ) + dd_menu = getMenu(); + if ( dd_menu->isVisible() ) return; open_menu = static_cast(getOpenMenu()); - if ( open_menu && open_menu != menu ) + if ( open_menu && open_menu != dd_menu ) { open_menu->hide(); open_menu->hideSubMenus(); } - setOpenMenu(menu); + setOpenMenu(dd_menu); - menu->setVisible(); - menu->show(); - menu->raiseWindow(menu); - menu->redraw(); + dd_menu->setVisible(); + dd_menu->show(); + dd_menu->raiseWindow(dd_menu); + dd_menu->redraw(); updateTerminal(); flush_out(); }