From 6c4daaaa71f5d829b21ef4d853a911375f9e3240 Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Tue, 4 Dec 2012 00:16:28 -0500 Subject: [PATCH] overview: streamline sides state change Instead of dirty tricks like connecting to "notify::visible" on the dash after we hide it, split the page-change signal into before/after-page-change, and turn setSideControlsVisibility() into a better state machine. --- js/ui/overview.js | 74 +++++++++++++++++++++++++++---------------- js/ui/viewSelector.js | 8 +++-- 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/js/ui/overview.js b/js/ui/overview.js index e9edbd1a7..7c1d2eb54 100644 --- a/js/ui/overview.js +++ b/js/ui/overview.js @@ -98,6 +98,13 @@ const ShellInfo = new Lang.Class({ } }); +const ControlsChange = { + BEFORE_PAGE: 1, + AFTER_PAGE: 2, + DND_START: 3, + DND_END: 4 +}; + const Overview = new Lang.Class({ Name: 'Overview', @@ -268,29 +275,33 @@ const Overview = new Lang.Class({ y_fill: true }); this._overview.add_actor(this._messageTrayGhost); - this._viewSelector.connect('page-changed', Lang.bind(this, + this._viewSelector.connect('after-page-change', Lang.bind(this, function() { - this._setSideControlsVisibility(false); + this._setSideControlsVisibility(ControlsChange.AFTER_PAGE); + })); + this._viewSelector.connect('before-page-change', Lang.bind(this, + function() { + this._setSideControlsVisibility(ControlsChange.BEFORE_PAGE); })); this.connect('item-drag-begin', Lang.bind(this, function() { - this._setSideControlsVisibility(true); + this._setSideControlsVisibility(ControlsChange.DND_START); })); this.connect('item-drag-cancelled', Lang.bind(this, function() { - this._setSideControlsVisibility(false); + this._setSideControlsVisibility(ControlsChange.DND_END); })); this.connect('item-drag-end', Lang.bind(this, function() { - this._setSideControlsVisibility(false); + this._setSideControlsVisibility(ControlsChange.DND_END); })); Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._relayout)); this._relayout(); }, - _setSideControlsVisibility: function(inDrag) { + _setSideControlsVisibility: function(changeType) { // Ignore the case when we're leaving the overview, since // actors will be made visible again when entering the overview // next time, and animating them while doing so is just @@ -300,34 +311,41 @@ const Overview = new Lang.Class({ let appsActive = this._viewSelector.getAppsActive(); let searchActive = this._viewSelector.getSearchActive(); - - let dashVisible = !searchActive || inDrag; - let thumbnailsVisible = (!searchActive && !appsActive) || inDrag; + let dashVisible = !searchActive || (changeType == ControlsChange.DND_START); + let thumbnailsVisible = (!searchActive && !appsActive) || (changeType == ControlsChange.DND_START); let trayVisible = !searchActive; let trayGhostVisible = trayVisible || dashVisible; - if (dashVisible) { - this._dash.show(); - this._messageTrayGhost.visible = trayGhostVisible; - } else { - let visibleId = this._dash.actor.connect('notify::visible', Lang.bind(this, - function() { - this._dash.actor.disconnect(visibleId); - if (!trayVisible && !this._dash.actor.visible) - this._messageTrayGhost.hide(); - })); - this._dash.hide(); + if ((changeType == ControlsChange.BEFORE_PAGE) || + (changeType == ControlsChange.DND_START)) { + if (dashVisible) + this._dash.show(); + if (thumbnailsVisible) + this._thumbnailsBox.show(); } - if (thumbnailsVisible) - this._thumbnailsBox.show(); - else - this._thumbnailsBox.hide(); + if ((changeType == ControlsChange.BEFORE_PAGE) || + (changeType == ControlsChange.DND_END)) { + if (!dashVisible) { + this._dash.hide(); + } + if (!thumbnailsVisible) + this._thumbnailsBox.hide(); + } - if (trayVisible) - Main.messageTray.show(); - else - Main.messageTray.hide(); + if (changeType == ControlsChange.BEFORE_PAGE || + changeType == ControlsChange.DND_START) { + if (trayGhostVisible) + this._messageTrayGhost.show(); + if (trayVisible) + Main.messageTray.show(); + else + Main.messageTray.hide(); + } else if (changeType == ControlsChange.AFTER_PAGE || + changeType == ControlsChange.DND_END) { + if (!trayGhostVisible) + this._messageTrayGhost.hide(); + } }, addSearchProvider: function(provider) { diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js index d72d7c765..f2b583d41 100644 --- a/js/ui/viewSelector.js +++ b/js/ui/viewSelector.js @@ -204,16 +204,20 @@ const ViewSelector = new Lang.Class({ function() { this._activePage.hide(); this._activePage = page; - this.emit('page-changed'); }) }); } + this.emit('before-page-change'); page.show(); Tweener.addTween(page, { opacity: 255, time: 0.1, - transition: 'easeOutQuad' + transition: 'easeOutQuad', + onComplete: Lang.bind(this, + function() { + this.emit('after-page-change'); + }) }); },