Refactor where element rectangles and proximities are being calculated
This commit is contained in:
191
uosc.lua
191
uosc.lua
@@ -22,7 +22,7 @@ progressbar_fullscreen= # defaults to `progressbar`
|
|||||||
progressbar_size=4 # progressbar size in pixels
|
progressbar_size=4 # progressbar size in pixels
|
||||||
progressbar_size_fullscreen= # defaults to `progressbar_size`
|
progressbar_size_fullscreen= # defaults to `progressbar_size`
|
||||||
seekbar_size=40 # seekbar size in pixels
|
seekbar_size=40 # seekbar size in pixels
|
||||||
seekbar_size_fullscreen=0 # defaults to `seekbar_size`
|
seekbar_size_fullscreen= # defaults to `seekbar_size`
|
||||||
min_proximity=60 # element<>cursor proximity below which opacity equals 1
|
min_proximity=60 # element<>cursor proximity below which opacity equals 1
|
||||||
max_proximity=120 # element<>cursor proximity above which opacity equals 0
|
max_proximity=120 # element<>cursor proximity above which opacity equals 0
|
||||||
bar_opacity=0.8 # max opacity of progress and seek bars
|
bar_opacity=0.8 # max opacity of progress and seek bars
|
||||||
@@ -60,6 +60,12 @@ opt.read_options(options, "uosc")
|
|||||||
local config = {
|
local config = {
|
||||||
render_delay = 0.03, -- sets rendering frequency
|
render_delay = 0.03, -- sets rendering frequency
|
||||||
font = mp.get_property("options/osd-font"),
|
font = mp.get_property("options/osd-font"),
|
||||||
|
window_controls = {
|
||||||
|
button_width = 46,
|
||||||
|
height = 40,
|
||||||
|
icon_opacity = 0.8,
|
||||||
|
background_opacity = 0.8,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
local state = {
|
local state = {
|
||||||
filename = "",
|
filename = "",
|
||||||
@@ -83,52 +89,96 @@ local cursor = {
|
|||||||
x = nil,
|
x = nil,
|
||||||
y = nil,
|
y = nil,
|
||||||
}
|
}
|
||||||
local window_controls = {
|
|
||||||
button_width = 46,
|
|
||||||
button_height = 40,
|
|
||||||
icon_opacity = 0.8,
|
|
||||||
background_opacity = 0.8,
|
|
||||||
}
|
|
||||||
local infinity = 1e309
|
local infinity = 1e309
|
||||||
local elements = {
|
local elements = {
|
||||||
progressbar = {
|
progressbar = {
|
||||||
enabled = true, -- flag set manually through runtime keybinds
|
enabled = true, -- flag set manually through runtime keybinds
|
||||||
show = true, -- consolidation of `progressbar` and `progressbar_fullscreen`
|
show = true, -- consolidation of `progressbar` and `progressbar_fullscreen` options
|
||||||
size = 0, -- dynamic consolidation of `seekbar_size` and `seekbar_size_fullscreen`
|
size = 0, -- consolidation of `progressbar_size` and `progressbar_size_fullscreen` options
|
||||||
ax = 0, ay = 0, bx = 0, by = 0, -- calculated on screen dimensions init/update
|
on_display_resize = function(element)
|
||||||
|
element.size = (state.fullscreen or state.maximized)
|
||||||
|
and (options.progressbar_size_fullscreen ~= 0)
|
||||||
|
and options.progressbar_size_fullscreen
|
||||||
|
or options.progressbar_size
|
||||||
|
|
||||||
|
element.show = state.fullscreen
|
||||||
|
and options.progressbar_fullscreen ~= ""
|
||||||
|
and options.progressbar_fullscreen
|
||||||
|
or options.progressbar
|
||||||
|
end,
|
||||||
render = function(ass) render_progressbar(ass) end,
|
render = function(ass) render_progressbar(ass) end,
|
||||||
},
|
},
|
||||||
seekbar = {
|
seekbar = {
|
||||||
interactive = true, -- listen for mouse events and don't disable window dragging
|
interactive = true, -- listen for mouse events and don't disable window dragging
|
||||||
size = 0, -- dynamic consolidation of `seekbar_size` and `seekbar_size_fullscreen`
|
size = 0, -- consolidation of `seekbar_size` and `seekbar_size_fullscreen` options
|
||||||
ax = 0, ay = 0, bx = 0, by = 0, -- calculated on screen dimensions init/update
|
ax = 0, ay = 0, bx = 0, by = 0, -- calculated by on_display_resize
|
||||||
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
||||||
render = function(ass) render_seekbar(ass) end,
|
on_mouse_move = function(element) update_element_cursor_proximity(element) end,
|
||||||
|
on_display_resize = function(element)
|
||||||
|
element.size = (state.fullscreen or state.maximized)
|
||||||
|
and (options.seekbar_size_fullscreen ~= 0)
|
||||||
|
and options.seekbar_size_fullscreen
|
||||||
|
or options.seekbar_size
|
||||||
|
element.ax = 0
|
||||||
|
element.ay = display.height - element.size
|
||||||
|
element.bx = display.width
|
||||||
|
element.by = display.height
|
||||||
|
end,
|
||||||
on_mbtn_left_down = function()
|
on_mbtn_left_down = function()
|
||||||
mp.commandv("seek", ((cursor.x / display.width) * 100), "absolute-percent+exact")
|
mp.commandv("seek", ((cursor.x / display.width) * 100), "absolute-percent+exact")
|
||||||
end
|
end,
|
||||||
|
render = function(ass) render_seekbar(ass) end,
|
||||||
},
|
},
|
||||||
window_controls = {
|
window_controls = {
|
||||||
ax = 0, ay = 0, bx = 0, by = 0, -- calculated on screen dimensions init/update
|
ax = 0, ay = 0, bx = 0, by = 0, -- calculated by on_display_resize
|
||||||
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
||||||
|
on_mouse_move = function(element) update_element_cursor_proximity(element) end,
|
||||||
|
on_display_resize = function(element)
|
||||||
|
local ax = display.width - (config.window_controls.button_width * 3)
|
||||||
|
element.ax = options.title and 0 or ax
|
||||||
|
element.ay = 0
|
||||||
|
element.bx = display.width
|
||||||
|
element.by = config.window_controls.height
|
||||||
|
end,
|
||||||
render = function(ass) render_window_controls(ass) end,
|
render = function(ass) render_window_controls(ass) end,
|
||||||
},
|
},
|
||||||
window_controls_minimize = {
|
window_controls_minimize = {
|
||||||
interactive = true, -- listen for mouse events and don't disable window dragging
|
interactive = true, -- listen for mouse events and don't disable window dragging
|
||||||
ax = 0, ay = 0, bx = 0, by = 0, -- calculated on screen dimensions init/update
|
ax = 0, ay = 0, bx = 0, by = 0, -- calculated by on_display_resize
|
||||||
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
||||||
|
on_mouse_move = function(element) update_element_cursor_proximity(element) end,
|
||||||
|
on_display_resize = function(element)
|
||||||
|
element.ax = display.width - (config.window_controls.button_width * 3)
|
||||||
|
element.ay = 0
|
||||||
|
element.bx = element.ax + config.window_controls.button_width
|
||||||
|
element.by = config.window_controls.height
|
||||||
|
end,
|
||||||
on_mbtn_left_down = function() mp.commandv("cycle", "window-minimized") end
|
on_mbtn_left_down = function() mp.commandv("cycle", "window-minimized") end
|
||||||
},
|
},
|
||||||
window_controls_maximize = {
|
window_controls_maximize = {
|
||||||
interactive = true, -- listen for mouse events and don't disable window dragging
|
interactive = true, -- listen for mouse events and don't disable window dragging
|
||||||
ax = 0, ay = 0, bx = 0, by = 0, -- calculated on screen dimensions init/update
|
ax = 0, ay = 0, bx = 0, by = 0, -- calculated by on_display_resize
|
||||||
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
||||||
|
on_mouse_move = function(element) update_element_cursor_proximity(element) end,
|
||||||
|
on_display_resize = function(element)
|
||||||
|
element.ax = display.width - (config.window_controls.button_width * 2)
|
||||||
|
element.ay = 0
|
||||||
|
element.bx = element.ax + config.window_controls.button_width
|
||||||
|
element.by = config.window_controls.height
|
||||||
|
end,
|
||||||
on_mbtn_left_down = function() mp.commandv("cycle", "window-maximized") end
|
on_mbtn_left_down = function() mp.commandv("cycle", "window-maximized") end
|
||||||
},
|
},
|
||||||
window_controls_close = {
|
window_controls_close = {
|
||||||
interactive = true, -- listen for mouse events and don't disable window dragging
|
interactive = true, -- listen for mouse events and don't disable window dragging
|
||||||
ax = 0, ay = 0, bx = 0, by = 0, -- calculated on screen dimensions init/update
|
ax = 0, ay = 0, bx = 0, by = 0, -- calculated by on_display_resize
|
||||||
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
proximity = infinity, opacity = 0, -- calculated on mouse movement
|
||||||
|
on_mouse_move = function(element) update_element_cursor_proximity(element) end,
|
||||||
|
on_display_resize = function(element)
|
||||||
|
element.ax = display.width - config.window_controls.button_width
|
||||||
|
element.ay = 0
|
||||||
|
element.bx = element.ax + config.window_controls.button_width
|
||||||
|
element.by = config.window_controls.height
|
||||||
|
end,
|
||||||
on_mbtn_left_down = function() mp.commandv("quit") end
|
on_mbtn_left_down = function() mp.commandv("quit") end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -168,51 +218,12 @@ function update_display_dimensions()
|
|||||||
display.height = o.h
|
display.height = o.h
|
||||||
display.aspect = o.aspect
|
display.aspect = o.aspect
|
||||||
|
|
||||||
-- Update element rectangles
|
-- Tell elements to update their area rectangles
|
||||||
|
for _, element in pairs(elements) do
|
||||||
-- Seekbar
|
if element.on_display_resize ~= nil then
|
||||||
elements.seekbar.size = (state.fullscreen or state.maximized) and (options.seekbar_size_fullscreen ~= 0)
|
element.on_display_resize(element)
|
||||||
and options.seekbar_size_fullscreen
|
end
|
||||||
or options.seekbar_size
|
end
|
||||||
elements.seekbar.ax = 0
|
|
||||||
elements.seekbar.ay = display.height - elements.seekbar.size
|
|
||||||
elements.seekbar.bx = display.width
|
|
||||||
elements.seekbar.by = display.height
|
|
||||||
|
|
||||||
local window_control_buttons_ax = display.width - (window_controls.button_width * 3)
|
|
||||||
|
|
||||||
-- Window controls
|
|
||||||
elements.window_controls.ax = options.title and 0 or window_control_buttons_ax
|
|
||||||
elements.window_controls.ay = 0
|
|
||||||
elements.window_controls.bx = display.width
|
|
||||||
elements.window_controls.by = window_controls.button_height
|
|
||||||
|
|
||||||
-- Window controls minimize button
|
|
||||||
elements.window_controls_minimize.ax = window_control_buttons_ax
|
|
||||||
elements.window_controls_minimize.ay = 0
|
|
||||||
elements.window_controls_minimize.bx = elements.window_controls_minimize.ax + window_controls.button_width
|
|
||||||
elements.window_controls_minimize.by = window_controls.button_height
|
|
||||||
|
|
||||||
-- Window controls maximize button
|
|
||||||
elements.window_controls_maximize.ax = elements.window_controls_minimize.bx
|
|
||||||
elements.window_controls_maximize.ay = 0
|
|
||||||
elements.window_controls_maximize.bx = elements.window_controls_maximize.ax + window_controls.button_width
|
|
||||||
elements.window_controls_maximize.by = window_controls.button_height
|
|
||||||
|
|
||||||
-- Window controls close button
|
|
||||||
elements.window_controls_close.ax = elements.window_controls_maximize.bx
|
|
||||||
elements.window_controls_close.ay = 0
|
|
||||||
elements.window_controls_close.bx = elements.window_controls_close.ax + window_controls.button_width
|
|
||||||
elements.window_controls_close.by = window_controls.button_height
|
|
||||||
|
|
||||||
-- Update progressbar rendering config
|
|
||||||
elements.progressbar.size = (state.fullscreen or state.maximized) and (options.progressbar_size_fullscreen ~= 0)
|
|
||||||
and options.progressbar_size_fullscreen
|
|
||||||
or options.progressbar_size
|
|
||||||
|
|
||||||
elements.progressbar.show = state.fullscreen and options.progressbar_fullscreen ~= ""
|
|
||||||
and options.progressbar_fullscreen
|
|
||||||
or options.progressbar
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function update_cursor_position()
|
function update_cursor_position()
|
||||||
@@ -222,26 +233,28 @@ function update_cursor_position()
|
|||||||
update_proximities()
|
update_proximities()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function update_element_cursor_proximity(element)
|
||||||
|
if cursor.hidden then
|
||||||
|
element.proximity = infinity
|
||||||
|
element.opacity = 0
|
||||||
|
else
|
||||||
|
local range = options.max_proximity - options.min_proximity
|
||||||
|
element.proximity = get_point_to_rectangle_proximity(cursor, element)
|
||||||
|
element.opacity = 1 - math.min(math.max(element.proximity - options.min_proximity, 0), range) / range
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function update_proximities()
|
function update_proximities()
|
||||||
local max = options.max_proximity
|
|
||||||
local min = options.min_proximity
|
|
||||||
local range = max - min
|
|
||||||
local should_enable_mouse_bindings = false
|
local should_enable_mouse_bindings = false
|
||||||
|
|
||||||
-- Calculates proximities and opacities for defined elements
|
-- Calculates proximities and opacities for defined elements
|
||||||
for _, element in pairs(elements) do
|
for _, element in pairs(elements) do
|
||||||
-- Only update proximity and opacity for elements that care about it
|
-- Only update proximity and opacity for elements that care about it
|
||||||
if element.proximity ~= nil then
|
if element.proximity ~= nil and element.on_mouse_move ~= nil then
|
||||||
if cursor.hidden then
|
element.on_mouse_move(element)
|
||||||
element.proximity = infinity
|
|
||||||
element.opacity = 0
|
|
||||||
else
|
|
||||||
element.proximity = get_point_to_rectangle_proximity(cursor, element)
|
|
||||||
element.opacity = 1 - math.min(math.max(element.proximity - min, 0), range) / range
|
|
||||||
should_enable_mouse_bindings = should_enable_mouse_bindings or (element.interactive and element.proximity == 0)
|
should_enable_mouse_bindings = should_enable_mouse_bindings or (element.interactive and element.proximity == 0)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
-- Disable cursor input interception when cursor is not over any controls
|
-- Disable cursor input interception when cursor is not over any controls
|
||||||
if not state.mouse_bindings_enabled and should_enable_mouse_bindings then
|
if not state.mouse_bindings_enabled and should_enable_mouse_bindings then
|
||||||
@@ -408,7 +421,7 @@ function render_window_controls(ass)
|
|||||||
-- Background on hover
|
-- Background on hover
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord0\\1c&H2311e8}")
|
ass:append("{\\blur0\\bord0\\1c&H2311e8}")
|
||||||
ass_append_opacity(ass, window_controls.background_opacity, master_opacity)
|
ass_append_opacity(ass, config.window_controls.background_opacity, master_opacity)
|
||||||
ass:pos(0, 0)
|
ass:pos(0, 0)
|
||||||
ass:draw_start()
|
ass:draw_start()
|
||||||
ass:rect_cw(close.ax, close.ay, close.bx, close.by)
|
ass:rect_cw(close.ax, close.ay, close.bx, close.by)
|
||||||
@@ -416,8 +429,8 @@ function render_window_controls(ass)
|
|||||||
end
|
end
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord1\\shad1\\3c&HFFFFFF\\4c&H000000}")
|
ass:append("{\\blur0\\bord1\\shad1\\3c&HFFFFFF\\4c&H000000}")
|
||||||
ass_append_opacity(ass, window_controls.icon_opacity, master_opacity)
|
ass_append_opacity(ass, config.window_controls.icon_opacity, master_opacity)
|
||||||
ass:pos(close.ax + (window_controls.button_width / 2), (window_controls.button_height / 2))
|
ass:pos(close.ax + (config.window_controls.button_width / 2), (config.window_controls.height / 2))
|
||||||
ass:draw_start()
|
ass:draw_start()
|
||||||
ass:move_to(-5, 5)
|
ass:move_to(-5, 5)
|
||||||
ass:line_to(5, -5)
|
ass:line_to(5, -5)
|
||||||
@@ -431,7 +444,7 @@ function render_window_controls(ass)
|
|||||||
-- Background on hover
|
-- Background on hover
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord0\\1c&H000000}")
|
ass:append("{\\blur0\\bord0\\1c&H000000}")
|
||||||
ass_append_opacity(ass, window_controls.background_opacity, master_opacity)
|
ass_append_opacity(ass, config.window_controls.background_opacity, master_opacity)
|
||||||
ass:pos(0, 0)
|
ass:pos(0, 0)
|
||||||
ass:draw_start()
|
ass:draw_start()
|
||||||
ass:rect_cw(maximize.ax, maximize.ay, maximize.bx, maximize.by)
|
ass:rect_cw(maximize.ax, maximize.ay, maximize.bx, maximize.by)
|
||||||
@@ -439,15 +452,15 @@ function render_window_controls(ass)
|
|||||||
end
|
end
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord2\\shad0\\1c\\3c&H000000}")
|
ass:append("{\\blur0\\bord2\\shad0\\1c\\3c&H000000}")
|
||||||
ass_append_opacity(ass, {[3] = window_controls.icon_opacity}, master_opacity)
|
ass_append_opacity(ass, {[3] = config.window_controls.icon_opacity}, master_opacity)
|
||||||
ass:pos(maximize.ax + (window_controls.button_width / 2), (window_controls.button_height / 2))
|
ass:pos(maximize.ax + (config.window_controls.button_width / 2), (config.window_controls.height / 2))
|
||||||
ass:draw_start()
|
ass:draw_start()
|
||||||
ass:rect_cw(-4, -4, 6, 6)
|
ass:rect_cw(-4, -4, 6, 6)
|
||||||
ass:draw_stop()
|
ass:draw_stop()
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord2\\shad0\\1c\\3c&HFFFFFF}")
|
ass:append("{\\blur0\\bord2\\shad0\\1c\\3c&HFFFFFF}")
|
||||||
ass_append_opacity(ass, {[3] = window_controls.icon_opacity}, master_opacity)
|
ass_append_opacity(ass, {[3] = config.window_controls.icon_opacity}, master_opacity)
|
||||||
ass:pos(maximize.ax + (window_controls.button_width / 2), (window_controls.button_height / 2))
|
ass:pos(maximize.ax + (config.window_controls.button_width / 2), (config.window_controls.height / 2))
|
||||||
ass:draw_start()
|
ass:draw_start()
|
||||||
ass:rect_cw(-5, -5, 5, 5)
|
ass:rect_cw(-5, -5, 5, 5)
|
||||||
ass:draw_stop()
|
ass:draw_stop()
|
||||||
@@ -458,7 +471,7 @@ function render_window_controls(ass)
|
|||||||
-- Background on hover
|
-- Background on hover
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord0\\1c&H000000}")
|
ass:append("{\\blur0\\bord0\\1c&H000000}")
|
||||||
ass_append_opacity(ass, window_controls.background_opacity, master_opacity)
|
ass_append_opacity(ass, config.window_controls.background_opacity, master_opacity)
|
||||||
ass:pos(0, 0)
|
ass:pos(0, 0)
|
||||||
ass:draw_start()
|
ass:draw_start()
|
||||||
ass:rect_cw(minimize.ax, minimize.ay, minimize.bx, minimize.by)
|
ass:rect_cw(minimize.ax, minimize.ay, minimize.bx, minimize.by)
|
||||||
@@ -466,9 +479,9 @@ function render_window_controls(ass)
|
|||||||
end
|
end
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord1\\shad1\\3c&HFFFFFF\\4c&H000000}")
|
ass:append("{\\blur0\\bord1\\shad1\\3c&HFFFFFF\\4c&H000000}")
|
||||||
ass_append_opacity(ass, window_controls.icon_opacity, master_opacity)
|
ass_append_opacity(ass, config.window_controls.icon_opacity, master_opacity)
|
||||||
ass:append("{\\1a&HFF&}")
|
ass:append("{\\1a&HFF&}")
|
||||||
ass:pos(minimize.ax + (window_controls.button_width / 2), (window_controls.button_height / 2))
|
ass:pos(minimize.ax + (config.window_controls.button_width / 2), (config.window_controls.height / 2))
|
||||||
ass:draw_start()
|
ass:draw_start()
|
||||||
ass:move_to(-5, 0)
|
ass:move_to(-5, 0)
|
||||||
ass:line_to(5, 0)
|
ass:line_to(5, 0)
|
||||||
@@ -476,14 +489,14 @@ function render_window_controls(ass)
|
|||||||
|
|
||||||
-- Window title
|
-- Window title
|
||||||
if options.title then
|
if options.title then
|
||||||
local spacing = math.ceil(window_controls.button_height * 0.25)
|
local spacing = math.ceil(config.window_controls.height * 0.25)
|
||||||
local fontsize = math.floor(window_controls.button_height - (spacing * 2))
|
local fontsize = math.floor(config.window_controls.height - (spacing * 2))
|
||||||
local clip_coordinates = "0,0,"..(minimize.ax - 10)..","..window_controls.button_height
|
local clip_coordinates = "0,0,"..(minimize.ax - 10)..","..config.window_controls.height
|
||||||
|
|
||||||
ass:new_event()
|
ass:new_event()
|
||||||
ass:append("{\\blur0\\bord0\\shad1\\1c&HFFFFFF\\4c&H000000\\fn"..config.font.."\\fs"..fontsize.."\\clip("..clip_coordinates..")")
|
ass:append("{\\blur0\\bord0\\shad1\\1c&HFFFFFF\\4c&H000000\\fn"..config.font.."\\fs"..fontsize.."\\clip("..clip_coordinates..")")
|
||||||
ass_append_opacity(ass, 1, master_opacity)
|
ass_append_opacity(ass, 1, master_opacity)
|
||||||
ass:pos(0 + spacing, window_controls.button_height / 2)
|
ass:pos(0 + spacing, config.window_controls.height / 2)
|
||||||
ass:an(4)
|
ass:an(4)
|
||||||
ass:append(state.filename)
|
ass:append(state.filename)
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user