81 lines
2.7 KiB
Lua
81 lines
2.7 KiB
Lua
|
local Element = require('uosc_shared/elements/Element')
|
||
|
|
||
|
---@class PauseIndicator : Element
|
||
|
local PauseIndicator = class(Element)
|
||
|
|
||
|
function PauseIndicator:new() return Class.new(self) --[[@as PauseIndicator]] end
|
||
|
function PauseIndicator:init()
|
||
|
Element.init(self, 'pause_indicator')
|
||
|
self.ignores_menu = true
|
||
|
self.base_icon_opacity = options.pause_indicator == 'flash' and 1 or 0.8
|
||
|
self.paused = state.pause
|
||
|
self.type = options.pause_indicator
|
||
|
self.is_manual = options.pause_indicator == 'manual'
|
||
|
self.fadeout_requested = false
|
||
|
self.opacity = 0
|
||
|
|
||
|
mp.observe_property('pause', 'bool', function(_, paused)
|
||
|
if Elements.timeline.pressed then return end
|
||
|
if options.pause_indicator == 'flash' then
|
||
|
if self.paused == paused then return end
|
||
|
self:flash()
|
||
|
elseif options.pause_indicator == 'static' then
|
||
|
self:decide()
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
function PauseIndicator:flash()
|
||
|
if not self.is_manual and self.type ~= 'flash' then return end
|
||
|
-- can't wait for pause property event listener to set this, because when this is used inside a binding like:
|
||
|
-- cycle pause; script-binding uosc/flash-pause-indicator
|
||
|
-- the pause event is not fired fast enough, and indicator starts rendering with old icon
|
||
|
self.paused = mp.get_property_native('pause')
|
||
|
if self.is_manual then self.type = 'flash' end
|
||
|
self.opacity = 1
|
||
|
self:tween_property('opacity', 1, 0, 0.15)
|
||
|
end
|
||
|
|
||
|
-- decides whether static indicator should be visible or not
|
||
|
function PauseIndicator:decide()
|
||
|
if not self.is_manual and self.type ~= 'static' then return end
|
||
|
self.paused = mp.get_property_native('pause') -- see flash() for why this line is necessary
|
||
|
if self.is_manual then self.type = 'static' end
|
||
|
self.opacity = self.paused and 1 or 0
|
||
|
request_render()
|
||
|
|
||
|
-- Workaround for an mpv race condition bug during pause on windows builds, which causes osd updates to be ignored.
|
||
|
-- .03 was still loosing renders, .04 was fine, but to be safe I added 10ms more
|
||
|
mp.add_timeout(.05, function() osd:update() end)
|
||
|
end
|
||
|
|
||
|
function PauseIndicator:render()
|
||
|
if self.opacity == 0 then return end
|
||
|
|
||
|
local ass = assdraw.ass_new()
|
||
|
local is_static = self.type == 'static'
|
||
|
|
||
|
-- Background fadeout
|
||
|
if is_static then
|
||
|
ass:rect(0, 0, display.width, display.height, {color = bg, opacity = self.opacity * 0.3})
|
||
|
end
|
||
|
|
||
|
-- Icon
|
||
|
local size = round(math.min(display.width, display.height) * (is_static and 0.20 or 0.15))
|
||
|
size = size + size * (1 - self.opacity)
|
||
|
|
||
|
if self.paused then
|
||
|
ass:icon(display.width / 2, display.height / 2, size, 'pause',
|
||
|
{border = 1, opacity = self.base_icon_opacity * self.opacity}
|
||
|
)
|
||
|
else
|
||
|
ass:icon(display.width / 2, display.height / 2, size * 1.2, 'play_arrow',
|
||
|
{border = 1, opacity = self.base_icon_opacity * self.opacity}
|
||
|
)
|
||
|
end
|
||
|
|
||
|
return ass
|
||
|
end
|
||
|
|
||
|
return PauseIndicator
|