From 8a4ecda94074c27501b52bbc6e7d44828f5e4f7a Mon Sep 17 00:00:00 2001 From: Guido Cella Date: Thu, 21 Mar 2024 20:09:22 +0100 Subject: [PATCH] stats.lua: filter input bindings by typing them This lets you press / in page 4 of the stats and type a keybinding or part of its command to filter it by using mp.input. This works badly without a VO because both stats.lua and console.lua use show-text and only one can be displayed at a time, but it's still better than not having the search available at all. --- DOCS/man/stats.rst | 5 ++++ player/lua/stats.lua | 69 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/DOCS/man/stats.rst b/DOCS/man/stats.rst index 58cae9a0b1..a5cd3b3d91 100644 --- a/DOCS/man/stats.rst +++ b/DOCS/man/stats.rst @@ -35,6 +35,9 @@ UP Scroll one line up DOWN Scroll one line down ==== ================== +Page 4 also binds ``/`` to search for input bindings by typing part of a binding +or command. + Configuration ------------- @@ -62,6 +65,8 @@ Configurable Options Default: UP ``key_scroll_down`` Default: DOWN +``key_scroll_search`` + Default: / ``scroll_lines`` Default: 1 diff --git a/player/lua/stats.lua b/player/lua/stats.lua index d07e4dc123..44bda01e18 100644 --- a/player/lua/stats.lua +++ b/player/lua/stats.lua @@ -9,6 +9,7 @@ local mp = require 'mp' local options = require 'mp.options' local utils = require 'mp.utils' +local input = require 'mp.input' -- Options local o = { @@ -21,6 +22,7 @@ local o = { -- For pages which support scrolling key_scroll_up = "UP", key_scroll_down = "DOWN", + key_search = "/", scroll_lines = 1, duration = 4, @@ -108,6 +110,7 @@ local cache_recorder_timer = nil local curr_page = o.key_page_1 local pages = {} local scroll_bound = false +local searched_text local tm_viz_prev = nil -- Save these sequences locally as we'll need them a lot local ass_start = mp.get_property_osd("osd-ass-cc/0") @@ -289,8 +292,12 @@ local function sorted_keys(t, comp_fn) return keys end -local function scroll_hint() - local hint = format("(hint: scroll with %s/%s)", o.key_scroll_up, o.key_scroll_down) +local function scroll_hint(search) + local hint = format("(hint: scroll with %s/%s", o.key_scroll_up, o.key_scroll_down) + if search then + hint = hint .. " and search with " .. o.key_search + end + hint = hint .. ")" if not o.use_ass then return " " .. hint end return format(" {\\fs%s}%s{\\fs%s}", o.font_size * 0.66, hint, o.font_size) end @@ -444,6 +451,11 @@ local function get_kbinfo_lines() (bind.is_weak == active[bind.key].is_weak and bind.priority > active[bind.key].priority) ) and not bind.cmd:find("script-binding stats/__forced_", 1, true) + and bind.section ~= "input_forced_console" + and ( + searched_text == nil or + (bind.key .. bind.cmd):lower():find(searched_text, 1, true) + ) then active[bind.key] = bind end @@ -1122,7 +1134,7 @@ local function keybinding_info(after_scroll, bindlist) local page = pages[o.key_page_4] eval_ass_formatting() add_header(header) - append(header, "", {prefix=format("%s:%s", page.desc, scroll_hint()), nl="", indent=""}) + append(header, "", {prefix=format("%s:%s", page.desc, scroll_hint(true)), nl="", indent=""}) header = {table.concat(header)} if not kbinfo_lines or not after_scroll then @@ -1351,12 +1363,58 @@ local function unbind_scroll() scroll_bound = false end end + +local function filter_bindings() + input.get({ + prompt = "Filter bindings:", + opened = function () + -- This is necessary to close the console if the oneshot + -- display_timer expires without typing anything. + searched_text = "" + end, + edited = function (text) + reset_scroll_offsets() + searched_text = text:lower() + print_page(curr_page) + if display_timer.oneshot then + display_timer:kill() + display_timer:resume() + end + end, + submit = input.terminate, + closed = function () + searched_text = nil + if display_timer:is_enabled() then + print_page(curr_page) + if display_timer.oneshot then + display_timer:kill() + display_timer:resume() + end + end + end, + }) +end + +local function bind_search() + mp.add_forced_key_binding(o.key_search, "__forced_"..o.key_search, filter_bindings) +end + +local function unbind_search() + mp.remove_key_binding("__forced_"..o.key_search) +end + local function update_scroll_bindings(k) if pages[k].scroll then bind_scroll() else unbind_scroll() end + + if k == o.key_page_4 then + bind_search() + else + unbind_search() + end end -- Add keybindings for every page @@ -1383,6 +1441,7 @@ local function remove_page_bindings() mp.remove_key_binding("__forced_"..k) end unbind_scroll() + unbind_search() end @@ -1445,6 +1504,10 @@ display_timer = mp.add_periodic_timer(o.duration, function() if display_timer.oneshot then display_timer:kill() ; clear_screen() ; remove_page_bindings() + -- Close the console only if it was opened for searching bindings. + if searched_text then + input.terminate() + end else print_page(curr_page) end