src/hbcore/gui/hbmenu.cpp
changeset 28 b7da29130b0e
parent 23 e6ad4ef83b23
child 30 80e4d18b72f5
--- 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()