[gnome-shell] panel: programmatic anim. control of AnimatedIcon



commit e04a4c39231ea1418591446d9b98aad4d7bcd2de
Author: StÃphane DÃmurget <stephane demurget free fr>
Date:   Sun Nov 4 19:47:11 2012 +0100

    panel: programmatic anim. control of AnimatedIcon
    
    The AnimatedIcon does not have an API for controlling the animation but
    relies on the :visible property changes to start and stop a timeout used
    to update the frame.
    
    This has the inconvenient of having a side effect when visible is set to
    true multiple times, and is not really the API expected from such
    component.
    
    Switch to a start/stop API instead. Also, update to the first frame at
    startup while we are at it, since this is the expected behavior.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=687583

 js/ui/panel.js |   21 +++++++++++----------
 1 files changed, 11 insertions(+), 10 deletions(-)
---
diff --git a/js/ui/panel.js b/js/ui/panel.js
index 9f36963..2c3fc89 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -82,28 +82,27 @@ const AnimatedIcon = new Lang.Class({
     _init: function(name, size) {
         this.actor = new St.Bin({ visible: false });
         this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
-        this.actor.connect('notify::visible', Lang.bind(this, this._onVisibleNotify));
 
         this._timeoutId = 0;
         this._frame = 0;
         this._animations = St.TextureCache.get_default().load_sliced_image (global.datadir + '/theme/' + name, size, size);
         this.actor.set_child(this._animations);
+
+        this._update();
+    },
+
+    start: function() {
+        if (this._timeoutId == 0)
+            this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
     },
 
-    _disconnectTimeout: function() {
+    stop: function() {
         if (this._timeoutId > 0) {
             Mainloop.source_remove(this._timeoutId);
             this._timeoutId = 0;
         }
     },
 
-    _onVisibleNotify: function() {
-        if (this.actor.visible)
-            this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
-        else
-            this._disconnectTimeout();
-    },
-
     _showFrame: function(frame) {
         let oldFrameActor = this._animations.get_child_at_index(this._frame);
         if (oldFrameActor)
@@ -122,7 +121,7 @@ const AnimatedIcon = new Lang.Class({
     },
 
     _onDestroy: function() {
-        this._disconnectTimeout();
+        this.stop();
     }
 });
 
@@ -367,6 +366,7 @@ const AppMenuButton = new Lang.Class({
                            transition: "easeOutQuad",
                            onCompleteScope: this,
                            onComplete: function() {
+                               this._spinner.stop();
                                this._spinner.actor.opacity = 255;
                                this._spinner.actor.hide();
                            }
@@ -376,6 +376,7 @@ const AppMenuButton = new Lang.Class({
     startAnimation: function() {
         this._stop = false;
         this.actor.reactive = false;
+        this._spinner.start();
         this._spinner.actor.show();
     },
 



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