feat(ags): don't remake apps in overview every time, refactor and anims

This commit is contained in:
matt1432 2023-09-20 14:20:05 -04:00
parent d276afa56a
commit bf5f236938

View file

@ -1,4 +1,4 @@
const { Window, Box, CenterBox, Icon } = ags.Widget; const { Window, Box, CenterBox, Icon, Revealer } = ags.Widget;
const { Hyprland, Applications } = ags.Service; const { Hyprland, Applications } = ags.Service;
const { Gtk } = imports.gi; const { Gtk } = imports.gi;
@ -6,6 +6,12 @@ import { EventBox } from '../misc/cursorbox.js';
const SCALE = 0.11; const SCALE = 0.11;
const MARGIN = 8; const MARGIN = 8;
const DEFAULT_SPECIAL = {
SIZE_X: 1524,
SIZE_Y: 908,
POS_X: 197,
POS_Y: 170,
};
export const Overview = Window({ export const Overview = Window({
name: 'overview', name: 'overview',
@ -38,8 +44,9 @@ export const Overview = Window({
], ],
connections: [ connections: [
[Hyprland, box => { [Hyprland, box => {
box._workspaces = box.children[0].centerWidget.children.concat( let childI = 0;
box.children[1].centerWidget.children) box._workspaces = box.children[childI++].centerWidget.children.concat(
box.children[childI].centerWidget.children)
let newWorkspaces = Hyprland.workspaces; let newWorkspaces = Hyprland.workspaces;
if (newWorkspaces.length > box._workspaces.length) { if (newWorkspaces.length > box._workspaces.length) {
@ -63,36 +70,72 @@ export const Overview = Window({
box._workspaces.forEach(workspace => { box._workspaces.forEach(workspace => {
let fixed = workspace.children[0].child; let fixed = workspace.children[0].child;
fixed.get_children().forEach(ch => ch.destroy()); let toRemove = fixed.get_children();
box._clients.filter(app => app.workspace.id == workspace._id).forEach(app => { box._clients.filter(app => app.workspace.id == workspace._id).forEach(app => {
let active = ''; let active = '';
if (app.address == Hyprland.active.client.address) { if (app.address == Hyprland.active.client.address) {
active = 'active'; active = 'active';
print(app.at[0])
print(app.at[1])
} }
// Special workspaces that haven't been opened yet
// return a size of 0.
if (app.size[0] === 0) { if (app.size[0] === 0) {
app.size[0] = 1524; app.size[0] = DEFAULT_SPECIAL.SIZE_X;
app.size[1] = 908; app.size[1] = DEFAULT_SPECIAL.SIZE_Y;
app.at[0] = 197; app.at[0] = DEFAULT_SPECIAL.POS_X;
app.at[1] = 170; app.at[1] = DEFAULT_SPECIAL.POS_Y;
} }
let existingApp = fixed.get_children().find(ch => ch._address == app.address);
toRemove.splice(toRemove.indexOf(existingApp), 1);
if (existingApp) {
fixed.move(
existingApp,
app.at[0] * SCALE,
app.at[1] * SCALE,
);
existingApp.child.className = `window ${active}`;
existingApp.child.style = `min-width: ${app.size[0] * SCALE - MARGIN}px;
min-height: ${app.size[1] * SCALE - MARGIN}px;
transition: min-width 0.2s ease, min-height 0.2s ease`;
}
else {
fixed.put( fixed.put(
Icon({ Revealer({
transition: 'slide_right',
connections: [[Hyprland, rev => {
rev.revealChild = true;
}]],
properties: [
['address', app.address],
['toDestroy', false]
],
child: Icon({
className: `window ${active}`, className: `window ${active}`,
style: `min-width: ${app.size[0] * SCALE - MARGIN}px; style: `min-width: ${app.size[0] * SCALE - MARGIN}px;
min-height: ${app.size[1] * SCALE - MARGIN}px;`, min-height: ${app.size[1] * SCALE - MARGIN}px;
transition: min-width 0.2s ease, min-height 0.2s ease`,
icon: app.class, icon: app.class,
size: 40, size: 40,
}), }),
}),
app.at[0] * SCALE, app.at[0] * SCALE,
app.at[1] * SCALE app.at[1] * SCALE,
); );
}
}); });
fixed.show_all(); fixed.show_all();
toRemove.forEach(ch => {
if (ch._toDestroy) {
ch.destroy();
}
else {
ch.revealChild = false;
ch._toDestroy = true;
}
});
}); });
}).catch(print); }).catch(print);
}], }],
@ -112,7 +155,6 @@ export const Overview = Window({
childI = 1; childI = 1;
} }
// TODO: make this a revealer so no awkward jump
box.children[childI].centerWidget.add( box.children[childI].centerWidget.add(
Box({ Box({
properties: [['id', ws.id]], properties: [['id', ws.id]],