From 1694148bdb3d38462ce2efafc74f49673a521b2d Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 18 Nov 2010 16:18:54 -0500 Subject: [PATCH] popupMenu: don't animate menus when switching from one to another Don't do the "slide" effect when moving from one menu to another; only do it when opening the first menu, or closing a menu without opening another one. https://bugzilla.gnome.org/show_bug.cgi?id=634755 --- js/ui/boxpointer.js | 60 +++++++++++++++------------- js/ui/messageTray.js | 4 +- js/ui/popupMenu.js | 94 ++++++++++++++++++++++---------------------- 3 files changed, 80 insertions(+), 78 deletions(-) diff --git a/js/ui/boxpointer.js b/js/ui/boxpointer.js index 450bed3ef..b7c73d7e2 100644 --- a/js/ui/boxpointer.js +++ b/js/ui/boxpointer.js @@ -42,7 +42,7 @@ BoxPointer.prototype = { this.bin.raise(this._border); }, - animateAppear: function(onComplete) { + show: function(animate, onComplete) { let x = this.actor.x; let y = this.actor.y; let themeNode = this.actor.get_theme_node(); @@ -51,19 +51,21 @@ BoxPointer.prototype = { 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; + if (animate) { + 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, @@ -74,7 +76,7 @@ BoxPointer.prototype = { time: POPUP_ANIMATION_TIME }); }, - animateDisappear: function(onComplete) { + hide: function(animate, onComplete) { let x = this.actor.x; let y = this.actor.y; let originalX = this.actor.x; @@ -82,19 +84,21 @@ BoxPointer.prototype = { let themeNode = this.actor.get_theme_node(); let rise = themeNode.get_length('-arrow-rise'); - 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; + if (animate) { + 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, diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index a63744f51..97ce07d5a 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -1676,7 +1676,7 @@ MessageTray.prototype = { this._adjustNotificationBoxPointerPosition(); this._summaryNotificationState = State.SHOWING; - this._summaryNotificationBoxPointer.animateAppear(Lang.bind(this, function() { + this._summaryNotificationBoxPointer.show(true, Lang.bind(this, function() { this._summaryNotificationState = State.SHOWN; })); }, @@ -1715,7 +1715,7 @@ MessageTray.prototype = { this._summaryNotification.ungrabFocus(); this._summaryNotificationState = State.HIDING; - this._summaryNotificationBoxPointer.animateDisappear(Lang.bind(this, this._hideSummaryNotificationCompleted)); + this._summaryNotificationBoxPointer.hide(true, Lang.bind(this, this._hideSummaryNotificationCompleted)); }, _hideSummaryNotificationCompleted: function() { diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js index 6d04e3d26..c36e95684 100644 --- a/js/ui/popupMenu.js +++ b/js/ui/popupMenu.js @@ -642,7 +642,7 @@ PopupMenuBase.prototype = { this.box.insert_actor(menuItem.menu.actor, position + 1); menuItem._subMenuActivateId = menuItem.menu.connect('activate', Lang.bind(this, function() { this.emit('activate'); - this.close(); + this.close(true); })); menuItem._subMenuActiveChangeId = menuItem.menu.connect('active-changed', Lang.bind(this, function(submenu, submenuItem) { if (this._activeMenuItem && this._activeMenuItem != submenuItem) @@ -652,7 +652,7 @@ PopupMenuBase.prototype = { })); menuItem._closingId = this.connect('open-state-changed', function(self, open) { if (!open) - menuItem.menu.immediateClose(); + menuItem.menu.close(false); }); } menuItem._activeChangeId = menuItem.connect('active-changed', Lang.bind(this, function (menuItem, active) { @@ -668,7 +668,7 @@ PopupMenuBase.prototype = { })); menuItem._activateId = menuItem.connect('activate', Lang.bind(this, function (menuItem, event) { this.emit('activate', menuItem); - this.close(); + this.close(true); })); menuItem.connect('destroy', Lang.bind(this, function(emitter) { menuItem.disconnect(menuItem._activateId); @@ -735,9 +735,9 @@ PopupMenuBase.prototype = { toggle: function() { if (this.isOpen) - this.close(); + this.close(true); else - this.open(); + this.open(true); }, destroy: function() { @@ -802,26 +802,26 @@ PopupMenu.prototype = { this._boxPointer.setArrowOrigin(origin); }, - open: function() { + open: function(animate) { if (this.isOpen) return; this.isOpen = true; this._boxPointer.setPosition(this.sourceActor, this._gap, this._alignment); - this._boxPointer.animateAppear(); + this._boxPointer.show(animate); this.emit('open-state-changed', true); }, - close: function() { + close: function(animate) { if (!this.isOpen) return; if (this._activeMenuItem) this._activeMenuItem.setActive(false); - this._boxPointer.animateDisappear(); + this._boxPointer.hide(animate); this.isOpen = false; this.emit('open-state-changed', false); @@ -848,12 +848,15 @@ PopupSubMenu.prototype = { this.actor.hide(); }, - open: function() { + open: function(animate) { if (this.isOpen) return; this.isOpen = true; + // we don't implement the !animate case because that doesn't + // currently get used... + let [naturalHeight, minHeight] = this.actor.get_preferred_height(-1); this.actor.height = 0; this.actor.show(); @@ -874,7 +877,7 @@ PopupSubMenu.prototype = { }); }, - close: function() { + close: function(animate) { if (!this.isOpen) return; @@ -883,44 +886,38 @@ PopupSubMenu.prototype = { if (this._activeMenuItem) this._activeMenuItem.setActive(false); - this.actor._arrow_rotation = this._arrow.rotation_angle_z; - Tweener.addTween(this.actor, - { _arrow_rotation: 0, - height: 0, - time: 0.25, - onCompleteScope: this, - onComplete: function() { - this.actor.hide(); - this.actor.set_height(-1); + if (animate) { + this.actor._arrow_rotation = this._arrow.rotation_angle_z; + Tweener.addTween(this.actor, + { _arrow_rotation: 0, + height: 0, + time: 0.25, + onCompleteScope: this, + onComplete: function() { + this.actor.hide(); + this.actor.set_height(-1); - this.emit('open-state-changed', false); - }, - onUpdateScope: this, - onUpdate: function() { - this._arrow.rotation_angle_z = this.actor._arrow_rotation; - } - }); - }, + this.emit('open-state-changed', false); + }, + onUpdateScope: this, + onUpdate: function() { + this._arrow.rotation_angle_z = this.actor._arrow_rotation; + } + }); + } else { + this._arrow.rotation_angle_z = 0; + this.actor.hide(); - immediateClose: function() { - if (!this.isOpen) - return; - - if (this._activeMenuItem) - this._activeMenuItem.setActive(false); - - this._arrow.rotation_angle_z = 0; - this.actor.hide(); - - this.isOpen = false; - this.emit('open-state-changed', false); + this.isOpen = false; + this.emit('open-state-changed', false); + } }, _onKeyPressEvent: function(actor, event) { // Move focus back to parent menu if the user types Left. if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) { - this.close(); + this.close(true); this.sourceActor._delegate.setActive(true); return true; } @@ -964,7 +961,7 @@ PopupSubMenuMenuItem.prototype = { _onKeyPressEvent: function(actor, event) { if (event.get_key_symbol() == Clutter.KEY_Right) { - this.menu.open(); + this.menu.open(true); this.menu.activateFirst(); return true; } @@ -972,7 +969,7 @@ PopupSubMenuMenuItem.prototype = { }, activate: function(event) { - this.menu.open(); + this.menu.open(true); }, _onButtonReleaseEvent: function(actor) { @@ -1118,9 +1115,10 @@ PopupMenuManager.prototype = { // before closing it to keep that from happening let oldMenu = this._activeMenu; this._activeMenu = null; - oldMenu.close(); - } - newMenu.open(); + oldMenu.close(false); + newMenu.open(false); + } else + newMenu.open(true); }, _onMenuSourceEnter: function(menu) { @@ -1152,7 +1150,7 @@ PopupMenuManager.prototype = { return; if (focus._delegate && this._findMenu(focus._delegate.menu) != -1) return; - menu.close(); + menu.close(true); })); }, @@ -1240,6 +1238,6 @@ PopupMenuManager.prototype = { _closeMenu: function() { if (this._activeMenu != null) - this._activeMenu.close(); + this._activeMenu.close(true); } };