From b0f857f0d1a1bec3d9c56a6e76d54932bfc6bf01 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Tue, 8 Apr 2025 16:01:36 +1000 Subject: feat: add navbar For controlling sidebar panes + other stuff later --- src/modules/navbar.tsx | 120 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 src/modules/navbar.tsx (limited to 'src/modules/navbar.tsx') diff --git a/src/modules/navbar.tsx b/src/modules/navbar.tsx new file mode 100644 index 0000000..b844ff4 --- /dev/null +++ b/src/modules/navbar.tsx @@ -0,0 +1,120 @@ +import type { Monitor } from "@/services/monitors"; +import type { AstalWidget } from "@/utils/types"; +import { Variable } from "astal"; +import { Astal, Gtk } from "astal/gtk3"; +import { navbar as config } from "config"; +import AstalHyprland from "gi://AstalHyprland"; +import SideBar, { awaitSidebar, paneNames, switchPane, type PaneName } from "./sidebar"; + +const getPaneIcon = (name: PaneName) => { + if (name === "dashboard") return "dashboard"; + if (name === "audio") return "tune"; + if (name === "connectivity") return "settings_ethernet"; + if (name === "packages") return "package_2"; + if (name === "notifpane") return "notifications"; + return "date_range"; +}; + +const getPaneName = (name: PaneName) => { + if (name === "dashboard") return "Dash"; + if (name === "audio") return "Audio"; + if (name === "connectivity") return "Conn"; + if (name === "packages") return "Pkgs"; + if (name === "notifpane") return "Alrts"; + return "Time"; +}; + +const hookIsCurrent = ( + self: AstalWidget, + sidebar: Variable, + name: PaneName, + callback: (isCurrent: boolean) => void +) => { + const unsub = sidebar.subscribe(s => { + if (!s) return; + self.hook(s.shown, (_, v) => callback(s.visible && v === name)); + self.hook(s, "notify::visible", () => callback(s.visible && s.shown.get() === name)); + callback(s.visible && s.shown.get() === name); + unsub(); + }); +}; + +const PaneButton = ({ + monitor, + name, + sidebar, +}: { + monitor: Monitor; + name: PaneName; + sidebar: Variable; +}) => ( + +); + +export default ({ monitor }: { monitor: Monitor }) => { + const sidebar = Variable(null); + awaitSidebar(monitor).then(s => sidebar.set(s)); + + return ( + { + const hyprland = AstalHyprland.get_default(); + const visible = Variable(config.persistent.get()); + + visible.poll(100, () => { + const width = self.visible + ? Math.max(config.appearWidth.get(), self.get_allocated_width()) + : config.appearWidth.get(); + return hyprland.get_cursor_position().x < width; + }); + if (config.persistent.get()) visible.stopPoll(); + + self.hook(config.persistent, (_, v) => { + if (v) { + visible.stopPoll(); + visible.set(true); + } else visible.startPoll(); + }); + + self.hook(visible, (_, v) => self.set_visible(v)); + self.connect("destroy", () => visible.drop()); + }} + > + { + const shown = sidebar.get()?.shown; + if (!shown) return; + const idx = paneNames.indexOf(shown.get()); + if (event.delta_y > 0) shown.set(paneNames[Math.min(paneNames.length - 1, idx + 1)]); + else shown.set(paneNames[Math.max(0, idx - 1)]); + }} + > + + {paneNames.map(n => ( + + ))} + + + + ); +}; -- cgit v1.2.3-freya