[gnome-shell] Add Add/Remove from favorites menu, unify lists more



commit b3a5fc72fba8c474ba70c1acb1f14903f1661ca8
Author: Colin Walters <walters verbum org>
Date:   Fri Sep 25 16:20:43 2009 -0400

    Add Add/Remove from favorites menu, unify lists more
    
    Also have inactive applications pop up a menu.
    
    Add/Remove from favorites is now in the menu.
    
    Concatenate the favorites/not-favorites instead of having a gap only
    if you happened to have a not-divisible-by-4 number of favorites.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=596371

 js/ui/appDisplay.js |   62 ++++++++++++--------------------------------------
 js/ui/appIcon.js    |   37 ++++++++++++++++++++++++-----
 2 files changed, 45 insertions(+), 54 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 3ced546..bcdfcff 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -459,8 +459,8 @@ function BaseWellItem(appInfo, isFavorite, hasMenu) {
 BaseWellItem.prototype = {
     __proto__: AppIcon.AppIcon.prototype,
 
-    _init: function(appInfo, isFavorite, hasMenu) {
-        AppIcon.AppIcon.prototype._init.call(this, appInfo, hasMenu ? AppIcon.MenuType.ON_RIGHT : AppIcon.MenuType.NONE, true);
+    _init: function(appInfo, isFavorite) {
+        AppIcon.AppIcon.prototype._init.call(this, appInfo, AppIcon.MenuType.ON_RIGHT, true);
 
         this.isFavorite = isFavorite;
 
@@ -519,7 +519,7 @@ RunningWellItem.prototype = {
     __proto__: BaseWellItem.prototype,
 
     _init: function(appInfo, isFavorite) {
-        BaseWellItem.prototype._init.call(this, appInfo, isFavorite, true);
+        BaseWellItem.prototype._init.call(this, appInfo, isFavorite);
 
         this._dragStartX = 0;
         this._dragStartY = 0;
@@ -592,6 +592,12 @@ InactiveWellItem.prototype = {
             return true;
         }
         return false;
+    },
+
+    menuPoppedUp: function() {
+    },
+
+    menuPoppedDown: function() {
     }
 };
 
@@ -659,10 +665,8 @@ WellGrid.prototype = {
             childBox.y2 = childBox.y1 + itemHeight;
             children[i].allocate(childBox, flags);
 
-            let atSeparator = (i == this._separatorIndex - 1);
-
             columnIndex++;
-            if (columnIndex == columns || atSeparator) {
+            if (columnIndex == columns) {
                 columnIndex = 0;
             }
 
@@ -672,27 +676,7 @@ WellGrid.prototype = {
             } else {
                 x += itemWidth;
             }
-
-            if (atSeparator) {
-                y += separatorNatural + WELL_ITEM_VSPACING;
-            }
         }
-
-        let separatorRowIndex = Math.ceil(this._separatorIndex / columns);
-
-        /* Allocate the separator */
-        let childBox = new Clutter.ActorBox();
-        childBox.x1 = box.x1;
-        childBox.y1 = (itemHeight + WELL_ITEM_VSPACING) * separatorRowIndex;
-        this._cachedSeparatorY = childBox.y1;
-        childBox.x2 = box.x2;
-        childBox.y2 = childBox.y1+separatorNatural;
-        this._separator.allocate(childBox, flags);
-    },
-
-    setSeparatorIndex: function (index) {
-        this._separatorIndex = index;
-        this.actor.queue_relayout();
     },
 
     removeAll: function () {
@@ -700,11 +684,6 @@ WellGrid.prototype = {
         for (let i = 0; i < itemChildren.length; i++) {
             itemChildren[i].destroy();
         }
-        this._separatorIndex = 0;
-    },
-
-    isBeforeSeparator: function(x, y) {
-        return y < this._cachedSeparatorY;
     },
 
     _getItemChildren: function () {
@@ -744,8 +723,7 @@ WellGrid.prototype = {
         let minWidth = itemMinWidth * nColumns;
 
         let lastColumnIndex = nColumns - 1;
-        let separatorColumns = lastColumnIndex - ((lastColumnIndex + this._separatorIndex) % nColumns);
-        let rows = Math.ceil((children.length + separatorColumns) / nColumns);
+        let rows = Math.ceil(children.length / nColumns);
 
         let itemWidth;
         if (forWidth < 0) {
@@ -847,7 +825,6 @@ AppWell.prototype = {
 
         let displays = []
         this._addApps(favorites, true);
-        this._grid.setSeparatorIndex(favorites.length);
         this._addApps(running, false);
         this._displays = displays;
     },
@@ -870,9 +847,7 @@ AppWell.prototype = {
         let appSystem = Shell.AppSystem.get_default();
 
         let app = null;
-        if (source instanceof BaseWellItem) {
-            app = source.appInfo;
-        } else if (source instanceof AppDisplayItem) {
+        if (source instanceof AppDisplayItem) {
             app = appSystem.lookup_cached_app(source.getId());
         } else if (source instanceof Workspaces.WindowClone) {
             let appMonitor = Shell.AppMonitor.get_default();
@@ -889,22 +864,15 @@ AppWell.prototype = {
         let favoriteIds = this._appSystem.get_favorites();
         let favoriteIdsObject = this._arrayValues(favoriteIds);
 
-        let dropIsFavorite = this._grid.isBeforeSeparator(x - this._grid.actor.x,
-                                                          y - this._grid.actor.y);
         let srcIsFavorite = (id in favoriteIdsObject);
 
-        if (srcIsFavorite && (!dropIsFavorite)) {
-            Mainloop.idle_add(function () {
-                appSystem.remove_favorite(id);
-                return false;
-            });
-        } else if ((!srcIsFavorite) && dropIsFavorite) {
+        if (srcIsFavorite) {
+            return false;
+        } else {
             Mainloop.idle_add(function () {
                 appSystem.add_favorite(id);
                 return false;
             });
-        } else {
-            return false;
         }
 
         return true;
diff --git a/js/ui/appIcon.js b/js/ui/appIcon.js
index dd1aac6..e6d8ec8 100644
--- a/js/ui/appIcon.js
+++ b/js/ui/appIcon.js
@@ -382,11 +382,13 @@ AppIconMenu.prototype = {
 
         let iconsDiffer = false;
         let texCache = Shell.TextureCache.get_default();
-        let firstIcon = windows[0].mini_icon;
-        for (let i = 1; i < windows.length; i++) {
-            if (!texCache.pixbuf_equal(windows[i].mini_icon, firstIcon)) {
-                iconsDiffer = true;
-                break;
+        if (windows.length > 0) {
+            let firstIcon = windows[0].mini_icon;
+            for (let i = 1; i < windows.length; i++) {
+                if (!texCache.pixbuf_equal(windows[i].mini_icon, firstIcon)) {
+                    iconsDiffer = true;
+                    break;
+                }
             }
         }
 
@@ -405,9 +407,24 @@ AppIconMenu.prototype = {
         }
         this._appendWindows(otherWorkspaceWindows, iconsDiffer);
 
-        this._appendSeparator();
+        if (windows.length > 0)
+            this._appendSeparator();
+
+        this._newWindowMenuItem = windows.length > 0 ? this._appendMenuItem(null, _("New Window")) : null;
 
-        this._newWindowMenuItem = this._appendMenuItem(null, _("New Window"));
+        let favorites = Shell.AppSystem.get_default().get_favorites();
+        let id = this._source.appInfo.get_id();
+        this._isFavorite = false;
+        for (let i = 0; i < favorites.length; i++) {
+            if (id == favorites[i]) {
+                this._isFavorite = true;
+                break;
+            }
+        }
+        if (windows.length > 0)
+            this._appendSeparator();
+        this._toggleFavoriteMenuItem = this._appendMenuItem(null, this._isFavorite ? _("Remove from favorites")
+                                                                    : _("Add to favorites"));
 
         this._highlightedItem = null;
     },
@@ -564,6 +581,12 @@ AppIconMenu.prototype = {
         } else if (child == this._newWindowMenuItem) {
             this._source.appInfo.launch();
             this.emit('activate-window', null);
+        } else if (child == this._toggleFavoriteMenuItem) {
+            let appSys = Shell.AppSystem.get_default();
+            if (this._isFavorite)
+                appSys.remove_favorite(this._source.appInfo.get_id());
+            else
+                appSys.add_favorite(this._source.appInfo.get_id());
         }
         this.popdown();
     },



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