allView: Scale in when moving icons from folders

App icons inside folders are already animated when the folder is
opened, but moving an app icon from a folder doesn't, making the
transition abrupt.

Fortunately, it's easy to detect icons that were previously hidden
but are not anymore.

Add an animation to these icons when showing.

WIP: tentatively using the Tweener parameters from Endless OS.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/603
This commit is contained in:
Georges Basile Stavracas Neto 2019-06-29 14:09:32 -03:00
parent 52257f5137
commit 11ce7829bc
No known key found for this signature in database
GPG Key ID: 886C17EE170D1385

View File

@ -39,6 +39,9 @@ var VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
var PAGE_SWITCH_TIME = 0.3; var PAGE_SWITCH_TIME = 0.3;
var APP_ICON_SCALE_IN_TIME = 0.5;
var APP_ICON_SCALE_IN_DELAY = 0.7;
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl'; const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl'; const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl';
@ -358,6 +361,8 @@ var AllView = class AllView extends BaseAppView {
} }
_refilterApps() { _refilterApps() {
let filteredApps = this._allItems.filter(icon => !icon.actor.visible);
this._allItems.forEach(icon => { this._allItems.forEach(icon => {
if (icon instanceof AppIcon) if (icon instanceof AppIcon)
icon.actor.visible = true; icon.actor.visible = true;
@ -370,6 +375,14 @@ var AllView = class AllView extends BaseAppView {
appIcon.actor.visible = false; appIcon.actor.visible = false;
}); });
}); });
// Scale in app icons that weren't visible, but now are
this._allItems.filter(icon => {
return icon.actor.visible && filteredApps.includes(icon);
}).forEach(icon => {
if (icon instanceof AppIcon)
icon.scheduleScaleIn();
});
} }
getAppInfos() { getAppInfos() {
@ -1705,6 +1718,7 @@ var AppIcon = class AppIcon {
this._iconContainer.add_child(this._dot); this._iconContainer.add_child(this._dot);
this.actor._delegate = this; this.actor._delegate = this;
this._scaleInId = 0;
// Get the isDraggable property without passing it on to the BaseIcon: // Get the isDraggable property without passing it on to the BaseIcon:
let appIconParams = Params.parse(iconParams, { isDraggable: true }, true); let appIconParams = Params.parse(iconParams, { isDraggable: true }, true);
@ -1902,6 +1916,46 @@ var AppIcon = class AppIcon {
this.icon.animateZoomOut(); this.icon.animateZoomOut();
} }
_scaleIn() {
this.actor.scale_x = 0;
this.actor.scale_y = 0;
this.actor.pivot_point = new Clutter.Point({ x: 0.5, y: 0.5 });
Tweener.addTween(this.actor, {
scale_x: 1,
scale_y: 1,
time: APP_ICON_SCALE_IN_TIME,
delay: APP_ICON_SCALE_IN_DELAY,
transition: (t, b, c, d) => {
// Similar to easeOutElastic, but less aggressive.
t /= d;
let p = 0.5;
return b + c * (Math.pow(2, -11 * t) * Math.sin(2 * Math.PI * (t - p / 4) / p) + 1);
}
});
}
_unscheduleScaleIn() {
if (this._scaleInId != 0) {
this.actor.disconnect(this._scaleInId);
this._scaleInId = 0;
}
}
scheduleScaleIn() {
if (this._scaleInId != 0)
return;
if (this.actor.mapped) {
this._scaleIn();
} else {
this._scaleInId = this.actor.connect('notify::mapped', () => {
this._unscheduleScaleIn();
this._scaleIn();
})
}
}
shellWorkspaceLaunch(params) { shellWorkspaceLaunch(params) {
params = Params.parse(params, { workspace: -1, params = Params.parse(params, { workspace: -1,
timestamp: 0 }); timestamp: 0 });