BufferingIndicator.lua 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. local Element = require('elements/Element')
  2. ---@class BufferingIndicator : Element
  3. local BufferingIndicator = class(Element)
  4. function BufferingIndicator:new() return Class.new(self) --[[@as BufferingIndicator]] end
  5. function BufferingIndicator:init()
  6. Element.init(self, 'buffering_indicator', {ignores_curtain = true, render_order = 2})
  7. self.enabled = false
  8. self:decide_enabled()
  9. end
  10. function BufferingIndicator:decide_enabled()
  11. local cache = state.cache_underrun or state.cache_buffering and state.cache_buffering < 100
  12. local player = state.core_idle and not state.eof_reached
  13. if self.enabled then
  14. if not player or (state.pause and not cache) then self.enabled = false end
  15. elseif player and cache and state.uncached_ranges then
  16. self.enabled = true
  17. end
  18. end
  19. function BufferingIndicator:on_prop_pause() self:decide_enabled() end
  20. function BufferingIndicator:on_prop_core_idle() self:decide_enabled() end
  21. function BufferingIndicator:on_prop_eof_reached() self:decide_enabled() end
  22. function BufferingIndicator:on_prop_uncached_ranges() self:decide_enabled() end
  23. function BufferingIndicator:on_prop_cache_buffering() self:decide_enabled() end
  24. function BufferingIndicator:on_prop_cache_underrun() self:decide_enabled() end
  25. function BufferingIndicator:render()
  26. local ass = assdraw.ass_new()
  27. ass:rect(0, 0, display.width, display.height, {color = bg, opacity = config.opacity.buffering_indicator})
  28. local size = round(30 + math.min(display.width, display.height) / 10)
  29. local opacity = (Elements.menu and Elements.menu:is_alive()) and 0.3 or 0.8
  30. ass:spinner(display.width / 2, display.height / 2, size, {color = fg, opacity = opacity})
  31. return ass
  32. end
  33. return BufferingIndicator