diff -r e6ad4ef83b23 -r b7da29130b0e src/hbcore/gui/hbmenu.cpp --- a/src/hbcore/gui/hbmenu.cpp Thu Sep 02 20:44:51 2010 +0300 +++ b/src/hbcore/gui/hbmenu.cpp Fri Sep 17 08:32:10 2010 +0300 @@ -36,7 +36,7 @@ bool HbMenuPrivate::menuEffectsLoaded = false; #endif #include "hbglobal_p.h" - +#include #include Q_DECLARE_METATYPE (QAction*)// krazy:exclude=qclasses @@ -53,7 +53,8 @@ mDownMargin(0.0), delayMenuConstruction(true), receiverToDisconnectOnClose(0), - mNumberOfColumns(1) + mNumberOfColumns(1), + mCloseAllMenus(false) { } @@ -175,6 +176,7 @@ // do not close the menu tree if the triggered action is // submenu item if (!action->menu()) { + mCloseAllMenus = true; q->close(); } else { stopTimeout(); @@ -271,6 +273,51 @@ } } +/* + reimp +*/ +void HbMenuPrivate::handleBackgroundMouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_Q(HbMenu); + + // Handle cases only for Background or Popup originated mouse presses and when + // any dismiss policy defined + if (mousePressLocation != None && dismissPolicy != HbPopup::NoDismiss) { + + MouseEventLocationType mouseReleaseLocation = Background; + HbMenu* tempMenu = 0; + QList itemList = q->scene()->items(event->pos()); + foreach (QGraphicsItem* sceneItem, itemList ){ + QGraphicsWidget *focusWidget = 0; + HbMenu *focusMenu = 0; + if (sceneItem && sceneItem->isWidget()) { + focusWidget = static_cast(sceneItem); + focusMenu = qobject_cast(focusWidget); + } + if( focusMenu ) { + mouseReleaseLocation = Popup; + tempMenu = focusMenu; + break; + } + } + // Mouse is released within menu + if (mouseReleaseLocation == Popup) { + HbAction* menuAction = tempMenu->activeAction(); + if(menuAction){ + mCloseAllMenus = false; + closeMenuRecursively(menuAction); + } + mousePressLocation = None; + } + else { + // trigger the menu to close whole menu + mCloseAllMenus = true; + q->close(); + mousePressLocation = None; + } + } +} + void HbMenuPrivate::_q_subMenuTimedOut() { Q_Q(HbMenu); @@ -282,7 +329,12 @@ q->close(); } else { startTimeout(); + mCloseAllMenus = false; } + if (activeSubMenu && HbMenuPrivate::d_ptr(activeSubMenu)->mCloseAllMenus) { + mCloseAllMenus = true; + q->close(); + } } void HbMenuPrivate::_q_handleMenuClose()