[gnome-shell/wip/fmuellner/notification-redux+sass: 37/61] dateMenu: Show indicator for unacknowledged messages



commit 3cdda20104a9dd17360786ca4188fd05dd569270
Author: Florian Müllner <fmuellner gnome org>
Date:   Sat Feb 14 03:17:16 2015 +0100

    dateMenu: Show indicator for unacknowledged messages

 js/ui/dateMenu.js |   72 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 71 insertions(+), 1 deletions(-)
---
diff --git a/js/ui/dateMenu.js b/js/ui/dateMenu.js
index 4e88411..b715280 100644
--- a/js/ui/dateMenu.js
+++ b/js/ui/dateMenu.js
@@ -220,6 +220,68 @@ const WorldClocksSection = new Lang.Class({
     }
 });
 
+const MessagesIndicator = new Lang.Class({
+    Name: 'MessagesIndicator',
+
+    _init: function() {
+        this.actor = new St.Label({ text: '⚫', visible: false, y_expand: true,
+                                    y_align: Clutter.ActorAlign.CENTER });
+
+        this._sources = [];
+
+        Main.messageTray.connect('source-added', Lang.bind(this, this._onSourceAdded));
+        Main.messageTray.connect('source-removed', Lang.bind(this, this._onSourceRemoved));
+
+        let sources = Main.messageTray.getSources();
+        sources.forEach(Lang.bind(this, function(source) { this._onSourceAdded(null, source); }));
+    },
+
+    _onSourceAdded: function(tray, source) {
+        source.connect('count-updated', Lang.bind(this, this._updateCount));
+        this._sources.push(source);
+        this._updateCount();
+    },
+
+    _onSourceRemoved: function(tray, source) {
+        this._sources.splice(this._sources.indexOf(source), 1);
+        this._updateCount();
+    },
+
+    _updateCount: function() {
+        let count = 0;
+        this._sources.forEach(Lang.bind(this,
+            function(source) {
+                count += source.unseenCount;
+            }));
+
+        this.actor.visible = (count > 0);
+    }
+});
+
+const IndicatorPad = new Lang.Class({
+    Name: 'IndicatorPad',
+    Extends: St.Widget,
+
+    _init: function(actor) {
+        this._source = actor;
+        this._source.connect('notify::visible',
+                             Lang.bind(this, this.queue_relayout));
+        this.parent();
+    },
+
+    vfunc_get_preferred_width: function(container, forHeight) {
+        if (this._source.visible)
+            return this._source.get_preferred_width(forHeight);
+        return [0, 0];
+    },
+
+    vfunc_get_preferred_height: function(container, forWidth) {
+        if (this._source.visible)
+            return this._source.get_preferred_height(forWidth);
+        return [0, 0];
+    }
+});
+
 const FreezableBinLayout = new Lang.Class({
     Name: 'FreezableBinLayout',
     Extends: Clutter.BinLayout,
@@ -269,10 +331,18 @@ const DateMenuButton = new Lang.Class({
         this.parent(menuAlignment);
 
         this._clockDisplay = new St.Label({ y_align: Clutter.ActorAlign.CENTER });
+        this._indicator = new MessagesIndicator();
+
+        let box = new St.BoxLayout();
+        box.add_actor(new IndicatorPad(this._indicator.actor));
+        box.add_actor(this._clockDisplay);
+        box.add_actor(this._indicator.actor);
+
         this.actor.label_actor = this._clockDisplay;
-        this.actor.add_actor(this._clockDisplay);
+        this.actor.add_actor(box);
         this.actor.add_style_class_name ('clock-display');
 
+
         let layout = new FreezableBinLayout();
         let bin = new St.Widget({ layout_manager: layout });
         this.menu.box.add_child(bin);


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