| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- local Element = require('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', {render_order = 3})
- self.ignores_curtain = true
- self.paused = state.pause
- self.opacity = 0
- self.fadeout = false
- self:init_options()
- end
- function PauseIndicator:init_options()
- self.base_icon_opacity = options.pause_indicator == 'flash' and 1 or 0.8
- self.type = options.pause_indicator
- self:on_prop_pause()
- end
- function PauseIndicator:flash()
- -- 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')
- self.fadeout, self.opacity = false, 1
- self:tween_property('opacity', 1, 0, 300)
- end
- -- Decides whether static indicator should be visible or not.
- function PauseIndicator:decide()
- self.paused = mp.get_property_native('pause') -- see flash() for why this line is necessary
- self.fadeout, self.opacity = self.paused, 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:on_prop_pause()
- if Elements:v('timeline', 'pressed') then return end
- if options.pause_indicator == 'flash' then
- if self.paused ~= state.pause then self:flash() end
- elseif options.pause_indicator == 'static' then
- self:decide()
- end
- end
- function PauseIndicator:on_options()
- self:init_options()
- if self.type == 'flash' then self.opacity = 0 end
- end
- function PauseIndicator:render()
- if self.opacity == 0 then return end
- local ass = assdraw.ass_new()
- -- Background fadeout
- if self.fadeout 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) * (self.fadeout 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
|