[gnome-shell/wip/aggregate-menu: 19/62] popupMenu: Only allow one submenu to be open at a time



commit 7b191a552b924d8648d2415dd7155f54744fb351
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Jun 11 19:12:46 2013 -0400

    popupMenu: Only allow one submenu to be open at a time
    
    When the user opens another submenu, close the first one.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=702539

 js/ui/popupMenu.js |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)
---
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
index 5ce7b49..9455ebb 100644
--- a/js/ui/popupMenu.js
+++ b/js/ui/popupMenu.js
@@ -822,10 +822,14 @@ const PopupMenuBase = new Lang.Class({
             let parentClosingId = this.connect('menu-closed', function() {
                 menuItem.emit('menu-closed');
             });
+            let subMenuOpenStateChangedId = menuItem.connect('submenu-open-state-changed', Lang.bind(this, 
function(menuItem, submenu, open) {
+                this.emit('submenu-open-state-changed', submenu, open);
+            }));
 
             menuItem.connect('destroy', Lang.bind(this, function() {
                 menuItem.disconnect(activateId);
                 menuItem.disconnect(activeChangeId);
+                menuItem.disconnect(subMenuOpenStateChangedId);
                 this.disconnect(parentOpenStateChangedId);
                 this.disconnect(parentClosingId);
                 this.length--;
@@ -844,10 +848,13 @@ const PopupMenuBase = new Lang.Class({
             let closingId = this.connect('menu-closed', function() {
                 menuItem.menu.close(BoxPointer.PopupAnimation.NONE);
             });
-
+            let subMenuOpenStateChangedId = menuItem.connect('submenu-open-state-changed', Lang.bind(this, 
function(menuItem, submenu, open) {
+                this.emit('submenu-open-state-changed', submenu, open);
+            }));
             menuItem.connect('destroy', Lang.bind(this, function() {
                 menuItem.menu.disconnect(subMenuActivateId);
                 menuItem.menu.disconnect(subMenuActiveChangeId);
+                menuItem.disconnect(subMenuOpenStateChangedId);
                 this.disconnect(closingId);
             }));
         } else if (menuItem instanceof PopupSeparatorMenuItem) {
@@ -991,11 +998,23 @@ const PopupMenu = new Lang.Class({
 
         this._childMenus = [];
 
+        this._openedSubMenu = null;
+        this.connect('submenu-open-state-changed', Lang.bind(this, this._subMenuOpenStateChanged));
         this.connect('activate', Lang.bind(this, function(self, animate) {
             this.close(animate);
         }));
     },
 
+    _subMenuOpenStateChanged: function(menu, submenu, open) {
+        if (open) {
+            if (this._openedSubMenu)
+                this._openedSubMenu.close(true);
+            this._openedSubMenu = submenu;
+        } else {
+            this._openedSubMenu = null;
+        }
+    },
+
     _boxGetPreferredWidth: function (actor, forHeight, alloc) {
         let columnWidths = this.getColumnWidths();
         this.setColumnWidths(columnWidths);
@@ -1300,6 +1319,8 @@ const PopupSubMenuMenuItem = new Lang.Class({
             this.actor.add_style_pseudo_class('open');
         else
             this.actor.remove_style_pseudo_class('open');
+
+        this.emit('submenu-open-state-changed', menu, open);
     },
 
     destroy: function() {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]