style: let language server handle code formatting

This is not complete, as I currently can't get the formatter to recognize `.editorconfig` file. Or at least it seems to ignore most of the options in it, so a lot of formatting doesn't adhere to the config.

Will need another pass when that gets fixed.
This commit is contained in:
tomasklaen
2022-08-24 12:23:59 +02:00
parent 7f2803046a
commit bff2060058
3 changed files with 337 additions and 197 deletions

78
.editorconfig Normal file
View File

@@ -0,0 +1,78 @@
[*.lua]
# see https://github.com/CppCXY/EmmyLuaCodeStyle
# [basic]
indent_style = space
tab_width = 4
# none/single/double
quote_style = single
continuation_indent_size = 4
max_line_length = 120
# crlf/lf/cr/auto
end_of_line = lf
detect_end_of_line = false
insert_final_newline = true
# [function]
# true/false/only_after_more_indention_statement/only_not_exist_cross_row_expression
align_call_args = false
align_function_define_params = true
remove_expression_list_finish_comma = true
# keep/remove/remove_table_only/remove_string_only/unambiguous_remove_string_only
call_arg_parentheses = keep
# [table]
# none/comma/semicolon
table_separator_style = comma
# keep/never/always/smart
trailing_table_separator = smart
# align equal signs in tables
continuous_assign_table_field_align_to_equal_sign = false
# if true "local t = { 1, 2, 3 }"
keep_one_space_between_table_and_bracket = false
# [statement]
align_chained_expression_statement = false
max_continuous_line_distance = 1
# align equal signs in value assignments
continuous_assign_statement_align_to_equal_sign = false
if_condition_align_with_each_other = false
local_assign_continuation_align_to_first_expression = false
statement_inline_comment_space = 1
# [indentation]
# labels (e.g.::continue::) will not be intended
label_no_indent = false
# no indentation for do statement
do_statement_no_indent = false
# no indentation for conditions of an if statement when on new line
if_condition_no_continuation_indent = false
if_branch_comments_after_block_no_indent = false
# [space]
# if true, t[#t+1] will not space wrapper '+'
table_append_expression_no_space = false
long_chain_expression_allow_one_space_after_colon = false
remove_empty_header_and_footer_lines_in_function = true
space_before_function_open_parenthesis = false
space_before_open_square_bracket = false
# format like this "local t <const> = 1"
keep_one_space_between_namedef_and_attribute = false
# [row_layout]
# Each can be: minLine:${n}, keepLine, keepLine:${n}, maxLine:${n}
keep_line_after_if_statement = keepLine
keep_line_after_do_statement = keepLine
keep_line_after_while_statement = keepLine
keep_line_after_repeat_statement = keepLine
keep_line_after_for_statement = keepLine
keep_line_after_local_or_assign_statement = keepLine
keep_line_after_function_define_statement = keepLine
keep_line_after_expression_statement = keepLine

View File

@@ -1,8 +1,4 @@
{ {
"Lua.diagnostics.disable": [ "Lua.diagnostics.disable": ["lowercase-global"],
"lowercase-global" "Lua.diagnostics.globals": ["mp"]
],
"Lua.diagnostics.globals": [
"mp"
]
} }

196
uosc.lua
View File

