dotfiles/dot_config/awesome/ui/info-panel/music-player.lua
2024-04-14 18:41:15 -07:00

256 lines
6.1 KiB
Lua

local awful = require("awful")
local gears = require("gears")
local beautiful = require("beautiful")
local wibox = require("wibox")
local helpers = require("helpers")
local playerctl_daemon = require("signals.playerctl")
local config = require("config")
local theme = beautiful.get()
local dpi = beautiful.xresources.apply_dpi
---- Music Player
---- ~~~~~~~~~~~~
local music_text = wibox.widget({
font = helpers.ui.set_font("Medium 10"),
valign = "center",
widget = wibox.widget.textbox,
})
local music_art = wibox.widget({
image = theme.music,
resize = true,
widget = wibox.widget.imagebox,
})
local music_art_container = wibox.widget({
music_art,
forced_height = dpi(200),
forced_width = dpi(200),
widget = wibox.container.background,
})
local filter_color = {
type = "linear",
from = { 0, 0 },
to = { 0, 160 },
stops = { { 0, theme.color.surface0 .. "cc" }, { 1, theme.color.surface0 } },
}
local music_art_filter = wibox.widget({
{
bg = filter_color,
forced_height = dpi(120),
forced_width = dpi(120),
widget = wibox.container.background,
},
direction = "east",
widget = wibox.container.rotate,
})
local music_title = wibox.widget({
font = helpers.ui.set_font("Regular 13"),
valign = "center",
widget = wibox.widget.textbox,
})
local music_artist = wibox.widget({
font = helpers.ui.set_font("Bold 16"),
valign = "center",
widget = wibox.widget.textbox,
})
--- Volume Control
local function volume_control()
local volume_bar = wibox.widget({
max_value = 100,
value = 100,
bar_height = dpi(12),
bar_width = dpi(4),
shape = helpers.ui.rrect(6),
bar_shape = helpers.ui.rrect(6),
color = theme.color.blue,
background_color = theme.color.surface0,
border_width = 0,
widget = wibox.widget.progressbar,
})
-- Update bar
local function set_slider_value(_, volume)
volume_bar.value = volume * 100
end
playerctl_daemon:connect_signal("volume", set_slider_value)
volume_bar:connect_signal("button::press", function()
playerctl_daemon:disconnect_signal("volume", set_slider_value)
end)
volume_bar:connect_signal("button::release", function()
playerctl_daemon:connect_signal("volume", set_slider_value)
end)
local volume = wibox.widget({
volume_bar,
direction = "east",
widget = wibox.container.rotate,
})
volume:buttons(gears.table.join(
-- Scroll - Increase or decrease volume
awful.button({}, 4, function()
awful.spawn.with_shell("playerctl volume 0.05+")
end),
awful.button({}, 5, function()
awful.spawn.with_shell("playerctl volume 0.05-")
end)
))
return volume
end
-- Player's Button
local toggle = wibox.widget.textbox()
toggle.font = helpers.ui.set_font("26")
toggle:buttons(gears.table.join(awful.button({}, 1, function()
playerctl_daemon:play_pause()
end)))
local next = wibox.widget.textbox()
next.font = helpers.ui.set_font("26")
next.markup = config.icons.music.next
next:buttons(gears.table.join(awful.button({}, 1, function()
playerctl_daemon:next()
end)))
local back = wibox.widget.textbox()
back.font = helpers.ui.set_font("26")
back.markup = config.icons.music.prev
back:buttons(gears.table.join(awful.button({}, 1, function()
playerctl_daemon:previous()
end)))
local function music()
return wibox.widget({
{
{
music_art_container,
music_art_filter,
layout = wibox.layout.stack,
},
{
{
{
music_text,
helpers.ui.vertical_pad(dpi(15)),
{
{
widget = wibox.container.scroll.horizontal,
step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth,
fps = 60,
speed = 75,
music_artist,
},
{
widget = wibox.container.scroll.horizontal,
step_function = wibox.container.scroll.step_functions.waiting_nonlinear_back_and_forth,
fps = 60,
speed = 75,
music_title,
},
forced_width = dpi(170),
layout = wibox.layout.fixed.vertical,
},
layout = wibox.layout.fixed.vertical,
},
nil,
{
{
back,
toggle,
next,
spacing = dpi(25),
layout = wibox.layout.fixed.horizontal,
},
forced_height = dpi(70),
top = dpi(10),
bottom = dpi(10),
right = dpi(10),
left = dpi(115),
widget = wibox.container.margin,
},
expand = "none",
layout = wibox.layout.align.vertical,
},
top = dpi(9),
bottom = dpi(9),
left = dpi(10),
right = dpi(10),
widget = wibox.container.margin,
},
layout = wibox.layout.stack,
},
forced_width = dpi(350),
shape = helpers.ui.prrect(8, false, true, true, false),
bg = theme.color.surface0,
widget = wibox.container.background,
})
end
local music_widget = wibox.widget({
{
{
music(),
{
volume_control(),
margins = { top = dpi(0), bottom = dpi(0), left = dpi(10), right = dpi(10) },
widget = wibox.container.margin,
},
layout = wibox.layout.align.horizontal,
},
forced_height = dpi(150),
bg = theme.color.base,
shape = helpers.ui.rrect(8),
widget = wibox.container.background,
},
left = dpi(20),
right = dpi(10),
color = "#FF000000",
widget = wibox.container.margin,
})
--- playerctl
--- -------------
playerctl_daemon:connect_signal("metadata", function(_, title, artist, album_path, _, _, _)
if title == "" then
title = "Nothing Playing"
end
if artist == "" then
artist = "Nothing Playing"
end
if album_path == "" then
album_path = theme.music
end
music_art:set_image(gears.surface.load_uncached(album_path))
music_title:set_markup_silently(helpers.ui.colorize_text(title, theme.color.subtext1))
music_artist:set_markup_silently(helpers.ui.colorize_text(artist, theme.color.blue))
end)
playerctl_daemon:connect_signal("playback_status", function(_, playing, _)
if playing then
music_text:set_markup_silently(helpers.ui.colorize_text("Now Playing", theme.color.overlay0))
toggle.markup = helpers.ui.colorize_text(config.icons.music.pause, theme.color.blue)
else
music_text:set_markup_silently(helpers.ui.colorize_text("Music", theme.color.overlay0))
toggle.markup = helpers.ui.colorize_text(config.icons.music.play, theme.color.blue)
end
end)
return music_widget