summaryrefslogtreecommitdiffstats
path: root/.config/mpv/scripts/uosc_shared/elements/Elements.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/mpv/scripts/uosc_shared/elements/Elements.lua')
-rw-r--r--.config/mpv/scripts/uosc_shared/elements/Elements.lua158
1 files changed, 0 insertions, 158 deletions
diff --git a/.config/mpv/scripts/uosc_shared/elements/Elements.lua b/.config/mpv/scripts/uosc_shared/elements/Elements.lua
deleted file mode 100644
index fe2cd6b..0000000
--- a/.config/mpv/scripts/uosc_shared/elements/Elements.lua
+++ /dev/null
@@ -1,158 +0,0 @@
-local Elements = {itable = {}}
-
----@param element Element
-function Elements:add(element)
- if not element.id then
- msg.error('attempt to add element without "id" property')
- return
- end
-
- if self:has(element.id) then Elements:remove(element.id) end
-
- self.itable[#self.itable + 1] = element
- self[element.id] = element
-
- request_render()
-end
-
-function Elements:remove(idOrElement)
- if not idOrElement then return end
- local id = type(idOrElement) == 'table' and idOrElement.id or idOrElement
- local element = Elements[id]
- if element then
- if not element.destroyed then element:destroy() end
- element.enabled = false
- self.itable = itable_remove(self.itable, self[id])
- self[id] = nil
- request_render()
- end
-end
-
-function Elements:update_proximities()
- local capture_mbtn_left = false
- local capture_wheel = false
- local menu_only = Elements.menu ~= nil
- local mouse_leave_elements = {}
- local mouse_enter_elements = {}
-
- -- Calculates proximities and opacities for defined elements
- for _, element in self:ipairs() do
- if element.enabled then
- local previous_proximity_raw = element.proximity_raw
-
- -- If menu is open, all other elements have to be disabled
- if menu_only then
- if element.ignores_menu then
- capture_mbtn_left = true
- capture_wheel = true
- element:update_proximity()
- else
- element.proximity_raw = infinity
- element.proximity = 0
- end
- else
- element:update_proximity()
- end
-
- -- Element has global forced key listeners
- if element.on_global_mbtn_left_down then capture_mbtn_left = true end
- if element.on_global_wheel_up or element.on_global_wheel_down then capture_wheel = true end
-
- if element.proximity_raw == 0 then
- -- Element has local forced key listeners
- if element.on_mbtn_left_down then capture_mbtn_left = true end
- if element.on_wheel_up or element.on_wheel_up then capture_wheel = true end
-
- -- Mouse entered element area
- if previous_proximity_raw ~= 0 then
- mouse_enter_elements[#mouse_enter_elements + 1] = element
- end
- else
- -- Mouse left element area
- if previous_proximity_raw == 0 then
- mouse_leave_elements[#mouse_leave_elements + 1] = element
- end
- end
- end
- end
-
- -- Enable key group captures requested by elements
- mp[capture_mbtn_left and 'enable_key_bindings' or 'disable_key_bindings']('mbtn_left')
- mp[capture_wheel and 'enable_key_bindings' or 'disable_key_bindings']('wheel')
-
- -- Trigger `mouse_leave` and `mouse_enter` events
- for _, element in ipairs(mouse_leave_elements) do element:trigger('mouse_leave') end
- for _, element in ipairs(mouse_enter_elements) do element:trigger('mouse_enter') end
-end
-
--- Toggles passed elements' min visibilities between 0 and 1.
----@param ids string[] IDs of elements to peek.
-function Elements:toggle(ids)
- local has_invisible = itable_find(ids, function(id) return Elements[id] and Elements[id].min_visibility ~= 1 end)
- self:set_min_visibility(has_invisible and 1 or 0, ids)
-end
-
--- Set (animate) elements' min visibilities to passed value.
----@param visibility number 0-1 floating point.
----@param ids string[] IDs of elements to peek.
-function Elements:set_min_visibility(visibility, ids)
- for _, id in ipairs(ids) do
- local element = Elements[id]
- if element then element:tween_property('min_visibility', element.min_visibility, visibility) end
- end
-end
-
--- Flash passed elements.
----@param ids string[] IDs of elements to peek.
-function Elements:flash(ids)
- local elements = itable_filter(self.itable, function(element) return itable_index_of(ids, element.id) ~= nil end)
- for _, element in ipairs(elements) do element:flash() end
-end
-
----@param name string Event name.
-function Elements:trigger(name, ...)
- for _, element in self:ipairs() do element:trigger(name, ...) end
-end
-
--- Trigger two events, `name` and `global_name`, depending on element-cursor proximity.
--- Disabled elements don't receive these events.
----@param name string Event name.
-function Elements:proximity_trigger(name, ...)
- local stop_normal, stop_global = false, false
- for i = #self.itable, 1, -1 do
- local element = self.itable[i]
- if element.enabled then
- if element.proximity_raw == 0 then
- if element:trigger(name, ...) == 'stop_propagation' then break end
- end
- if element:trigger('global_' .. name, ...) == 'stop_propagation' then break end
- end
- end
-end
-
-function Elements:has(id) return self[id] ~= nil end
-function Elements:ipairs() return ipairs(self.itable) end
-
----@param name string Event name.
-function Elements:create_proximity_dispatcher(name)
- return function(...) self:proximity_trigger(name, ...) end
-end
-
-mp.set_key_bindings({
- {
- 'mbtn_left',
- Elements:create_proximity_dispatcher('mbtn_left_up'),
- function(...)
- update_mouse_pos(nil, mp.get_property_native('mouse-pos'), true)
- Elements:proximity_trigger('mbtn_left_down', ...)
- end,
- },
- {'mbtn_left_dbl', 'ignore'},
-}, 'mbtn_left', 'force')
-
-mp.set_key_bindings({
- {'wheel_up', Elements:create_proximity_dispatcher('wheel_up')},
- {'wheel_down', Elements:create_proximity_dispatcher('wheel_down')},
-}, 'wheel', 'force')
-
-return Elements