refactor: use new velocity measurement for menu flings
This commit is contained in:

committed by
Tomas Klaen

parent
3f21df1a9d
commit
d25f3e2e99
@@ -106,8 +106,7 @@ function Menu:init(data, callback, opts)
|
|||||||
self.key_bindings = {}
|
self.key_bindings = {}
|
||||||
self.is_being_replaced = false
|
self.is_being_replaced = false
|
||||||
self.is_closing, self.is_closed = false, false
|
self.is_closing, self.is_closed = false, false
|
||||||
---@type {y: integer, time: number}[]
|
self.drag_last_y = nil
|
||||||
self.drag_data = nil
|
|
||||||
self.is_dragging = false
|
self.is_dragging = false
|
||||||
|
|
||||||
self:update(data)
|
self:update(data)
|
||||||
@@ -545,47 +544,37 @@ function Menu:on_prop_fullormaxed() self:update_content_dimensions() end
|
|||||||
|
|
||||||
function Menu:handle_cursor_down()
|
function Menu:handle_cursor_down()
|
||||||
if self.proximity_raw == 0 then
|
if self.proximity_raw == 0 then
|
||||||
self.drag_data = {{y = cursor.y, time = mp.get_time()}}
|
self.drag_last_y = cursor.y
|
||||||
self.current.fling = nil
|
self.current.fling = nil
|
||||||
else
|
else
|
||||||
self:close()
|
self:close()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Menu:fling_distance()
|
|
||||||
local first, last = self.drag_data[1], self.drag_data[#self.drag_data]
|
|
||||||
if mp.get_time() - last.time > 0.05 then return 0 end
|
|
||||||
for i = #self.drag_data - 1, 1, -1 do
|
|
||||||
local drag = self.drag_data[i]
|
|
||||||
if last.time - drag.time > 0.03 then return ((drag.y - last.y) / ((last.time - drag.time) / 0.03)) * 10 end
|
|
||||||
end
|
|
||||||
return #self.drag_data < 2 and 0 or ((first.y - last.y) / ((first.time - last.time) / 0.03)) * 10
|
|
||||||
end
|
|
||||||
|
|
||||||
function Menu:handle_cursor_up()
|
function Menu:handle_cursor_up()
|
||||||
if self.proximity_raw == 0 and self.drag_data and not self.is_dragging then
|
if self.proximity_raw == 0 and self.drag_last_y and not self.is_dragging then
|
||||||
self:open_selected_item({preselect_first_item = false, keep_open = self.modifiers and self.modifiers.shift})
|
self:open_selected_item({preselect_first_item = false, keep_open = self.modifiers and self.modifiers.shift})
|
||||||
end
|
end
|
||||||
if self.is_dragging then
|
if self.is_dragging then
|
||||||
local distance = self:fling_distance()
|
local distance = cursor.get_velocity().y / -3
|
||||||
if math.abs(distance) > 50 then
|
if math.abs(distance) > 50 then
|
||||||
self.current.fling = {
|
self.current.fling = {
|
||||||
y = self.current.scroll_y, distance = distance, time = self.drag_data[#self.drag_data].time,
|
y = self.current.scroll_y, distance = distance, time = cursor.history:head().time,
|
||||||
easing = ease_out_quart, duration = 0.5, update_cursor = true,
|
easing = ease_out_quart, duration = 0.5, update_cursor = true,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.is_dragging = false
|
self.is_dragging = false
|
||||||
self.drag_data = nil
|
self.drag_last_y = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
function Menu:on_global_mouse_move()
|
function Menu:on_global_mouse_move()
|
||||||
self.mouse_nav = true
|
self.mouse_nav = true
|
||||||
if self.drag_data then
|
if self.drag_last_y then
|
||||||
self.is_dragging = self.is_dragging or math.abs(cursor.y - self.drag_data[1].y) >= 10
|
self.is_dragging = self.is_dragging or math.abs(cursor.y - self.drag_last_y) >= 10
|
||||||
local distance = self.drag_data[#self.drag_data].y - cursor.y
|
local distance = self.drag_last_y - cursor.y
|
||||||
if distance ~= 0 then self:set_scroll_by(distance) end
|
if distance ~= 0 then self:set_scroll_by(distance) end
|
||||||
self.drag_data[#self.drag_data + 1] = {y = cursor.y, time = mp.get_time()}
|
if self.is_dragging then self.drag_last_y = cursor.y end
|
||||||
end
|
end
|
||||||
request_render()
|
request_render()
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user