From 4a1a3a6d8915474c2e25f2f1f5e3ec8c84543081 Mon Sep 17 00:00:00 2001
From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>
Date: Mon, 7 Apr 2025 13:38:23 +1000
Subject: bar: add optional labels for workspaces

Also can customise labels
---
 src/modules/bar.tsx | 51 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 30 insertions(+), 21 deletions(-)

(limited to 'src/modules/bar.tsx')

diff --git a/src/modules/bar.tsx b/src/modules/bar.tsx
index 998a442..97ce4d5 100644
--- a/src/modules/bar.tsx
+++ b/src/modules/bar.tsx
@@ -209,6 +209,7 @@ const Workspace = ({ idx }: { idx: number }) => {
               config.modules.workspaces.shown.get() +
           idx
         : idx;
+
     return (
         <button
             halign={Gtk.Align.CENTER}
@@ -239,31 +240,39 @@ const Workspace = ({ idx }: { idx: number }) => {
                 self.toggleClassName("focused", hyprland.focusedWorkspace?.id === wsId);
                 update();
             }}
-        />
+        >
+            <label
+                visible={bind(config.modules.workspaces.showLabels)}
+                css={bind(config.modules.workspaces.xalign).as(a => `margin-left: ${a}px; margin-right: ${-a}px;`)}
+                label={bind(config.modules.workspaces.labels).as(l => l[idx - 1] ?? String(idx))}
+            />
+        </button>
     );
 };
 
-const Workspaces = ({ monitor, ...props }: ModuleProps) => (
-    <eventbox
-        onScroll={(_, event) => {
-            const activeWs = hyprland.focusedClient?.workspace.name;
-            if (activeWs?.startsWith("special:")) hyprland.dispatch("togglespecialworkspace", activeWs.slice(8));
-            else if (event.delta_y > 0 || hyprland.focusedWorkspace?.id > 1)
-                hyprland.dispatch("workspace", (event.delta_y < 0 ? "-" : "+") + 1);
-        }}
-    >
-        <box
-            vertical={bind(config.vertical)}
-            className={bind(config.modules.workspaces.shown).as(
-                s => `module workspaces ${s % 2 === 0 ? "even" : "odd"} ${getClassName(props)}`
-            )}
+const Workspaces = ({ monitor, ...props }: ModuleProps) => {
+    const className = Variable.derive(
+        [config.modules.workspaces.shown, config.modules.workspaces.showLabels],
+        (s, l) => `module workspaces ${s % 2 === 0 ? "even" : "odd"} ${l ? "labels-shown" : ""} ${getClassName(props)}`
+    );
+
+    return (
+        <eventbox
+            onScroll={(_, event) => {
+                const activeWs = hyprland.focusedClient?.workspace.name;
+                if (activeWs?.startsWith("special:")) hyprland.dispatch("togglespecialworkspace", activeWs.slice(8));
+                else if (event.delta_y > 0 || hyprland.focusedWorkspace?.id > 1)
+                    hyprland.dispatch("workspace", (event.delta_y < 0 ? "-" : "+") + 1);
+            }}
         >
-            {bind(config.modules.workspaces.shown).as(
-                n => Array.from({ length: n }).map((_, idx) => <Workspace idx={idx + 1} />) // Start from 1
-            )}
-        </box>
-    </eventbox>
-);
+            <box vertical={bind(config.vertical)} className={bind(className)} onDestroy={() => className.drop()}>
+                {bind(config.modules.workspaces.shown).as(
+                    n => Array.from({ length: n }).map((_, idx) => <Workspace idx={idx + 1} />) // Start from 1
+                )}
+            </box>
+        </eventbox>
+    );
+};
 
 const TrayItem = (item: AstalTray.TrayItem) => (
     <menubutton
-- 
cgit v1.2.3-freya

