Files
nixconfig/modules/home/wayland/apps/eww/bar/windows/radio.yuck
2026-06-14 11:30:36 +02:00

83 lines
4.3 KiB
Plaintext

(deflisten radio
:initial '{"is_paused":1,"song":{"artist":"","song":"","image600":""},"radio":0,"stations":[],"media":{"player":"","status":"Stopped","artist":"","title":"","art":""}}'
"scripts/radio")
(defvar radio-vol 80)
(defvar radio-muted false)
(defwidget radio-win []
(box :class "sys-win" :orientation "v" :space-evenly false
; --- Now Playing ---
(box :orientation "v" :space-evenly false :class "sys-section"
(section-header :title "Media" :accent "radio-accent")
(box :orientation "h" :space-evenly false :valign "center" :spacing 10 :class "radio-now-playing"
(box :class "radio-art"
:style "background-image: url('${radio.is_paused == 0 ? radio.song.image600 : (radio.media.status != 'Stopped' ? radio.media.art : radio.song.image600)}'); background-size: cover; background-position: center;"
(label :class "radio-art-icon" :halign "center" :valign "center"
:visible {radio.is_paused == 0
? radio.song.image600 == ""
: (radio.media.status != "Stopped"
? radio.media.art == ""
: radio.song.image600 == "")}
:text "󰝚"))
(box :orientation "v" :space-evenly false :hexpand true :valign "center"
(label :class "radio-song" :halign "start" :wrap true :limit-width 20
:text {radio.is_paused == 0
? (radio.song.song != "" ? radio.song.song : "Tuning in...")
: (radio.media.status != "Stopped"
? (radio.media.title != "" ? radio.media.title : "Playing")
: (radio.song.song != "" ? radio.song.song : "Nothing playing"))})
(label :class "radio-artist" :halign "start" :wrap true :limit-width 22
:text {radio.is_paused == 0
? radio.song.artist
: (radio.media.status != "Stopped"
? (radio.media.artist != "" ? radio.media.artist : radio.media.player)
: "")})))
; Controls - hidden only in placeholder state
(box :visible {radio.is_paused == 0 || radio.radio > 0 || radio.media.status != "Stopped"}
:orientation "v" :space-evenly false :class "radio-controls"
(box :orientation "h" :space-evenly true :halign "center"
(button :visible {radio.is_paused == 1 && radio.media.status != "Stopped"}
:class "radio-ctrl-btn" :timeout "2s" :onclick "scripts/media previous"
(label :text "󰒮"))
(button :class "radio-ctrl-btn" :timeout "2s"
:onclick {radio.is_paused == 1 && radio.media.status != "Stopped" ? "scripts/media play-pause" : "scripts/radio toggle"}
(label :text {radio.is_paused == 0 ? "󰏥" : (radio.media.status == "Playing" ? "󰏥" : "󰐌")}))
(button :visible {radio.is_paused == 1 && radio.media.status != "Stopped"}
:class "radio-ctrl-btn" :timeout "2s" :onclick "scripts/media next"
(label :text "󰒭")))
(vol-row
:icon "󰕾"
:value {radio-vol}
:onchange "scripts/radio vol {}"
:onclick "scripts/radio mute"
:muted {radio-muted})))
(box :class "section-sep")
; --- Stations ---
(box :orientation "v" :space-evenly false :class "sys-section"
(section-header :title "Radio Stations" :accent "radio-accent")
(scroll :vscroll true :hscroll false :height 130
(box :class "station-list" :space-evenly false :orientation "v"
(for station in {radio.stations}
(button
:class "station-row ${radio.radio == station.id ? 'station-row-active' : ''}"
:timeout "2s"
:onclick "scripts/radio start ${station.id}"
:tooltip {station.title}
(box :orientation "h" :space-evenly false :valign "center"
(box :class "station-icon"
:style "background-image: url('${station.icon_fill_white}'); background-size: contain; background-position: center;")
(label :class "station-name" :text {station.title}
:hexpand true :halign "start" :limit-width 16)))))))))
(defwidget radio-mod []
(module
(eventbox
:onclick "(sleep 0.1 && scripts/panel-toggle radio)"
(box :orientation "v"
(label :show-truncated false :class "icon-text" :text "󰝚")))))