gnome-shell/js/ui/workspaceSwitcherPopup.js
Florian Müllner f88222edd6 workspaceSwitcherPopup: Implement new OSD design
Move the popup to the bottom and represent workspaces as small dots
instead of as scaled down representations of the work area.

https://gitlab.gnome.org/Teams/Design/os-mockups/-/issues/152

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2127>
2022-02-12 15:28:52 +00:00

110 lines
3.3 KiB
JavaScript

// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported WorkspaceSwitcherPopup */
const { Clutter, GLib, GObject, St } = imports.gi;
const Layout = imports.ui.layout;
const Main = imports.ui.main;
var ANIMATION_TIME = 100;
var DISPLAY_TIMEOUT = 600;
var WorkspaceSwitcherPopup = GObject.registerClass(
class WorkspaceSwitcherPopup extends Clutter.Actor {
_init() {
super._init({
offscreen_redirect: Clutter.OffscreenRedirect.ALWAYS,
x_expand: true,
y_expand: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.END,
});
const constraint = new Layout.MonitorConstraint({ primary: true });
this.add_constraint(constraint);
Main.uiGroup.add_actor(this);
this._timeoutId = 0;
this._list = new St.BoxLayout({
style_class: 'workspace-switcher',
});
this.add_child(this._list);
this._redisplay();
this.hide();
let workspaceManager = global.workspace_manager;
this._workspaceManagerSignals = [];
this._workspaceManagerSignals.push(workspaceManager.connect('workspace-added',
this._redisplay.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect('workspace-removed',
this._redisplay.bind(this)));
this.connect('destroy', this._onDestroy.bind(this));
}
_redisplay() {
let workspaceManager = global.workspace_manager;
this._list.destroy_all_children();
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
const indicator = new St.Bin({
style_class: 'ws-switcher-indicator',
});
if (i === this._activeWorkspaceIndex)
indicator.add_style_pseudo_class('active');
this._list.add_actor(indicator);
}
}
display(activeWorkspaceIndex) {
this._activeWorkspaceIndex = activeWorkspaceIndex;
this._redisplay();
if (this._timeoutId != 0)
GLib.source_remove(this._timeoutId);
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, DISPLAY_TIMEOUT, this._onTimeout.bind(this));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout');
const duration = this.visible ? 0 : ANIMATION_TIME;
this.show();
this.opacity = 0;
this.ease({
opacity: 255,
duration,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
}
_onTimeout() {
GLib.source_remove(this._timeoutId);
this._timeoutId = 0;
this.ease({
opacity: 0.0,
duration: ANIMATION_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => this.destroy(),
});
return GLib.SOURCE_REMOVE;
}
_onDestroy() {
if (this._timeoutId)
GLib.source_remove(this._timeoutId);
this._timeoutId = 0;
let workspaceManager = global.workspace_manager;
for (let i = 0; i < this._workspaceManagerSignals.length; i++)
workspaceManager.disconnect(this._workspaceManagerSignals[i]);
this._workspaceManagerSignals = [];
}
});