diff options
Diffstat (limited to '.config/mpv/scripts/uosc_shared/elements/TopBar.lua')
-rw-r--r-- | .config/mpv/scripts/uosc_shared/elements/TopBar.lua | 182 |
1 files changed, 0 insertions, 182 deletions
diff --git a/.config/mpv/scripts/uosc_shared/elements/TopBar.lua b/.config/mpv/scripts/uosc_shared/elements/TopBar.lua deleted file mode 100644 index 977d5b8..0000000 --- a/.config/mpv/scripts/uosc_shared/elements/TopBar.lua +++ /dev/null @@ -1,182 +0,0 @@ -local Element = require('uosc_shared/elements/Element') - ----@alias TopBarButtonProps {icon: string; background: string; anchor_id?: string; command: string|fun()} - ----@class TopBarButton : Element -local TopBarButton = class(Element) - ----@param id string ----@param props TopBarButtonProps -function TopBarButton:new(id, props) return Class.new(self, id, props) --[[@as TopBarButton]] end -function TopBarButton:init(id, props) - Element.init(self, id, props) - self.anchor_id = 'top_bar' - self.icon = props.icon - self.background = props.background - self.command = props.command -end - -function TopBarButton:on_mbtn_left_down() - mp.command(type(self.command) == 'function' and self.command() or self.command) -end - -function TopBarButton:render() - local visibility = self:get_visibility() - if visibility <= 0 then return end - local ass = assdraw.ass_new() - - -- Background on hover - if self.proximity_raw == 0 then - ass:rect(self.ax, self.ay, self.bx, self.by, {color = self.background, opacity = visibility}) - end - - local width, height = self.bx - self.ax, self.by - self.ay - local icon_size = math.min(width, height) * 0.5 - ass:icon(self.ax + width / 2, self.ay + height / 2, icon_size, self.icon, { - opacity = visibility, border = options.text_border, - }) - - return ass -end - ---[[ TopBar ]] - ----@class TopBar : Element -local TopBar = class(Element) - -function TopBar:new() return Class.new(self) --[[@as TopBar]] end -function TopBar:init() - Element.init(self, 'top_bar') - self.pressed = false - self.size, self.size_max, self.size_min = 0, 0, 0 - self.icon_size, self.spacing, self.font_size, self.title_bx = 1, 1, 1, 1 - self.size_min_override = options.timeline_start_hidden and 0 or nil - self.top_border = options.timeline_border - - local function decide_maximized_command() - return state.border - and (state.fullscreen and 'set fullscreen no;cycle window-maximized' or 'cycle window-maximized') - or 'set window-maximized no;cycle fullscreen' - end - - -- Order aligns from right to left - self.buttons = { - TopBarButton:new('tb_close', {icon = 'close', background = '2311e8', command = 'quit'}), - TopBarButton:new('tb_max', {icon = 'crop_square', background = '222222', command = decide_maximized_command}), - TopBarButton:new('tb_min', {icon = 'minimize', background = '222222', command = 'cycle window-minimized'}), - } -end - -function TopBar:decide_enabled() - if options.top_bar == 'no-border' then - self.enabled = not state.border or state.fullscreen - else - self.enabled = options.top_bar == 'always' - end - self.enabled = self.enabled and (options.top_bar_controls or options.top_bar_title) - for _, element in ipairs(self.buttons) do - element.enabled = self.enabled and options.top_bar_controls - end -end - -function TopBar:update_dimensions() - self.size = state.fullormaxed and options.top_bar_size_fullscreen or options.top_bar_size - self.icon_size = round(self.size * 0.5) - self.spacing = math.ceil(self.size * 0.25) - self.font_size = math.floor((self.size - (self.spacing * 2)) * options.font_scale) - self.button_width = round(self.size * 1.15) - self.ay = Elements.window_border.size - self.bx = display.width - Elements.window_border.size - self.by = self.size + Elements.window_border.size - self.title_bx = self.bx - (options.top_bar_controls and (self.button_width * 3) or 0) - self.ax = options.top_bar_title and Elements.window_border.size or self.title_bx - - local button_bx = self.bx - for _, element in pairs(self.buttons) do - element.ax, element.bx = button_bx - self.button_width, button_bx - element.ay, element.by = self.ay, self.by - button_bx = button_bx - self.button_width - end -end - -function TopBar:on_prop_border() - self:decide_enabled() - self:update_dimensions() -end - -function TopBar:on_prop_fullscreen() - self:decide_enabled() - self:update_dimensions() -end - -function TopBar:on_prop_maximized() - self:decide_enabled() - self:update_dimensions() -end - -function TopBar:on_display() self:update_dimensions() end - -function TopBar:render() - local visibility = self:get_visibility() - if visibility <= 0 then return end - local ass = assdraw.ass_new() - - -- Window title - if options.top_bar_title and (state.title or state.has_playlist) then - local bg_margin = math.floor((self.size - self.font_size) / 4) - local padding = self.font_size / 2 - local title_ax = self.ax + bg_margin - local title_ay = self.ay + bg_margin - local max_bx = self.title_bx - self.spacing - - -- Playlist position - if state.has_playlist then - local text = state.playlist_pos .. '' .. state.playlist_count - local formatted_text = '{\\b1}' .. state.playlist_pos .. '{\\b0\\fs' .. self.font_size * 0.9 .. '}/' - .. state.playlist_count - local opts = {size = self.font_size, wrap = 2, color = fgt, opacity = visibility} - local bx = round(title_ax + text_width(text, opts) + padding * 2) - ass:rect(title_ax, title_ay, bx, self.by - bg_margin, {color = fg, opacity = visibility, radius = 2}) - ass:txt(title_ax + (bx - title_ax) / 2, self.ay + (self.size / 2), 5, formatted_text, opts) - title_ax = bx + bg_margin - end - - -- Title - local text = state.title - if max_bx - title_ax > self.font_size * 3 and text and text ~= '' then - local opts = { - size = self.font_size, wrap = 2, color = bgt, border = 1, border_color = bg, opacity = visibility, - clip = string.format('\\clip(%d, %d, %d, %d)', self.ax, self.ay, max_bx, self.by), - } - local bx = math.min(max_bx, title_ax + text_width(text, opts) + padding * 2) - local by = self.by - bg_margin - ass:rect(title_ax, title_ay, bx, by, { - color = bg, opacity = visibility * options.top_bar_title_opacity, radius = 2, - }) - ass:txt(title_ax + padding, self.ay + (self.size / 2), 4, text, opts) - title_ay = by + 1 - end - - -- Subtitle: current chapter - if state.current_chapter and max_bx - title_ax > self.font_size * 3 then - local font_size = self.font_size * 0.8 - local height = font_size * 1.5 - local text = '└ ' .. state.current_chapter.index .. ': ' .. state.current_chapter.title - local by = title_ay + height - local opts = { - size = font_size, italic = true, wrap = 2, color = bgt, - border = 1, border_color = bg, opacity = visibility * 0.8, - } - local bx = math.min(max_bx, title_ax + text_width(text, opts) + padding * 2) - opts.clip = string.format('\\clip(%d, %d, %d, %d)', title_ax, title_ay, bx, by) - ass:rect(title_ax, title_ay, bx, by, { - color = bg, opacity = visibility * options.top_bar_title_opacity, radius = 2, - }) - ass:txt(title_ax + padding, title_ay + height / 2, 4, text, opts) - end - end - - return ass -end - -return TopBar |