[gnome-shell] messageTray: store notifications and signal ids in an array of objects in SummaryItem



commit f7fb6b21604e1f56ccd47805ed81e520bd037b5d
Author: Marina Zhurakhinskaya <marinaz redhat com>
Date:   Thu Sep 8 00:40:58 2011 -0400

    messageTray: store notifications and signal ids in an array of objects in SummaryItem
    
    The code is cleaner that way. It also allows us to find the notification object
    after the notification actor is destroyed and disconnect the signals.

 js/ui/messageTray.js |   60 +++++++++++++++++++++++++-------------------------
 1 files changed, 30 insertions(+), 30 deletions(-)
---
diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js
index 86fd123..5ddc079 100644
--- a/js/ui/messageTray.js
+++ b/js/ui/messageTray.js
@@ -1169,9 +1169,7 @@ SummaryItem.prototype = {
         this.notificationStack = new St.BoxLayout({ name: 'summary-notification-stack',
                                                      vertical: true });
         this.notificationStackView.add_actor(this.notificationStack);
-        this._notificationExpandedIds = [];
-        this._notificationDoneDisplayingIds = [];
-        this._notificationDestroyedIds = [];
+        this._stackedNotifications = [];
 
         this._oldMaxScrollAdjustment = 0;
 
@@ -1240,18 +1238,19 @@ SummaryItem.prototype = {
 
     doneShowingNotificationStack: function() {
         let notificationActors = this.notificationStack.get_children();
-        for (let i = 0; i < notificationActors.length; i++) {
-            notificationActors[i]._delegate.collapseCompleted();
-            notificationActors[i]._delegate.disconnect(this._notificationExpandedIds[i]);
-            notificationActors[i]._delegate.disconnect(this._notificationDoneDisplayingIds[i]);
-            notificationActors[i]._delegate.disconnect(this._notificationDestroyedIds[i]);
-            this.notificationStack.remove_actor(notificationActors[i]);
-            notificationActors[i]._delegate.setIconVisible(true);
-            notificationActors[i]._delegate.enableScrolling(true);
+        for (let i = 0; i < this._stackedNotifications.length; i++) {
+            let stackedNotification = this._stackedNotifications[i];
+            let notification = stackedNotification.notification;
+            notification.collapseCompleted();
+            notification.disconnect(stackedNotification.notificationExpandedId);
+            notification.disconnect(stackedNotification.notificationDoneDisplayingId);
+            notification.disconnect(stackedNotification.notificationDestroyedId);
+            if (notification.actor.get_parent() == this.notificationStack)
+                this.notificationStack.remove_actor(notification.actor);
+            notification.setIconVisible(true);
+            notification.enableScrolling(true);
         }
-        this._notificationExpandedIds = [];
-        this._notificationDoneDisplayingIds = [];
-        this._notificationDestroyedIds = [];
+        this._stackedNotifications = [];
     },
 
     _notificationAddedToSource: function(source, notification) {
@@ -1260,12 +1259,12 @@ SummaryItem.prototype = {
     },
 
     _appendNotificationToStack: function(notification) {
-        let notificationExpandedId = notification.connect('expanded', Lang.bind(this, this._contentUpdated));
-        this._notificationExpandedIds.push(notificationExpandedId);
-        let notificationDoneDisplayingId = notification.connect('done-displaying', Lang.bind(this, this._notificationDoneDisplaying));
-        this._notificationDoneDisplayingIds.push(notificationDoneDisplayingId);
-        let notificationDestroyedId = notification.connect('destroy', Lang.bind(this, this._notificationDestroyed));
-        this._notificationDestroyedIds.push(notificationDestroyedId);
+        let stackedNotification = {};
+        stackedNotification.notification = notification;
+        stackedNotification.notificationExpandedId = notification.connect('expanded', Lang.bind(this, this._contentUpdated));
+        stackedNotification.notificationDoneDisplayingId = notification.connect('done-displaying', Lang.bind(this, this._notificationDoneDisplaying));
+        stackedNotification.notificationDestroyedId = notification.connect('destroy', Lang.bind(this, this._notificationDestroyed));
+        this._stackedNotifications.push(stackedNotification);
         if (!this.source.isChat)
             notification.enableScrolling(false);
         if (this.notificationStack.get_children().length > 0)
@@ -1295,17 +1294,18 @@ SummaryItem.prototype = {
     },
 
     _notificationDestroyed: function(notification) {
-        let index = this.notificationStack.get_children().indexOf(notification.actor);
-        if (index >= 0) {
-            notification.disconnect(this._notificationExpandedIds[index]);
-            this._notificationExpandedIds.splice(index, 1);
-            notification.disconnect(this._notificationDoneDisplayingIds[index]);
-            this._notificationDoneDisplayingIds.splice(index, 1);
-            notification.disconnect(this._notificationDestroyedIds[index]);
-            this._notificationDestroyedIds.splice(index, 1);
-            this.notificationStack.remove_actor(notification.actor);
-            this._contentUpdated();
+        for (let i = 0; i < this._stackedNotifications.length; i++) {
+            if (this._stackedNotifications[i].notification == notification) {
+                let stackedNotification = this._stackedNotifications[i];
+                notification.disconnect(stackedNotification.notificationExpandedId);
+                notification.disconnect(stackedNotification.notificationDoneDisplayingId);
+                notification.disconnect(stackedNotification.notificationDestroyedId);
+                this._stackedNotifications.splice(i, 1);
+                this._contentUpdated();
+                break;
+            }
         }
+
         if (this.notificationStack.get_children().length > 0)
             this.notificationStack.get_children()[0]._delegate.setIconVisible(true);
     }



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