fix(ags bar workspace): make sure highlight is always in the right place

This commit is contained in:
matt1432 2023-10-31 10:18:58 -04:00
parent 2af7237e5c
commit 4e53263c7b

View file

@ -1,5 +1,5 @@
import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js'; import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js';
import { execAsync } from 'resource:///com/github/Aylur/ags/utils.js'; import { execAsync, timeout } from 'resource:///com/github/Aylur/ags/utils.js';
import { Box, Overlay, Revealer } from 'resource:///com/github/Aylur/ags/widget.js'; import { Box, Overlay, Revealer } from 'resource:///com/github/Aylur/ags/widget.js';
import EventBox from '../misc/cursorbox.js'; import EventBox from '../misc/cursorbox.js';
@ -28,60 +28,73 @@ const Workspace = ({ i } = {}) =>
}), }),
}); });
export default () => Overlay({ export default () => {
setup: self => { const updateHighlight = () => {
self.set_overlay_pass_through( const currentId = Hyprland.active.workspace.id;
self.get_children()[1], const indicators = highlight.get_parent().get_children()[0].child.children;
true, const currentIndex = indicators.findIndex(w => w._id == currentId);
);
}, if (currentIndex < 0)
overlays: [Box({ return;
highlight.setStyle(`margin-left: ${16 + currentIndex * 30}px`);
};
const highlight = Box({
valign: 'center', valign: 'center',
halign: 'start', halign: 'start',
className: 'button active', className: 'button active',
connections: [[Hyprland.active.workspace, self => { connections: [[Hyprland.active.workspace, updateHighlight]],
const currentId = Hyprland.active.workspace.id; });
const indicators = self.get_parent().get_children()[0].child.children;
const currentIndex = indicators.findIndex(w => w._id == currentId);
self.setStyle(`margin-left: ${16 + currentIndex * 30}px`); const widget = Overlay({
}]], setup: self => {
})], self.set_overlay_pass_through(
child: EventBox({ self.get_children()[1],
child: Box({ true,
className: 'workspaces', );
properties: [ },
['workspaces'], overlays: [highlight],
child: EventBox({
child: Box({
className: 'workspaces',
properties: [
['workspaces'],
['refresh', self => { ['refresh', self => {
self.children.forEach(rev => rev.reveal_child = false); self.children.forEach(rev => rev.reveal_child = false);
self._workspaces.forEach(ws => { self._workspaces.forEach(ws => {
ws.revealChild = true; ws.revealChild = true;
}); });
}], }],
['updateWorkspaces', self => { ['updateWorkspaces', self => {
Hyprland.workspaces.forEach(ws => { Hyprland.workspaces.forEach(ws => {
const currentWs = self.children.find(ch => ch._id == ws.id); const currentWs = self.children.find(ch => ch._id == ws.id);
if (!currentWs && ws.id > 0) if (!currentWs && ws.id > 0)
self.add(Workspace({ i: ws.id })); self.add(Workspace({ i: ws.id }));
}); });
self.show_all(); self.show_all();
// Make sure the order is correct // Make sure the order is correct
self._workspaces.forEach((workspace, i) => { self._workspaces.forEach((workspace, i) => {
workspace.get_parent().reorder_child(workspace, i); workspace.get_parent().reorder_child(workspace, i);
}); });
}], }],
], ],
connections: [[Hyprland, self => { connections: [[Hyprland, self => {
self._workspaces = self.children.filter(ch => { self._workspaces = self.children.filter(ch => {
return Hyprland.workspaces.find(ws => ws.id == ch._id); return Hyprland.workspaces.find(ws => ws.id == ch._id);
}).sort((a, b) => a._id - b._id); }).sort((a, b) => a._id - b._id);
self._updateWorkspaces(self); self._updateWorkspaces(self);
self._refresh(self); self._refresh(self);
}]],
// Make sure the highlight doesn't go too far
timeout(10, updateHighlight);
}]],
}),
}), }),
}), });
});
return widget;
};