From 5819dd3a5a011339a2d40617dc33bcc7c359c8ed Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Mon, 27 Jun 2011 17:45:24 +0200 Subject: [PATCH] NetworkMenu: take out an item from More... when another is destroyed When one of the networks in the main menu is removed and we have a More... submenu, we can take the first out from the submenu and show it in the main menu. https://bugzilla.gnome.org/show_bug.cgi?id=647175 --- js/ui/popupMenu.js | 8 ++++++++ js/ui/status/network.js | 33 ++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index e67729cb5..9e256b58f 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -946,6 +946,14 @@ PopupMenuBase.prototype = { }); }, + get firstMenuItem() { + let items = this._getMenuItems(); + if (items.length) + return items[0]; + else + return null; + }, + removeAll: function() { let children = this._getMenuItems(); for (let i = 0; i < children.length; i++) { diff --git a/js/ui/status/network.js b/js/ui/status/network.js index 348fcd49d..a4372b5a5 100644 --- a/js/ui/status/network.js +++ b/js/ui/status/network.js @@ -1281,12 +1281,29 @@ NMDeviceWireless.prototype = { if (apObj.accessPoints.length == 0) { if (apObj.item) apObj.item.destroy(); - this._networks.splice(pos, 1); - if (this._overflowItem && - this._overflowItem.menu.length == 0) { - this._overflowItem.destroy(); - this._overflowItem = null; + + if (this._overflowItem) { + if (!apObj.isMore) { + // we removed an item in the main menu, and we have a more submenu + // we need to extract the first item in more and move it to the submenu + + let apObj = this._overflowItem.menu.firstMenuItem; + if (apObj.item) { + apObj.item.destroy(); + + this._createNetworkItem(apObj, NUM_VISIBLE_NETWORKS-1); + } + } + + // This can happen if the removed connection is from the overflow + // menu, or if we just moved the last connection out from the menu + if (this._overflowItem.menu.length == 0) { + this._overflowItem.destroy(); + this._overflowItem = null; + } } + this._networks.splice(pos, 1); + } else if (apObj.item) apObj.item.updateAccessPoints(apObj.accessPoints); }, @@ -1482,14 +1499,16 @@ NMDeviceWireless.prototype = { } })); } - if (position < NUM_VISIBLE_NETWORKS) + if (position < NUM_VISIBLE_NETWORKS) { + apObj.isMore = false; this.section.addMenuItem(apObj.item, position); - else { + } else { if (!this._overflowItem) { this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More...")); this.section.addMenuItem(this._overflowItem); } this._overflowItem.menu.addMenuItem(apObj.item, position - NUM_VISIBLE_NETWORKS); + apObj.isMore = true; } },