diff options
Diffstat (limited to '.config/awesome/ui/statusbar/panel/widgets/music.lua')
-rw-r--r-- | .config/awesome/ui/statusbar/panel/widgets/music.lua | 200 |
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 |