aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/ui/statusbar/panel/widgets/music.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/ui/statusbar/panel/widgets/music.lua')
-rw-r--r--.config/awesome/ui/statusbar/panel/widgets/music.lua200
1 files changed, 200 insertions, 0 deletions
diff --git a/.config/awesome/ui/statusbar/panel/widgets/music.lua b/.config/awesome/ui/statusbar/panel/widgets/music.lua
new file mode 100644
index 0000000..3eedb55
--- /dev/null
+++ b/.config/awesome/ui/statusbar/panel/widgets/music.lua
@@ -0,0 +1,200 @@
+local cairo = require "lgi".cairo
+local gcolor = require "gears.color"
+local gsurface = require "gears.surface"
+local imagebox = require "ui.statusbar.panel.widgets.imagebox"
+local phosphor = require "assets.phosphor"
+local playerctl = require "services.playerctl"
+local qnative = require "quarrel.native"
+local qui = require "quarrel.ui"
+local qvars = require "quarrel.vars"
+local wibox = require "wibox"
+
+local default_cover = phosphor.vinyl_record_fill
+local default_text = "Nothing playing"
+
+local function faded_cover(cover)
+ local surface = gsurface(cover)
+ local w,h = gsurface.get_size(surface)
+ local cr = cairo.Context(surface)
+ local pattern = gcolor(qvars.colors.bg .. "aa")
+ cr:rectangle(0, 0, w, h)
+ cr:set_source(pattern)
+ cr:fill_preserve()
+ return surface
+end
+
+local w_title = wibox.widget {
+ widget = wibox.widget.textbox,
+ text = "Nothing playing",
+}
+
+local w_artist = wibox.widget {
+ widget = wibox.container.background,
+ fg = qvars.colors.dim.fg,
+ {
+ widget = wibox.widget.textbox,
+ text = ""
+ }
+}
+
+local w_cover = wibox.widget {
+ widget = imagebox,
+ image = default_cover,
+ stylesheet = qui.recolor(qvars.colors.bright.black),
+ forced_height = qvars.char_height * 6 + qvars.big_padding * 2,
+ forced_width = qvars.expanded_bar_size - qvars.big_padding,
+ horizontal_fit_policy = "cover",
+ vertical_fit_policy = "cover",
+ valign = "center",
+ halign = "center"
+}
+
+local w_progress_bar = wibox.widget {
+ widget = wibox.widget.progressbar,
+ max_value = 0,
+ value = 0,
+ forced_height = qvars.char_height / 2,
+ forced_width = qvars.expanded_bar_size - (qvars.big_padding + qvars.big_padding * 2 + qvars.padding * 2) - (qvars.char_height / 1.25 + qvars.padding) * 3,
+ color = qvars.colors.yellow,
+ background_color = qvars.colors.black,
+ shape = qvars.shape,
+}
+
+local w_play_pause = qui.toggle {
+ widget = {
+ forced_height = qvars.char_height / 1.25,
+ forced_width = qvars.char_height / 1.25
+ },
+ off = phosphor.play_fill,
+ on = phosphor.pause_fill,
+ manual = true,
+ press = function()
+ playerctl:play_pause()
+ end
+}
+
+local w_skip_forward = qui.button {
+ widget = {
+ forced_height = qvars.char_height / 1.25,
+ forced_width = qvars.char_height / 1.25
+ },
+ image = phosphor.skip_forward_fill,
+ press = function()
+ playerctl:next()
+ end
+}
+
+local w_skip_back = qui.button {
+ widget = {
+ forced_height = qvars.char_height / 1.25,
+ forced_width = qvars.char_height / 1.25
+ },
+ image = phosphor.skip_back_fill,
+ press = function()
+ playerctl:previous()
+ end
+}
+
+local music = wibox.widget(qui.styled {
+ widget = wibox.container.background,
+ {
+ {
+ widget = wibox.container.background,
+ bg = qvars.colors.black
+ },
+ w_cover,
+ {
+ widget = wibox.container.margin,
+ margins = qvars.big_padding,
+ {
+ {
+ {
+ widget = wibox.container.background,
+ bg = qvars.colors.bg,
+ shape = qvars.shape,
+ {
+ widget = wibox.container.margin,
+ margins = qvars.padding,
+ {
+ {
+ widget = wibox.container.constraint,
+ width = qvars.expanded_bar_size - (qvars.big_padding + qvars.big_padding * 2 + qvars.padding * 2),
+ height = qvars.char_height,
+ {
+ widget = wibox.container.scroll.horizontal,
+ speed = 50,
+ step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth,
+ w_title
+ }
+ },
+ {
+ widget = wibox.container.constraint,
+ width = qvars.expanded_bar_size - (qvars.big_padding + qvars.big_padding * 2 + qvars.padding * 2),
+ height = qvars.char_height,
+ {
+ widget = wibox.container.scroll.horizontal,
+ speed = 50,
+ step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth,
+ w_artist
+ }
+ },
+ layout = wibox.layout.fixed.vertical
+ }
+ }
+ },
+ nil,
+ nil,
+ layout = wibox.layout.align.horizontal
+ },
+ nil,
+ {
+ widget = wibox.container.background,
+ bg = qvars.colors.bg,
+ shape = qvars.shape,
+ {
+ widget = wibox.container.margin,
+ margins = qvars.padding,
+ {
+ w_play_pause,
+ w_skip_back,
+ {
+ widget = wibox.container.place,
+ w_progress_bar
+ },
+ w_skip_forward,
+ layout = wibox.layout.fixed.horizontal,
+ spacing = qvars.padding
+ }
+ }
+ },
+ layout = wibox.layout.align.vertical
+ }
+ },
+ layout = wibox.layout.stack
+ }
+})
+
+awesome.connect_signal("services::playerctl::metadata", function(title, artist, album_path)
+ w_title.text = title ~= "" and qnative.decode_html(title) or default_text
+ w_artist.widget.text = qnative.decode_html(artist)
+ w_cover.image = faded_cover(album_path)
+end)
+
+awesome.connect_signal("services::playerctl::position", function(position, length)
+ w_progress_bar.value = position
+ w_progress_bar.max_value = length
+end)
+
+awesome.connect_signal("services::playerctl::no_players", function()
+ w_title = default_text
+ w_artist = ""
+ w_cover.image = default_cover
+ w_progress_bar.value = 0
+ w_progress_bar.max_value = 0
+end)
+
+awesome.connect_signal("services::playerctl::playback_status", function(playing)
+ w_play_pause:silent_press(playing)
+end)
+
+return music