workspaceThumbnail: Scale workspaces in and out

Make the slide property control the workspace scale, so that new workspaces
scale up, and destroyed workspaces scale down. The scale is done horizontally,
and only slightly vertically, as per design direction.

Rework the state tracking mechanism to remove the COLLAPSING state, since there's
no split between sliding out and collapsing anymore. Also remove the corresponding
'collapse-fraction' property from WorkspaceThumbnail.

Make ThumbnailsBox.vfunc_get_preferred_width() consider the slide-position property.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1593>
This commit is contained in:
Georges Basile Stavracas Neto 2021-01-27 13:28:36 -03:00 committed by Marge Bot
parent df2181c913
commit 9db9445b0f

View File

@ -5,6 +5,7 @@ const { Clutter, Gio, GLib, GObject, Graphene, Meta, Shell, St } = imports.gi;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const Main = imports.ui.main; const Main = imports.ui.main;
const Util = imports.misc.util;
const Workspace = imports.ui.workspace; const Workspace = imports.ui.workspace;
// The maximum size of a thumbnail is 5% the width and height of the screen // The maximum size of a thumbnail is 5% the width and height of the screen
@ -257,6 +258,7 @@ var WorkspaceThumbnail = GObject.registerClass({
super._init({ super._init({
clip_to_allocation: true, clip_to_allocation: true,
style_class: 'workspace-thumbnail', style_class: 'workspace-thumbnail',
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
}); });
this._delegate = this; this._delegate = this;
@ -334,6 +336,11 @@ var WorkspaceThumbnail = GObject.registerClass({
set slide_position(slidePosition) { set slide_position(slidePosition) {
if (this._slidePosition == slidePosition) if (this._slidePosition == slidePosition)
return; return;
const scale = Util.lerp(1, 0.75, slidePosition);
this.set_scale(scale, scale);
this.opacity = Util.lerp(255, 0, slidePosition);
this._slidePosition = slidePosition; this._slidePosition = slidePosition;
this.notify('slide-position'); this.notify('slide-position');
this.queue_relayout(); this.queue_relayout();
@ -1205,8 +1212,19 @@ var ThumbnailsBox = GObject.registerClass({
let nWorkspaces = this._thumbnails.length; let nWorkspaces = this._thumbnails.length;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
const naturalWidth = const naturalWidth = this._thumbnails.reduce((accumulator, thumbnail, index) => {
totalSpacing + nWorkspaces * this._porthole.width * MAX_THUMBNAIL_SCALE; let workspaceSpacing = 0;
if (index > 0)
workspaceSpacing += spacing / 2;
if (index < this._thumbnails.length - 1)
workspaceSpacing += spacing / 2;
const progress = 1 - thumbnail.collapse_fraction;
const width = (this._porthole.width * MAX_THUMBNAIL_SCALE + workspaceSpacing) * progress;
return accumulator + width;
}, 0);
return themeNode.adjust_preferred_width(totalSpacing, naturalWidth); return themeNode.adjust_preferred_width(totalSpacing, naturalWidth);
} }