@@ -294,10 +294,12 @@ function tween(from, to, setter, speed, callback)
callback = speed callback = speed
speed = 0.3 speed = 0.3
end end
local timeout local timeout
local getTo = type(to) == 'function' and to or function() return to end local getTo = type(to) == 'function' and to or function() return to end
local cutoff = math.abs(getTo() - from) * 0.01 local cutoff = math.abs(getTo() - from) * 0.01
function tick()
local function tick()
from = from + ((getTo() - from) * speed) from = from + ((getTo() - from) * speed)
local is_end = math.abs(getTo() - from) <= cutoff local is_end = math.abs(getTo() - from) <= cutoff
setter(is_end and getTo() or from) setter(is_end and getTo() or from)
@@ -308,8 +310,10 @@ function tween(from, to, setter, speed, callback)
timeout:resume() timeout:resume()
end end
end end
timeout = mp.add_timeout(0.016, tick) timeout = mp.add_timeout(0.016, tick)
tick() tick()
return function() return function()
timeout:kill() timeout:kill()
call_me_maybe(callback) call_me_maybe(callback)
@@ -359,7 +363,7 @@ function get_point_to_rectangle_proximity(point, rect)
end end
function text_width_estimate(text, font_size) function text_width_estimate(text, font_size)
if not text or text == "" then return 0 end if not text or text == '' then return 0 end
local text_width = 0 local text_width = 0
for _, _, width in utf8_iter(text) do for _, _, width in utf8_iter(text) do
text_width = text_width + width text_width = text_width + width
@@ -549,7 +553,9 @@ function serialize_path(path)
local working_path = normal_path:sub(#normal_path) == '\\' and normal_path:sub(1, #normal_path - 1) or normal_path local working_path = normal_path:sub(#normal_path) == '\\' and normal_path:sub(1, #normal_path - 1) or normal_path
local parts = split(working_path, '[\\/]+') local parts = split(working_path, '[\\/]+')
local basename = parts and parts[#parts] or working_path local basename = parts and parts[#parts] or working_path
local dirname = #parts > 1 and table.concat(itable_slice(parts, 1, #parts - 1), state.os == 'windows' and '\\' or '/') or nil local dirname = #parts > 1
and table.concat(itable_slice(parts, 1, #parts - 1), state.os == 'windows' and '\\' or '/')
or nil
local dot_split = split(basename, '%.') local dot_split = split(basename, '%.')
return { return {
@@ -593,10 +599,14 @@ function get_adjacent_file(file_path, direction, allowed_types)
if current_file.basename == file then if current_file.basename == file then
if direction == 'forward' then if direction == 'forward' then
if files[index + 1] then return utils.join_path(current_file.dirname, files[index + 1]) end if files[index + 1] then return utils.join_path(current_file.dirname, files[index + 1]) end
if options.directory_navigation_loops and files[1] then return utils.join_path(current_file.dirname, files[1]) end if options.directory_navigation_loops and files[1] then
return utils.join_path(current_file.dirname, files[1])
end
else else
if files[index - 1] then return utils.join_path(current_file.dirname, files[index - 1]) end if files[index - 1] then return utils.join_path(current_file.dirname, files[index - 1]) end
if options.directory_navigation_loops and files[#files] then return utils.join_path(current_file.dirname, files[#files]) end if options.directory_navigation_loops and files[#files] then
return utils.join_path(current_file.dirname, files[#files])
end
end end
-- This is the only file in directory -- This is the only file in directory
@@ -609,7 +619,13 @@ end
-- Returns `result, error`, result is table of `status:number(<0=error), stdout, stderr, error_string, killed_by_us:boolean` -- Returns `result, error`, result is table of `status:number(<0=error), stdout, stderr, error_string, killed_by_us:boolean`
function delete_file(file_path) function delete_file(file_path)
local args = state.os == 'windows' and {'cmd', '/C', 'del', file_path} or {'rm', file_path} local args = state.os == 'windows' and {'cmd', '/C', 'del', file_path} or {'rm', file_path}
return mp.command_native({name = 'subprocess', args = args, playback_only = false, capture_stdout = true, capture_stderr = true}) return mp.command_native({
name = 'subprocess',
args = args,
playback_only = false,
capture_stdout = true,
capture_stderr = true
})
end end
-- Ensures chapters are in chronological order -- Ensures chapters are in chronological order
@@ -638,11 +654,11 @@ Signature:
{ {
-- element rectangle coordinates -- element rectangle coordinates
ax = 0, ay = 0, bx = 0, by = 0, ax = 0, ay = 0, bx = 0, by = 0,
-- cursor<>element relative proximity as a 0-1 floating number -- cursor<->element relative proximity as a 0-1 floating number
-- where 0 = completely away, and 1 = touching/hovering -- where 0 = completely away, and 1 = touching/hovering
-- so it's easy to work with and throw into equations -- so it's easy to work with and throw into equations
proximity = 0, proximity = 0,
-- raw cursor<>element proximity in pixels -- raw cursor<->element proximity in pixels
proximity_raw = infinity, proximity_raw = infinity,
-- called when element is created -- called when element is created
?init = function(this), ?init = function(this),
@@ -681,6 +697,7 @@ function Element.new(props)
end end
function Element:init() end function Element:init() end
function Element:destroy() end function Element:destroy() end
-- Call method if it exists -- Call method if it exists
@@ -690,8 +707,11 @@ end
-- Tween helpers -- Tween helpers
function Element:tween(...) tween_element(self, ...) end function Element:tween(...) tween_element(self, ...) end
function Element:tween_property(...) tween_element_property(self, ...) end function Element:tween_property(...) tween_element_property(self, ...) end
function Element:tween_stop() tween_element_stop(self) end function Element:tween_stop() tween_element_stop(self) end
function Element:is_tweening() tween_element_is_tweening(self) end function Element:is_tweening() tween_element_is_tweening(self) end
-- Event listeners -- Event listeners
@@ -704,11 +724,13 @@ function Element:on(name, handler)
self._eventListeners[name][#self._eventListeners[name] + 1] = handler self._eventListeners[name][#self._eventListeners[name] + 1] = handler
end end
end end
function Element:off(name, handler) function Element:off(name, handler)
if self._eventListeners[name] == nil then return end if self._eventListeners[name] == nil then return end
local index = itable_find(self._eventListeners, handler) local index = itable_find(self._eventListeners, handler)
if index then table.remove(self._eventListeners, index) end if index then table.remove(self._eventListeners, index) end
end end
function Element:trigger(name, ...) function Element:trigger(name, ...)
self:maybe('on_' .. name, ...) self:maybe('on_' .. name, ...)
if self._eventListeners[name] == nil then return end if self._eventListeners[name] == nil then return end
@@ -762,6 +784,7 @@ function Elements:trigger(name, ...)
end end
function Elements:has(name) return self[name] ~= nil end function Elements:has(name) return self[name] ~= nil end
function Elements:ipairs() return ipairs(self.itable) end function Elements:ipairs() return ipairs(self.itable) end
-- MENU -- MENU
@@ -895,7 +918,7 @@ function Menu:open(items, open_item, opts)
end end
-- Also check menu title -- Also check menu title
local menu_title = this.title and this.title or "" local menu_title = this.title and this.title or ''
local estimated_menu_title_width = text_width_estimate(menu_title, this.font_size) local estimated_menu_title_width = text_width_estimate(menu_title, this.font_size)
if estimated_menu_title_width > estimated_max_width then if estimated_menu_title_width > estimated_max_width then
estimated_max_width = estimated_menu_title_width estimated_max_width = estimated_menu_title_width
@@ -1206,7 +1229,7 @@ function Menu:close(immediate, callback)
if type(immediate) ~= 'boolean' then callback = immediate end if type(immediate) ~= 'boolean' then callback = immediate end
if elements:has('menu') and not menu.is_closing then if elements:has('menu') and not menu.is_closing then
function close() local function close()
elements.menu:maybe('on_close') elements.menu:maybe('on_close')
elements.menu:destroy() elements.menu:destroy()
elements:remove('menu') elements:remove('menu')
@@ -1280,8 +1303,8 @@ end
function icons._volume(muted, pos_x, pos_y, size) function icons._volume(muted, pos_x, pos_y, size)
local ass = assdraw.ass_new() local ass = assdraw.ass_new()
local scale = size / 200 local scale = size / 200
function x(number) return pos_x + (number * scale) end local function x(number) return pos_x + (number * scale) end
function y(number) return pos_y + (number * scale) end local function y(number) return pos_y + (number * scale) end
ass:move_to(x(-85), y(-35)) ass:move_to(x(-85), y(-35))
ass:line_to(x(-50), y(-35)) ass:line_to(x(-50), y(-35))
ass:line_to(x(-5), y(-75)) ass:line_to(x(-5), y(-75))
@@ -1289,27 +1312,41 @@ function icons._volume(muted, pos_x, pos_y, size)
ass:line_to(x(-50), y(35)) ass:line_to(x(-50), y(35))
ass:line_to(x(-85), y(35)) ass:line_to(x(-85), y(35))
if muted then if muted then
ass:move_to(x(76), y(-35)) ass:line_to(x(50), y(-9)) ass:line_to(x(24), y(-35)) ass:move_to(x(76), y(-35))
ass:line_to(x(15), y(-26)) ass:line_to(x(41), y(0)) ass:line_to(x(15), y(26)) ass:line_to(x(50), y(-9))
ass:line_to(x(24), y(35)) ass:line_to(x(50), y(9)) ass:line_to(x(76), y(35)) ass:line_to(x(24), y(-35))
ass:line_to(x(85), y(26)) ass:line_to(x(59), y(0)) ass:line_to(x(85), y(-26)) ass:line_to(x(15), y(-26))
ass:line_to(x(41), y(0))
ass:line_to(x(15), y(26))
ass:line_to(x(24), y(35))
ass:line_to(x(50), y(9))
ass:line_to(x(76), y(35))
ass:line_to(x(85), y(26))
ass:line_to(x(59), y(0))
ass:line_to(x(85), y(-26))
else else
ass:move_to(x(20), y(-30)) ass:line_to(x(20), y(30)) ass:move_to(x(20), y(-30))
ass:line_to(x(35), y(30)) ass:line_to(x(35), y(-30)) ass:line_to(x(20), y(30))
ass:line_to(x(35), y(30))
ass:line_to(x(35), y(-30))
ass:move_to(x(55), y(-60)) ass:line_to(x(55), y(60)) ass:move_to(x(55), y(-60))
ass:line_to(x(70), y(60)) ass:line_to(x(70), y(-60)) ass:line_to(x(55), y(60))
ass:line_to(x(70), y(60))
ass:line_to(x(70), y(-60))
end end
return ass.text return ass.text
end end
function icons.volume(pos_x, pos_y, size) return icons._volume(false, pos_x, pos_y, size) end function icons.volume(pos_x, pos_y, size) return icons._volume(false, pos_x, pos_y, size) end
function icons.volume_muted(pos_x, pos_y, size) return icons._volume(true, pos_x, pos_y, size) end function icons.volume_muted(pos_x, pos_y, size) return icons._volume(true, pos_x, pos_y, size) end
function icons.menu_button(pos_x, pos_y, size) function icons.menu_button(pos_x, pos_y, size)
local ass = assdraw.ass_new() local ass = assdraw.ass_new()
local scale = size / 100 local scale = size / 100
function x(number) return pos_x + (number * scale) end local function x(number) return pos_x + (number * scale) end
function y(number) return pos_y + (number * scale) end local function y(number) return pos_y + (number * scale) end
local line_height = 14 local line_height = 14
local line_spacing = 18 local line_spacing = 18
for i = -1, 1 do for i = -1, 1 do
@@ -1325,8 +1362,8 @@ end
function icons.arrow_right(pos_x, pos_y, size) function icons.arrow_right(pos_x, pos_y, size)
local ass = assdraw.ass_new() local ass = assdraw.ass_new()
local scale = size / 200 local scale = size / 200
function x(number) return pos_x + (number * scale) end local function x(number) return pos_x + (number * scale) end
function y(number) return pos_y + (number * scale) end local function y(number) return pos_y + (number * scale) end
ass:move_to(x(-22), y(-80)) ass:move_to(x(-22), y(-80))
ass:line_to(x(-45), y(-57)) ass:line_to(x(-45), y(-57))
ass:line_to(x(12), y(0)) ass:line_to(x(12), y(0))
@@ -1339,7 +1376,7 @@ end
-- STATE UPDATES -- STATE UPDATES
function update_display_dimensions() function update_display_dimensions()
local dpi_scale = mp.get_property_native("display-hidpi-scale", 1.0) local dpi_scale = mp.get_property_native('display-hidpi-scale', 1.0)
dpi_scale = dpi_scale * options.ui_scale dpi_scale = dpi_scale * options.ui_scale
local width, height, aspect = mp.get_osd_size() local width, height, aspect = mp.get_osd_size()
@@ -1362,7 +1399,8 @@ function update_element_cursor_proximity(element)
else else
local range = options.proximity_out - options.proximity_in local range = options.proximity_out - options.proximity_in
element.proximity_raw = get_point_to_rectangle_proximity(cursor, element) element.proximity_raw = get_point_to_rectangle_proximity(cursor, element)
element.proximity = menu:is_open() and 0 or 1 - (math.min(math.max(element.proximity_raw - options.proximity_in, 0), range) / range) element.proximity = menu:is_open() and 0 or
1 - (math.min(math.max(element.proximity_raw - options.proximity_in, 0), range) / range)
end end
end end
@@ -1682,13 +1720,16 @@ function render_timeline(this)
local elapsed_x = bax + spacing local elapsed_x = bax + spacing
local elapsed_y = fay + (size / 2) local elapsed_y = fay + (size / 2)
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad0\\1c&H'..options.color_foreground_text..'\\fn'..config.font..'\\fs'..this.font_size..bold_tag..'\\clip('..foreground_coordinates..')') ass:append('{\\blur0\\bord0\\shad0\\1c&H' .. options.color_foreground_text .. '\\fn' .. config.font ..
'\\fs' .. this.font_size .. bold_tag .. '\\clip(' .. foreground_coordinates .. ')')
ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity)) ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity))
ass:pos(elapsed_x, elapsed_y) ass:pos(elapsed_x, elapsed_y)
ass:an(4) ass:an(4)
ass:append(state.time_human) ass:append(state.time_human)
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad1\\1c&H'..options.color_background_text..'\\4c&H'..options.color_background..'\\fn'..config.font..'\\fs'..this.font_size..bold_tag..'\\iclip('..foreground_coordinates..')') ass:append('{\\blur0\\bord0\\shad1\\1c&H' .. options.color_background_text ..
'\\4c&H' .. options.color_background .. '\\fn' .. config.font .. '\\fs' .. this.font_size ..
bold_tag .. '\\iclip(' .. foreground_coordinates .. ')')
ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity)) ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity))
ass:pos(elapsed_x, elapsed_y) ass:pos(elapsed_x, elapsed_y)
ass:an(4) ass:an(4)
@@ -1700,13 +1741,16 @@ function render_timeline(this)
local end_x = bbx - spacing local end_x = bbx - spacing
local end_y = fay + (size / 2) local end_y = fay + (size / 2)
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad0\\1c&H'..options.color_foreground_text..'\\fn'..config.font..'\\fs'..this.font_size..bold_tag..'\\clip('..foreground_coordinates..')') ass:append('{\\blur0\\bord0\\shad0\\1c&H' .. options.color_foreground_text .. '\\fn' .. config.font ..
'\\fs' .. this.font_size .. bold_tag .. '\\clip(' .. foreground_coordinates .. ')')
ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity)) ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity))
ass:pos(end_x, end_y) ass:pos(end_x, end_y)
ass:an(6) ass:an(6)
ass:append(state.duration_or_remaining_time_human) ass:append(state.duration_or_remaining_time_human)
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad1\\1c&H'..options.color_background_text..'\\4c&H'..options.color_background..'\\fn'..config.font..'\\fs'..this.font_size..bold_tag..'\\iclip('..foreground_coordinates..')') ass:append('{\\blur0\\bord0\\shad1\\1c&H' .. options.color_background_text ..
'\\4c&H' .. options.color_background .. '\\fn' .. config.font .. '\\fs' .. this.font_size ..
bold_tag .. '\\iclip(' .. foreground_coordinates .. ')')
ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity)) ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1), text_opacity))
ass:pos(end_x, end_y) ass:pos(end_x, end_y)
ass:an(6) ass:an(6)
@@ -1752,13 +1796,15 @@ function render_timeline(this)
local margin_time = text_width_estimate(time_formatted, this.font_size) / 2 local margin_time = text_width_estimate(time_formatted, this.font_size) / 2
local margin_title = chapter_title_width * this.font_size * options.font_height_to_letter_width_ratio / 2 local margin_title = chapter_title_width * this.font_size * options.font_height_to_letter_width_ratio / 2
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord1\\shad0\\1c&H'..options.color_background_text..'\\3c&H'..options.color_background..'\\fn'..config.font..'\\fs'..this.font_size..'\\b1') ass:append('{\\blur0\\bord1\\shad0\\1c&H' .. options.color_background_text ..
'\\3c&H' .. options.color_background .. '\\fn' .. config.font .. '\\fs' .. this.font_size .. '\\b1')
ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1))) ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1)))
ass:pos(math.min(math.max(cursor.x, margin_title), display.width - margin_title), fay - this.font_size * 1.5) ass:pos(math.min(math.max(cursor.x, margin_title), display.width - margin_title), fay - this.font_size * 1.5)
ass:an(2) ass:an(2)
ass:append(chapter_title) ass:append(chapter_title)
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord1\\shad0\\1c&H'..options.color_background_text..'\\3c&H'..options.color_background..'\\fn'..config.font..'\\fs'..this.font_size..bold_tag) ass:append('{\\blur0\\bord1\\shad0\\1c&H' .. options.color_background_text ..
'\\3c&H' .. options.color_background .. '\\fn' .. config.font .. '\\fs' .. this.font_size .. bold_tag)
ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1))) ass:append(ass_opacity(math.min(options.timeline_opacity + 0.1, 1)))
ass:pos(math.min(math.max(cursor.x, margin_time), display.width - margin_time), fay) ass:pos(math.min(math.max(cursor.x, margin_time), display.width - margin_time), fay)
ass:an(2) ass:an(2)
@@ -1766,7 +1812,8 @@ function render_timeline(this)
-- Cursor line -- Cursor line
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\xshad-1\\yshad0\\1c&H'..options.color_foreground..'\\4c&H'..options.color_background..'}') ass:append('{\\blur0\\bord0\\xshad-1\\yshad0\\1c&H' .. options.color_foreground ..
'\\4c&H' .. options.color_background .. '}')
ass:append(ass_opacity(0.2)) ass:append(ass_opacity(0.2))
ass:pos(0, 0) ass:pos(0, 0)
ass:draw_start() ass:draw_start()
@@ -1863,7 +1910,8 @@ function render_top_bar(this)
local clip_coordinates = this.ax .. ',' .. this.ay .. ',' .. (this.title_bx - this.spacing) .. ',' .. this.by local clip_coordinates = this.ax .. ',' .. this.ay .. ',' .. (this.title_bx - this.spacing) .. ',' .. this.by
ass:new_event() ass:new_event()
ass:append('{\\q2\\blur0\\bord1\\shad0\\1c&HFFFFFF\\3c&H000000\\fn'..config.font..'\\fs'..this.font_size..bold_tag..'\\clip('..clip_coordinates..')') ass:append('{\\q2\\blur0\\bord1\\shad0\\1c&HFFFFFF\\3c&H000000\\fn' ..
config.font .. '\\fs' .. this.font_size .. bold_tag .. '\\clip(' .. clip_coordinates .. ')')
ass:append(ass_opacity(1, opacity)) ass:append(ass_opacity(1, opacity))
ass:pos(this.ax + this.spacing, this.ay + (this.size / 2)) ass:pos(this.ax + this.spacing, this.ay + (this.size / 2))
ass:an(4) ass:an(4)
@@ -1894,7 +1942,8 @@ function render_volume(this)
-- Foreground bar coordinates -- Foreground bar coordinates
local height_without_border = slider.height - (options.volume_border * 2) local height_without_border = slider.height - (options.volume_border * 2)
local fax = slider.ax + options.volume_border local fax = slider.ax + options.volume_border
local fay = slider.ay + (height_without_border * (1 - math.min(state.volume / state.volume_max, 1))) + options.volume_border local fay = slider.ay + (height_without_border * (1 - math.min(state.volume / state.volume_max, 1))) +
options.volume_border
local fbx = slider.bx - options.volume_border local fbx = slider.bx - options.volume_border
local fby = slider.by - options.volume_border local fby = slider.by - options.volume_border
@@ -1936,7 +1985,8 @@ function render_volume(this)
-- Background -- Background
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\1c&H'..options.color_background..'\\iclip('..fpath.scale..', '..fpath.text..')}') ass:append('{\\blur0\\bord0\\1c&H' .. options.color_background ..
'\\iclip(' .. fpath.scale .. ', ' .. fpath.text .. ')}')
ass:append(ass_opacity(math.max(options.volume_opacity - 0.1, 0), opacity)) ass:append(ass_opacity(math.max(options.volume_opacity - 0.1, 0), opacity))
ass:pos(0, 0) ass:pos(0, 0)
ass:draw_start() ass:draw_start()
@@ -1972,7 +2022,8 @@ function render_volume(this)
local font_size = round(((this.width * 0.6) - (#volume_string * (this.width / 20))) * options.volume_font_scale) local font_size = round(((this.width * 0.6) - (#volume_string * (this.width / 20))) * options.volume_font_scale)
if fay < slider.by - slider.spacing then if fay < slider.by - slider.spacing then
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad0\\1c&H'..options.color_foreground_text..'\\fn'..config.font..'\\fs'..font_size..bold_tag..'\\clip('..fpath.scale..', '..fpath.text..')}') ass:append('{\\blur0\\bord0\\shad0\\1c&H' .. options.color_foreground_text .. '\\fn' .. config.font ..
'\\fs' .. font_size .. bold_tag .. '\\clip(' .. fpath.scale .. ', ' .. fpath.text .. ')}')
ass:append(ass_opacity(math.min(options.volume_opacity + 0.1, 1), opacity)) ass:append(ass_opacity(math.min(options.volume_opacity + 0.1, 1), opacity))
ass:pos(slider.ax + (slider.width / 2), slider.by - slider.spacing) ass:pos(slider.ax + (slider.width / 2), slider.by - slider.spacing)
ass:an(2) ass:an(2)
@@ -1980,7 +2031,9 @@ function render_volume(this)
end end
if fay > slider.by - slider.spacing - font_size then if fay > slider.by - slider.spacing - font_size then
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad1\\1c&H'..options.color_background_text..'\\4c&H'..options.color_background..'\\fn'..config.font..'\\fs'..font_size..bold_tag..'\\iclip('..fpath.scale..', '..fpath.text..')}') ass:append('{\\blur0\\bord0\\shad1\\1c&H' .. options.color_background_text ..
'\\4c&H' .. options.color_background .. '\\fn' .. config.font .. '\\fs' .. font_size .. bold_tag ..
'\\iclip(' .. fpath.scale .. ', ' .. fpath.text .. ')}')
ass:append(ass_opacity(math.min(options.volume_opacity + 0.1, 1), opacity)) ass:append(ass_opacity(math.min(options.volume_opacity + 0.1, 1), opacity))
ass:pos(slider.ax + (slider.width / 2), slider.by - slider.spacing) ass:pos(slider.ax + (slider.width / 2), slider.by - slider.spacing)
ass:an(2) ass:an(2)
@@ -2076,7 +2129,8 @@ function render_speed(this)
-- Speed value -- Speed value
local speed_text = (round(state.speed * 100) / 100) .. 'x' local speed_text = (round(state.speed * 100) / 100) .. 'x'
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord1\\shad0\\1c&H'..options.color_background_text..'\\3c&H'..options.color_background..'\\fn'..config.font..'\\fs'..this.font_size..bold_tag..'}') ass:append('{\\blur0\\bord1\\shad0\\1c&H' .. options.color_background_text ..
'\\3c&H' .. options.color_background .. '\\fn' .. config.font .. '\\fs' .. this.font_size .. bold_tag .. '}')
ass:append(ass_opacity(options.speed_opacity, opacity)) ass:append(ass_opacity(options.speed_opacity, opacity))
ass:pos(half_x, ay) ass:pos(half_x, ay)
ass:an(8) ass:an(8)
@@ -2125,7 +2179,9 @@ function render_menu(this)
-- Title -- Title
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad1\\b1\\1c&H'..options.color_background_text..'\\4c&H'..options.color_background..'\\fn'..config.font..'\\fs'..this.font_size..'\\q2\\clip('..this.ax..','..this.ay - this.item_height..','..this.bx..','..this.ay..')}') ass:append('{\\blur0\\bord0\\shad1\\b1\\1c&H' .. options.color_background_text ..
'\\4c&H' .. options.color_background .. '\\fn' .. config.font .. '\\fs' .. this.font_size ..
'\\q2\\clip(' .. this.ax .. ',' .. this.ay - this.item_height .. ',' .. this.bx .. ',' .. this.ay .. ')}')
ass:append(ass_opacity(options.menu_opacity, this.opacity)) ass:append(ass_opacity(options.menu_opacity, this.opacity))
ass:pos(display.width / 2, this.ay - (this.item_height * 0.5)) ass:pos(display.width / 2, this.ay - (this.item_height * 0.5))
ass:an(5) ass:an(5)
@@ -2187,11 +2243,14 @@ function render_menu(this)
-- Title -- Title
if item.title then if item.title then
item.ass_save_title = item.ass_save_title or item.title:gsub("([{}])","\\%1") item.ass_save_title = item.ass_save_title or item.title:gsub('([{}])', '\\%1')
local title_clip_x = (this.bx - hint_width - this.item_content_spacing) local title_clip_x = (this.bx - hint_width - this.item_content_spacing)
local title_clip = '\\clip('..this.ax..','..math.max(item_ay, this.ay)..','..title_clip_x..','..math.min(item_by, this.by)..')' local title_clip = '\\clip(' ..
this.ax .. ',' .. math.max(item_ay, this.ay) .. ',' ..
title_clip_x .. ',' .. math.min(item_by, this.by) .. ')'
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\shad1\\1c&H'..font_color..'\\4c&H'..background_color..'\\fn'..config.font..'\\fs'..this.font_size..bold_tag..title_clip..'\\q2}') ass:append('{\\blur0\\bord0\\shad1\\1c&H' .. font_color .. '\\4c&H' .. background_color ..
'\\fn' .. config.font .. '\\fs' .. this.font_size .. bold_tag .. title_clip .. '\\q2}')
ass:append(ass_opacity(options.menu_opacity, this.opacity)) ass:append(ass_opacity(options.menu_opacity, this.opacity))
ass:pos(this.ax + this.item_content_spacing, item_ay + (this.item_height / 2)) ass:pos(this.ax + this.item_content_spacing, item_ay + (this.item_height / 2))
ass:an(4) ass:an(4)
@@ -2200,9 +2259,10 @@ function render_menu(this)
-- Hint -- Hint
if item.hint then if item.hint then
item.ass_save_hint = item.ass_save_hint or item.hint:gsub("([{}])","\\%1") item.ass_save_hint = item.ass_save_hint or item.hint:gsub('([{}])', '\\%1')
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0'..ass_shadow..'\\1c&H'..font_color..''..ass_shadow_color..'\\fn'..config.font..'\\fs'..this.font_size_hint..bold_tag..item_clip..'}') ass:append('{\\blur0\\bord0' .. ass_shadow .. '\\1c&H' .. font_color .. '' .. ass_shadow_color ..
'\\fn' .. config.font .. '\\fs' .. this.font_size_hint .. bold_tag .. item_clip .. '}')
ass:append(ass_opacity(options.menu_opacity * (has_submenu and 1 or 0.5), this.opacity)) ass:append(ass_opacity(options.menu_opacity * (has_submenu and 1 or 0.5), this.opacity))
ass:pos(this.bx - this.item_content_spacing, item_ay + (this.item_height / 2)) ass:pos(this.bx - this.item_content_spacing, item_ay + (this.item_height / 2))
ass:an(6) ass:an(6)
@@ -2294,14 +2354,16 @@ elements:add('window_border', Element.new({
this:update_size(); this:update_size();
end, end,
update_size = function(this) update_size = function(this)
this.size = options.window_border_size > 0 and not state.fullormaxed and not state.border and options.window_border_size or 0 this.size = options.window_border_size > 0 and not state.fullormaxed and not state.border and
options.window_border_size or 0
end, end,
on_prop_border = function(this) this:update_size() end, on_prop_border = function(this) this:update_size() end,
on_prop_fullormaxed = function(this) this:update_size() end, on_prop_fullormaxed = function(this) this:update_size() end,
render = function(this) render = function(this)
if this.size > 0 then if this.size > 0 then
local ass = assdraw.ass_new() local ass = assdraw.ass_new()
local clip_coordinates = this.size..','..this.size..','..(display.width - this.size)..','..(display.height - this.size) local clip_coordinates = this.size ..
',' .. this.size .. ',' .. (display.width - this.size) .. ',' .. (display.height - this.size)
ass:new_event() ass:new_event()
ass:append('{\\blur0\\bord0\\1c&H' .. options.color_background .. '\\iclip(' .. clip_coordinates .. ')}') ass:append('{\\blur0\\bord0\\1c&H' .. options.color_background .. '\\iclip(' .. clip_coordinates .. ')}')
ass:append(ass_opacity(options.window_border_opacity)) ass:append(ass_opacity(options.window_border_opacity))
@@ -2651,7 +2713,8 @@ if itable_find({'center', 'bottom-bar'}, options.menu_button) then
if options.menu_button == 'bottom-bar' then if options.menu_button == 'bottom-bar' then
this.ax = 15 this.ax = 15
this.bx = this.ax + this.width this.bx = this.ax + this.width
this.by = display.height - 10 - elements.window_border.size - elements.timeline.size_max - elements.timeline.top_border this.by = display.height - 10 - elements.window_border.size - elements.timeline.size_max -
elements.timeline.top_border
this.ay = this.by - this.height this.ay = this.by - this.height
else else
this.ax = round((display.width - this.width) / 2) this.ax = round((display.width - this.width) / 2)
@@ -2689,6 +2752,7 @@ if options.speed then
end end
end end
end end
elements:add('speed', Element.new({ elements:add('speed', Element.new({
dragging = nil, dragging = nil,
width = 0, width = 0,
@@ -2810,7 +2874,10 @@ elements:add('curtain', Element.new({
-- Parse `chapter_ranges` option into workable data structure -- Parse `chapter_ranges` option into workable data structure
for _, definition in ipairs(split(options.chapter_ranges, ' *,+ *')) do for _, definition in ipairs(split(options.chapter_ranges, ' *,+ *')) do
local start_patterns, color, opacity, end_patterns = string.match(definition, '([^<]+)<(%x%x%x%x%x%x):(%d?%.?%d*)>([^>]+)') local start_patterns, color, opacity, end_patterns = string.match(
definition,
'([^<]+)<(%x%x%x%x%x%x):(%d?%.?%d*)>([^>]+)'
)
-- Valid definition -- Valid definition
if start_patterns then if start_patterns then
@@ -2841,13 +2908,13 @@ for _, definition in ipairs(split(options.chapter_ranges, ' *,+ *')) do
-- eof is only used when last range is missing end -- eof is only used when last range is missing end
local bof_used = false local bof_used = false
function start_range(chapter) local function start_range(chapter)
-- If there is already a range started, should we append or overwrite? -- If there is already a range started, should we append or overwrite?
-- I chose overwrite here. -- I chose overwrite here.
current_range = {['start'] = chapter} current_range = {['start'] = chapter}
end end
function end_range(chapter) local function end_range(chapter)
current_range['end'] = chapter current_range['end'] = chapter
chapter_range.ranges[#chapter_range.ranges + 1] = current_range chapter_range.ranges[#chapter_range.ranges + 1] = current_range
-- Mark both chapter objects -- Mark both chapter objects
@@ -3001,7 +3068,7 @@ function update_cursor_position()
cursor.y = infinity cursor.y = infinity
end end
local dpi_scale = mp.get_property_native("display-hidpi-scale", 1.0) local dpi_scale = mp.get_property_native('display-hidpi-scale', 1.0)
dpi_scale = dpi_scale * options.ui_scale dpi_scale = dpi_scale * options.ui_scale
cursor.x = cursor.x / dpi_scale cursor.x = cursor.x / dpi_scale
@@ -3054,19 +3121,19 @@ function handle_mouse_move()
end end
function navigate_directory(direction) function navigate_directory(direction)
local path = mp.get_property_native("path") local path = mp.get_property_native('path')
if not path or is_protocol(path) then return end if not path or is_protocol(path) then return end
local next_file = get_adjacent_file(path, direction, options.media_types) local next_file = get_adjacent_file(path, direction, options.media_types)
if next_file then if next_file then
mp.commandv("loadfile", utils.join_path(serialize_path(path).dirname, next_file)) mp.commandv('loadfile', utils.join_path(serialize_path(path).dirname, next_file))
end end
end end
function load_file_in_current_directory(index) function load_file_in_current_directory(index)
local path = mp.get_property_native("path") local path = mp.get_property_native('path')
if not path or is_protocol(path) then return end if not path or is_protocol(path) then return end
@@ -3077,7 +3144,7 @@ function load_file_in_current_directory(index)
if index < 0 then index = #files + index + 1 end if index < 0 then index = #files + index + 1 end
if files[index] then if files[index] then
mp.commandv("loadfile", utils.join_path(dirname, files[index])) mp.commandv('loadfile', utils.join_path(dirname, files[index]))
end end
end end
@@ -3335,7 +3402,7 @@ function open_drives_menu(handle_select, menu_options)
if process.status == 0 then if process.status == 0 then
for _, value in ipairs(split(process.stdout, '\n')) do for _, value in ipairs(split(process.stdout, '\n')) do
local drive = string.match(value, "Name=([A-Z]:)") local drive = string.match(value, 'Name=([A-Z]:)')
if drive then if drive then
local drive_path = normalize_path(drive) local drive_path = normalize_path(drive)
items[#items + 1] = {title = drive, hint = 'Drive', value = drive_path} items[#items + 1] = {title = drive, hint = 'Drive', value = drive_path}
@@ -3358,7 +3425,8 @@ end
-- VALUE SERIALIZATION/NORMALIZATION -- VALUE SERIALIZATION/NORMALIZATION
options.proximity_out = math.max(options.proximity_out, options.proximity_in + 1) options.proximity_out = math.max(options.proximity_out, options.proximity_in + 1)
options.timeline_chapters = itable_find({'dots', 'lines', 'lines-top', 'lines-bottom'}, options.timeline_chapters) and options.timeline_chapters or 'never' options.timeline_chapters = itable_find({'dots', 'lines', 'lines-top', 'lines-bottom'}, options.timeline_chapters) and
options.timeline_chapters or 'never'
options.media_types = split(options.media_types, ' *, *') options.media_types = split(options.media_types, ' *, *')
options.subtitle_types = split(options.subtitle_types, ' *, *') options.subtitle_types = split(options.subtitle_types, ' *, *')
options.stream_quality_options = split(options.stream_quality_options, ' *, *') options.stream_quality_options = split(options.stream_quality_options, ' *, *')
@@ -3490,7 +3558,7 @@ mp.enable_key_bindings('mouse_movement', 'allow-vo-dragging+allow-hide-cursor')
-- Context based key bind groups -- Context based key bind groups
forced_key_bindings = (function() forced_key_bindings = (function()
function create_mouse_event_dispatcher(name) local function create_mouse_event_dispatcher(name)
return function(...) return function(...)
for _, element in pairs(elements) do for _, element in pairs(elements) do
if element.proximity_raw == 0 then if element.proximity_raw == 0 then
@@ -3566,12 +3634,10 @@ end)
mp.add_key_binding(nil, 'decide-pause-indicator', function() mp.add_key_binding(nil, 'decide-pause-indicator', function()
elements.pause_indicator:decide() elements.pause_indicator:decide()
end) end)
function menu_key_binding() function menu_key_binding() toggle_menu_with_items(state.context_menu_items) end
toggle_menu_with_items(state.context_menu_items)
end
mp.add_key_binding(nil, 'menu', menu_key_binding) mp.add_key_binding(nil, 'menu', menu_key_binding)
mp.register_script_message('show-submenu', function(name) mp.register_script_message('show-submenu', function(name)
local path = split(name, " *>+ *") local path = split(name, ' *>+ *')
local items = state.context_menu_items local items = state.context_menu_items
local last_menu_title = nil local last_menu_title = nil
@@ -3609,7 +3675,7 @@ mp.add_key_binding(nil, 'load-subtitles', function()
end end
end end
if not path then if not path then
path = os.getenv("HOME") --[[@as string]] path = os.getenv('HOME') --[[@as string]]
end end
open_file_navigation_menu( open_file_navigation_menu(
path, path,
@@ -3776,7 +3842,7 @@ mp.add_key_binding(nil, 'open-file', function()
end end
-- Update selected file in directory navigation menu -- Update selected file in directory navigation menu
function handle_file_loaded() local function handle_file_loaded()
if menu:is_open('open-file') then if menu:is_open('open-file') then
local path = normalize_path(mp.get_property_native('path')) local path = normalize_path(mp.get_property_native('path'))
elements.menu:activate_value(path) elements.menu:activate_value(path)