[gnome-shell] boxpointer: add animateDisappear/animateAppear methods



commit 4d18d54d9d4d8f52aee545f5bfc743f2e06d45d4
Author: Maxim Ermilov <zaspire rambler ru>
Date:   Fri Oct 15 08:53:34 2010 +0400

    boxpointer: add animateDisappear/animateAppear methods
    
    https://bugzilla.gnome.org/show_bug.cgi?id=624900

 js/ui/boxpointer.js |   78 +++++++++++++++++++++++++++++++++++++++++++++++++++
 js/ui/popupMenu.js  |   13 +-------
 2 files changed, 80 insertions(+), 11 deletions(-)
---
diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js
index d6bd0d0..68cea44 100644
--- a/js/ui/boxpointer.js
+++ b/js/ui/boxpointer.js
@@ -5,6 +5,10 @@ const Lang = imports.lang;
 const St = imports.gi.St;
 const Shell = imports.gi.Shell;
 
+const Tweener = imports.ui.tweener;
+
+const POPUP_ANIMATION_TIME = 0.15;
+
 /**
  * BoxPointer:
  * @side: A St.Side type; currently only St.Side.TOP is implemented
@@ -38,6 +42,80 @@ BoxPointer.prototype = {
         this.bin.raise(this._border);
     },
 
+    animateAppear: function(onComplete) {
+        let x = this.actor.x;
+        let y = this.actor.y;
+        let themeNode = this.actor.get_theme_node();
+        let [found, rise] = themeNode.get_length('-arrow-rise', false);
+        if (!found)
+            rise = 0;
+
+        this.actor.opacity = 0;
+        this.actor.show();
+
+        switch (this._arrowSide) {
+            case St.Side.TOP:
+                this.actor.y -= rise;
+                break;
+            case St.Side.BOTTOM:
+                this.actor.y += rise;
+                break;
+            case St.Side.LEFT:
+                this.actor.x -= rise;
+                break;
+            case St.Side.RIGHT:
+                this.actor.x += rise;
+                break;
+        }
+
+        Tweener.addTween(this.actor, { opacity: 255,
+                                       x: x,
+                                       y: y,
+                                       transition: "linear",
+                                       onComplete: onComplete,
+                                       time: POPUP_ANIMATION_TIME });
+    },
+
+    animateDisappear: function(onComplete) {
+        let x = this.actor.x;
+        let y = this.actor.y;
+        let originalX = this.actor.x;
+        let originalY = this.actor.y;
+        let themeNode = this.actor.get_theme_node();
+        let [found, rise] = themeNode.get_length('-arrow-rise', false);
+        if (!found)
+            rise = 0;
+
+        switch (this._arrowSide) {
+            case St.Side.TOP:
+                y += rise;
+                break;
+            case St.Side.BOTTOM:
+                y -= rise;
+                break;
+            case St.Side.LEFT:
+                x += rise;
+                break;
+            case St.Side.RIGHT:
+                x -= rise;
+                break;
+        }
+
+        Tweener.addTween(this.actor, { opacity: 0,
+                                       x: x,
+                                       y: y,
+                                       transition: "linear",
+                                       time: POPUP_ANIMATION_TIME,
+                                       onComplete: Lang.bind(this, function () {
+                                           this.actor.hide();
+                                           this.actor.x = originalX;
+                                           this.actor.y = originalY;
+                                           if (onComplete)
+                                               onComplete();
+                                       })
+                                     });
+    },
+
     _adjustAllocationForArrow: function(isWidth, alloc) {
         let themeNode = this.actor.get_theme_node();
         let found, borderWidth, base, rise;
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
index 7e60fe8..60f9011 100644
--- a/js/ui/popupMenu.js
+++ b/js/ui/popupMenu.js
@@ -16,8 +16,6 @@ const Tweener = imports.ui.tweener;
 const Gettext = imports.gettext.domain('gnome-shell');
 const _ = Gettext.gettext;
 
-const POPUP_ANIMATION_TIME = 0.1;
-
 function Switch() {
     this._init.apply(this, arguments);
 }
@@ -639,11 +637,8 @@ PopupMenu.prototype = {
         this.actor.y = Math.floor(menuY);
 
         // Now show it
-        this.actor.opacity = 0;
         this.actor.reactive = true;
-        Tweener.addTween(this.actor, { opacity: 255,
-                                       transition: "easeOutQuad",
-                                       time: POPUP_ANIMATION_TIME });
+        this._boxPointer.animateAppear();
         this.isOpen = true;
         this.emit('open-state-changed', true);
     },
@@ -657,11 +652,7 @@ PopupMenu.prototype = {
         if (this._activeMenuItem)
             this._activeMenuItem.setActive(false);
         this.actor.reactive = false;
-        Tweener.addTween(this.actor, { opacity: 0,
-                                       transition: "easeOutQuad",
-                                       time: POPUP_ANIMATION_TIME,
-                                       onComplete: Lang.bind(this, function () { this.actor.hide(); })});
-
+        this._boxPointer.animateDisappear();
         this.isOpen = false;
         this.emit('open-state-changed', false);
     },



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