diff options
author | Aylur <[email protected]> | 2024-09-11 20:52:44 +0000 |
---|---|---|
committer | Aylur <[email protected]> | 2024-09-11 20:52:44 +0000 |
commit | 0e259e49357d5389db897414fc52b50b1ce1d14c (patch) | |
tree | a4bb497e24eae2bd807f638953433f455f17f7a5 /examples/lua/simple-bar/widget/Bar.lua | |
parent | 374d76f4152ea46987203f49642d7d46aff221ab (diff) |
example: add lua simple-bar
Diffstat (limited to 'examples/lua/simple-bar/widget/Bar.lua')
-rw-r--r-- | examples/lua/simple-bar/widget/Bar.lua | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/examples/lua/simple-bar/widget/Bar.lua b/examples/lua/simple-bar/widget/Bar.lua new file mode 100644 index 0000000..bf70cd5 --- /dev/null +++ b/examples/lua/simple-bar/widget/Bar.lua @@ -0,0 +1,192 @@ +local astal = require("astal") +local App = astal.App +local Widget = astal.Widget +local Variable = astal.Variable +local Gdk = astal.Gdk +local GLib = astal.GLib +local bind = astal.bind +local Mpris = astal.require("AstalMpris") +local Battery = astal.require("AstalBattery") +local Wp = astal.require("AstalWp") +local Network = astal.require("AstalNetwork") +local Tray = astal.require("AstalTray") +local Hyprland = astal.require("AstalHyprland") +local map = require("lib").map + +local function SysTray() + local tray = Tray.get_default() + + return Widget.Box({ + bind(tray, "items"):as(function(items) + return map(items, function(item) + if item.icon_theme_path ~= nil then + App:add_icons(item.icon_theme_path) + end + + local menu = item:create_menu() + + return Widget.Button({ + tooltip_markup = bind(item, "tooltip_markup"), + on_destroy = function() + if menu ~= nil then + menu:destroy() + end + end, + on_click_release = function(self) + if menu ~= nil then + menu:popup_at_widget(self, Gdk.Gravity.SOUTH, Gdk.Gravity.NORTH, nil) + end + end, + Widget.Icon({ + g_icon = bind(item, "gicon"), + }), + }) + end) + end), + }) +end + +local function FocusedClient() + local hypr = Hyprland.get_default() + local focused = bind(hypr, "focused-client") + + return Widget.Box({ + class_name = "Focused", + visible = focused, + focused:as(function(client) + return client and Widget.Label({ + label = bind(client, "title"):as(tostring), + }) + end), + }) +end + +local function Wifi() + local wifi = Network.get_default().wifi + + return Widget.Icon({ + tooltip_text = bind(wifi, "ssid"):as(tostring), + class_name = "Wifi", + icon = bind(wifi, "icon-name"), + }) +end + +local function AudioSlider() + local speaker = Wp.get_default_wp().audio.default_speaker + + return Widget.Box({ + class_name = "AudioSlider", + css = "min-width: 140px;", + Widget.Icon({ + icon = bind(speaker, "volume-icon"), + }), + Widget.Slider({ + hexpand = true, + on_dragged = function(self) + speaker.volume = self.value + end, + value = bind(speaker, "volume"), + }), + }) +end + +local function BatteryLevel() + local bat = Battery.get_default() + + return Widget.Box({ + class_name = "Battery", + visible = bind(bat, "is-present"), + Widget.Icon({ + icon = bind(bat, "icon-name"), + }), + Widget.Label({ + label = bind(bat, "percentage"):as(function(p) + return tostring(math.floor(p * 100)) .. " %" + end), + }), + }) +end + +local function Media() + local player = Mpris.Player.new("spotify") + + return Widget.Box({ + class_name = "Media", + visible = bind(player, "available"), + Widget.Box({ + class_name = "Cover", + valign = "CENTER", + css = bind(player, "cover-art"):as(function(cover) + return "background-image: url('" .. (cover or "") .. "');" + end), + }), + Widget.Label({ + label = bind(player, "metadata"):as(function() + return (player.title or "") .. " - " .. (player.artist or "") + end), + }), + }) +end + +local function Workspaces() + local hypr = Hyprland.get_default() + + return Widget.Box({ + class_name = "Workspaces", + bind(hypr, "workspaces"):as(function(wss) + return map(wss, function(ws) + return Widget.Button({ + class_name = bind(hypr, "focused-workspace"):as(function(fw) + return fw == ws and "focused" or "" + end), + on_clicked = function() + ws:focus() + end, + label = bind(ws, "id"):as(tostring), + }) + end) + end), + }) +end + +local function Time(format) + local time = Variable(""):poll(1000, function() + return GLib.DateTime.new_now_local():format(format) + end) + + return Widget.Label({ + class_name = "Time", + on_destroy = function() + time:drop() + end, + label = time(), + }) +end + +return function(gdkmonitor) + return Widget.Window({ + class_name = "Bar", + gdkmonitor = gdkmonitor, + anchor = astal.Astal.WindowAnchor.TOP + astal.Astal.WindowAnchor.LEFT + astal.Astal.WindowAnchor.RIGHT, + exclusivity = "EXCLUSIVE", + + Widget.CenterBox({ + Widget.Box({ + halign = "START", + Workspaces(), + FocusedClient(), + }), + Widget.Box({ + Media(), + }), + Widget.Box({ + halign = "END", + Wifi(), + AudioSlider(), + BatteryLevel(), + SysTray(), + Time("%H:%M - %A %e."), + }), + }), + }) +end |