dotfiles/.config/mvi/scripts/status-line.lua

143 lines
3.5 KiB
Lua
Raw Permalink Normal View History

2025-12-31 15:03:07 +01:00
local opts = {
enabled = true,
size = 36,
margin = 10,
text_top_left = "",
text_top_right = "",
text_bottom_left = "${filename} [${playlist-pos-1}/${playlist-count}]",
text_bottom_right = "[${dwidth:X}x${dheight:X}]",
}
local msg = require 'mp.msg'
local assdraw = require 'mp.assdraw'
local options = require 'mp.options'
options.read_options(opts, nil, function(c)
if c["enabled"] then
if opts.enabled then
enable()
else
disable()
end
end
if c["size"] or c["margin"] then
mark_stale()
end
if c["text_top_left"] or
c["text_top_right"] or
c["text_bottom_left"] or
c["text_bottom_right"]
then
observe_properties()
mark_stale()
end
end)
local stale = true
local active = false
function draw_ass(ass)
local ww, wh = mp.get_osd_size()
mp.set_osd_ass(ww, wh, ass)
end
function refresh()
if not stale then return end
stale = false
local a = assdraw:ass_new()
local draw_text = function(text, an, x, y)
if text == "" then return end
local expanded = mp.command_native({ "expand-text", text})
if not expanded then
msg.error("Error expanding status-line")
return
end
msg.verbose("Status-line changed to: " .. expanded)
a:new_event()
a:an(an)
a:pos(x,y)
a:append("{\\fs".. opts.size.. "}{\\bord1.0}")
a:append(expanded)
end
local w,h = mp.get_osd_size()
local m = opts.margin
draw_text(opts.text_top_left, 7, m, m)
draw_text(opts.text_top_right, 9, w-m, m)
draw_text(opts.text_bottom_left, 1, m, h-m)
draw_text(opts.text_bottom_right, 3, w-m, h-m)
draw_ass(a.text)
end
function mark_stale()
stale = true
end
function observe_properties()
mp.unobserve_property(mark_stale)
if not active then return end
for _, str in ipairs({
opts.text_top_left,
opts.text_top_right,
opts.text_bottom_left,
opts.text_bottom_right,
}) do
local start = 0
while true do
local s, e, cap = string.find(str, "%${[?!]?([%l%d-/]*)", start)
if not s then break end
msg.verbose("Observing property " .. cap)
mp.observe_property(cap, nil, mark_stale)
start = e
end
end
mp.observe_property("osd-width", nil, mark_stale)
mp.observe_property("osd-height", nil, mark_stale)
end
function enable()
if active then return end
active = true
observe_properties()
mp.register_idle(refresh)
mark_stale()
end
function disable()
if not active then return end
active = false
observe_properties()
mp.unregister_idle(refresh)
draw_ass("")
end
function toggle()
if active then
disable()
else
enable()
end
end
if opts.enabled then
enable()
end
mp.add_key_binding(nil, "status-line-enable", enable)
mp.add_key_binding(nil, "status-line-disable", disable)
mp.add_key_binding(nil, "status-line-toggle", toggle)
-- TODO remove
mp.add_key_binding(nil, "enable-status-line", function()
msg.warn("This binding is deprecated, use 'status-line-enable' instead")
enable()
end)
mp.add_key_binding(nil, "disable-status-line", function()
msg.warn("This binding is deprecated, use 'status-line-disable' instead")
disable()
end)
mp.add_key_binding(nil, "toggle-status-line", function()
msg.warn("This binding is deprecated, use 'status-line-toggle' instead")
toggle()
end)