add media control widget
This commit is contained in:
parent
460c2589cc
commit
a304510df7
@ -2,7 +2,8 @@ local workspaces <const> = require(... .. '.workspaces')
|
|||||||
local clock <const> = require(... .. '.clock')
|
local clock <const> = require(... .. '.clock')
|
||||||
local battery <const> = require(... .. '.battery')
|
local battery <const> = require(... .. '.battery')
|
||||||
local volume <const> = require(... .. '.volume')
|
local volume <const> = require(... .. '.volume')
|
||||||
local brightness <const> = require(... .. '.brightness')
|
local mpris <const> = require(... .. '.mpris')
|
||||||
|
-- local brightness <const> = require(... .. '.brightness')
|
||||||
|
|
||||||
return Astal.Window({
|
return Astal.Window({
|
||||||
namespace = "bar",
|
namespace = "bar",
|
||||||
@ -14,6 +15,7 @@ return Astal.Window({
|
|||||||
class_name = 'left',
|
class_name = 'left',
|
||||||
children = {
|
children = {
|
||||||
workspaces,
|
workspaces,
|
||||||
|
mpris,
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
center_widget = Widget.Box({}),
|
center_widget = Widget.Box({}),
|
||||||
|
108
lua/widgets/bar/mpris.lua
Normal file
108
lua/widgets/bar/mpris.lua
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
local Mpris <const> = lgi.require("AstalMpris")
|
||||||
|
local mpris = Mpris.get_default()
|
||||||
|
local map = require('lua.lib').map
|
||||||
|
|
||||||
|
return Widget.Stack({
|
||||||
|
transition_type = 'SLIDE_UP_DOWN',
|
||||||
|
transition_duration = 125,
|
||||||
|
children = {},
|
||||||
|
setup = function(self)
|
||||||
|
self:add_events(Gdk.EventMask.SCROLL_MASK);
|
||||||
|
self:add_events(Gdk.EventMask.SMOOTH_SCROLL_MASK);
|
||||||
|
|
||||||
|
local function add_player(player)
|
||||||
|
self:add_named(
|
||||||
|
Widget.Box({
|
||||||
|
class_name = 'player',
|
||||||
|
vertical = true,
|
||||||
|
hexpand = false,
|
||||||
|
setup = function(self) self['name'] = player:get_bus_name() end,
|
||||||
|
css = bind(player, 'cover-art'):as(
|
||||||
|
function(coverart)
|
||||||
|
if coverart then
|
||||||
|
return
|
||||||
|
'background: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(22, 22, 22, 0.9)), url("' .. coverart .. '");'
|
||||||
|
.. 'background-position: 50% 50%; background-size: cover'
|
||||||
|
else
|
||||||
|
return ''
|
||||||
|
end
|
||||||
|
end),
|
||||||
|
children = {
|
||||||
|
Widget.Box({
|
||||||
|
vertical = true,
|
||||||
|
hexpand = true,
|
||||||
|
valign = 'CENTER',
|
||||||
|
halign = 'END',
|
||||||
|
children = {
|
||||||
|
Widget.Button({
|
||||||
|
on_click = function() player:previous() end,
|
||||||
|
child = Widget.Icon({ icon = 'media-skip-backward-symbolic' })
|
||||||
|
}),
|
||||||
|
Widget.Button({
|
||||||
|
on_click = function() player:play_pause() end,
|
||||||
|
child = Widget.Icon({
|
||||||
|
icon = bind(player, 'playback-status'):as(function(status)
|
||||||
|
return (player:get_playback_status() == 'PLAYING' and 'media-playback-pause-symbolic' or 'media-playback-start-symbolic')
|
||||||
|
end)
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
Widget.Button({
|
||||||
|
on_click = function() player:next() end,
|
||||||
|
child = Widget.Icon({ icon = 'media-skip-forward-symbolic' })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
Widget.Slider({
|
||||||
|
hexpand = true,
|
||||||
|
class_name = 'music-progress',
|
||||||
|
valign = 'END',
|
||||||
|
halign = 'START',
|
||||||
|
-- for some reason, this is broken
|
||||||
|
on_change_value = function(self) player:set_position(self:get_value() * player:get_length()) end,
|
||||||
|
setup = function(self)
|
||||||
|
Variable():poll(500, function()
|
||||||
|
if player == nil then return end
|
||||||
|
self:set_value(player:get_position() / player:get_length())
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
player:get_bus_name()
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
map(mpris:get_players(), add_player)
|
||||||
|
|
||||||
|
self:hook(mpris, 'player-added', function(self, player)
|
||||||
|
add_player(player)
|
||||||
|
end)
|
||||||
|
|
||||||
|
self:hook(mpris, 'player-closed', function(self, player)
|
||||||
|
print('remove player', player:get_bus_name())
|
||||||
|
self:get_named(player:get_bus_name()):destroy()
|
||||||
|
end)
|
||||||
|
|
||||||
|
local accumulated_delta_y = 0
|
||||||
|
|
||||||
|
self:hook(self, 'scroll-event', function(_, event)
|
||||||
|
local children = self:get_children()
|
||||||
|
local current_child = self:get_visible_child()
|
||||||
|
local _, delta_y = event:get_scroll_deltas()
|
||||||
|
local index
|
||||||
|
|
||||||
|
accumulated_delta_y = accumulated_delta_y + delta_y
|
||||||
|
|
||||||
|
for i, child in ipairs(children) do
|
||||||
|
if child == current_child then
|
||||||
|
index = i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if math.abs(accumulated_delta_y) > 10 then
|
||||||
|
self:set_visible_child(children[(index + math.floor(accumulated_delta_y / 10)) % #children + 1])
|
||||||
|
accumulated_delta_y = 0
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
})
|
@ -26,6 +26,37 @@ centerbox {
|
|||||||
background-color: $hl;
|
background-color: $hl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
stack > box.player {
|
||||||
|
min-width: 250px;
|
||||||
|
min-height: 60px;
|
||||||
|
background-position: 50% 50%;
|
||||||
|
background-size: cover;
|
||||||
|
border: 4px solid #161616;
|
||||||
|
|
||||||
|
> box {
|
||||||
|
> button {
|
||||||
|
margin: 3px 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
> .music-progress {
|
||||||
|
min-width: 242px;
|
||||||
|
min-height: 2px;
|
||||||
|
background: transparent;
|
||||||
|
|
||||||
|
trough {
|
||||||
|
min-height: 2px;
|
||||||
|
background: $bg-alt-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
highlight {
|
||||||
|
min-height: 2px;
|
||||||
|
background: $mpd-progress-primary;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user