From 50021f8d850b81e7ec27b0e048dafb693fb49a6c Mon Sep 17 00:00:00 2001 From: David Vazgenovich Shakaryan Date: Tue, 20 Jan 2026 01:19:36 -0800 Subject: support clicking in scrollbar to move cursor/view --- main.lua | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 11 deletions(-) (limited to 'main.lua') diff --git a/main.lua b/main.lua index 9e8a888..1f93058 100644 --- a/main.lua +++ b/main.lua @@ -1044,18 +1044,24 @@ local function process_mouse_click(ev) return end - local line = osd:get_mouse_line(mouse_state.pos) - if line then - line = line - (osd.lines - osd:menu_lines(state)) + local area + local val = osd:mouse_scrollbar_ratio(mouse_state.pos) + if val then + area = 'scrollbar' + else + local line = osd:mouse_menu_line(mouse_state.pos) + if line then + area = 'menu' + val = line - (osd.lines - osd:menu_lines(state)) + end end - local key, dbl = handle_mouse_click(ev, line) - return key, dbl, line + local key, dbl = handle_mouse_click(ev, area == 'menu' and val or nil) + return key, dbl, area, val end -local function mouse_click_left(ev) - local key, dbl, line = process_mouse_click(ev) - if not key or not line or line == 0 then +local function mouse_click_left_menu(dbl, line) + if line == 0 then return end @@ -1091,9 +1097,32 @@ local function mouse_click_left(ev) end end -local function mouse_click_right(ev) - local key, dbl, line = process_mouse_click(ev) - if not key or not dbl or not line or line < 1 then +local function mouse_click_left_scrollbar(dbl, ratio) + if not dbl then + return + end + + -- set_cursor handles out-of-bounds moves (when ratio == 1) + set_cursor( + math.floor(ratio * #state:menu().options) + 1, + {centre = true}) +end + +local function mouse_click_left(ev) + local key, dbl, area, val = process_mouse_click(ev) + if not key then + return + end + + if area == 'menu' then + return mouse_click_left_menu(dbl, val) + elseif area == 'scrollbar' then + return mouse_click_left_scrollbar(dbl, val) + end +end + +local function mouse_click_right_menu(dbl, line) + if not dbl or line < 1 then return end @@ -1106,6 +1135,17 @@ local function mouse_click_right(ev) open_option_info(menu.options[pos]) end +local function mouse_click_right(ev) + local key, dbl, area, val = process_mouse_click(ev) + if not key then + return + end + + if area == 'menu' then + return mouse_click_right_menu(dbl, val) + end +end + local function reload_data() if state.depth > 1 then osd:flash_error('Can only reload data from root menu') -- cgit v1.2.3-70-g09d2