--- 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 <QGraphicsSceneMouseEvent>
#include <QPointer>
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<QGraphicsItem*> itemList = q->scene()->items(event->pos());
+ foreach (QGraphicsItem* sceneItem, itemList ){
+ QGraphicsWidget *focusWidget = 0;
+ HbMenu *focusMenu = 0;
+ if (sceneItem && sceneItem->isWidget()) {
+ focusWidget = static_cast<QGraphicsWidget*>(sceneItem);
+ focusMenu = qobject_cast<HbMenu *>(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()