From 90e195dd64f0f3f1201c408882f6e35a494a37c2 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 1 Mar 2024 17:52:16 -0800 Subject: [PATCH] simplify the palette state machine --- commands.lua | 76 +++++++++++++++++++++++++--------------------------- run.lua | 24 +++++++---------- text.lua | 2 +- 3 files changed, 47 insertions(+), 55 deletions(-) diff --git a/commands.lua b/commands.lua index 0850fd5..830e965 100644 --- a/commands.lua +++ b/commands.lua @@ -129,7 +129,7 @@ function draw_menu_bar() love.graphics.rectangle('fill', 0,0, App.screen.width, Menu_status_bar_height) App.color(Menu_border_color) love.graphics.rectangle('line', 0,0, App.screen.width, Menu_status_bar_height) - if Display_settings.show_palette then + if Display_settings.palette then -- TODO: continue to put shortcuts on the menu bar, enter commands/search strings one row down return end @@ -195,41 +195,37 @@ end function keychord_press_on_command_palette(chord, key) if chord == 'escape' then -- forget text for next command - Display_settings.palette_command = '' - Display_settings.show_palette = false - Display_settings.palette_alternative_index = 1 - Display_settings.palette_candidates = nil + Display_settings.palette = nil elseif chord == 'backspace' then - local len = utf8.len(Display_settings.palette_command) - local byte_offset = Text.offset(Display_settings.palette_command, len) - Display_settings.palette_command = string.sub(Display_settings.palette_command, 1, byte_offset-1) - Display_settings.palette_alternative_index = 1 - Display_settings.palette_candidates = candidates() + local len = utf8.len(Display_settings.palette.command) + local byte_offset = Text.offset(Display_settings.palette.command, len) + Display_settings.palette.command = string.sub(Display_settings.palette.command, 1, byte_offset-1) + Display_settings.palette.alternative_index = 1 + Display_settings.palette.candidates = candidates() elseif chord == 'tab' then -- select top candidate, but don't submit - local candidates = Display_settings.palette_candidates - Display_settings.palette_command = command_string(candidates[Display_settings.palette_alternative_index]) + local p = Display_settings.palette + p.command = command_string(p.candidates[p.alternative_index]) elseif chord == 'C-v' then - Display_settings.palette_command = Display_settings.palette_command..App.get_clipboard() - Display_settings.palette_candidates = candidates() + local p = Display_settings.palette + p.command = p.command..App.get_clipboard() + p.candidates = candidates() elseif chord == 'return' then -- submit selected candidate - local candidates = Display_settings.palette_candidates - if #candidates > 0 then - if file_exists(Directory..candidates[Display_settings.palette_alternative_index]) then - command.open_file_in_next_column(candidates[Display_settings.palette_alternative_index]) + local p = Display_settings.palette + local candidates = Display_settings.palette.candidates + if #p.candidates > 0 then + if file_exists(Directory..p.candidates[p.alternative_index]) then + command.open_file_in_next_column(p.candidates[p.alternative_index]) else - run_command(command_string(candidates[Display_settings.palette_alternative_index])) + run_command(command_string(p.candidates[p.alternative_index])) end else -- try to run the command as if it contains args - run_command_with_args(Display_settings.palette_command) + run_command_with_args(p.command) end -- forget text for next command - Display_settings.palette_command = '' - Display_settings.show_palette = false - Display_settings.palette_alternative_index = 1 - Display_settings.palette_candidates = nil + Display_settings.palette = nil -- clean up some columns if possible if Cursor_pane.col < 45 then while #Surface > 50 do @@ -238,20 +234,20 @@ function keychord_press_on_command_palette(chord, key) end end elseif chord == 'up' then - if Display_settings.palette_alternative_index > 1 then - Display_settings.palette_alternative_index = Display_settings.palette_alternative_index-1 + if Display_settings.palette.alternative_index > 1 then + Display_settings.palette.alternative_index = Display_settings.palette.alternative_index-1 end elseif chord == 'down' then - if Display_settings.palette_alternative_index < #Display_settings.palette_candidates then - Display_settings.palette_alternative_index = Display_settings.palette_alternative_index+1 + if Display_settings.palette.alternative_index < #Display_settings.palette.candidates then + Display_settings.palette.alternative_index = Display_settings.palette.alternative_index+1 end elseif chord == 'left' then - if Display_settings.palette_alternative_index > Palette_alternatives_height then - Display_settings.palette_alternative_index = Display_settings.palette_alternative_index-Palette_alternatives_height + if Display_settings.palette.alternative_index > Palette_alternatives_height then + Display_settings.palette.alternative_index = Display_settings.palette.alternative_index-Palette_alternatives_height end elseif chord == 'right' then - if Display_settings.palette_alternative_index <= #Display_settings.palette_candidates-Palette_alternatives_height then - Display_settings.palette_alternative_index = Display_settings.palette_alternative_index+Palette_alternatives_height + if Display_settings.palette.alternative_index <= #Display_settings.palette.candidates-Palette_alternatives_height then + Display_settings.palette.alternative_index = Display_settings.palette.alternative_index+Palette_alternatives_height end end end @@ -276,8 +272,8 @@ function draw_command_palette() App.color(Command_palette_border_color) love.graphics.rectangle('line', 0, Menu_status_bar_height, App.screen.width, 5+Palette_alternatives_height*Line_height+5) Palette_cursor = {y=Menu_status_bar_height+5, x=5, nextx=5} - for i,cmd in ipairs(Display_settings.palette_candidates) do - add_command_to_palette(cmd, i == Display_settings.palette_alternative_index) + for i,cmd in ipairs(Display_settings.palette.candidates) do + add_command_to_palette(cmd, i == Display_settings.palette.alternative_index) end end @@ -330,8 +326,8 @@ function add_command_to_palette(s, cursor_highlight) end function draw_palette_input(x, y) - love.graphics.print(Display_settings.palette_command, x,y) - x = x+Display_settings.font:getWidth(Display_settings.palette_command) + love.graphics.print(Display_settings.palette.command, x,y) + x = x+Display_settings.font:getWidth(Display_settings.palette.command) draw_cursor(x, y) end @@ -346,14 +342,14 @@ end function candidates() -- slight context-sensitive tweaks local candidates = initial_candidates() - if Display_settings.palette_command == '' then + if Display_settings.palette.command == '' then return candidates - elseif Display_settings.palette_command:sub(1,1) == '/' then + elseif Display_settings.palette.command:sub(1,1) == '/' then return {} else - local results = filter_candidates(candidates, Display_settings.palette_command) + local results = filter_candidates(candidates, Display_settings.palette.command) if Display_settings.mode == 'normal' then - append(results, file_candidates(Display_settings.palette_command)) + append(results, file_candidates(Display_settings.palette.command)) end return results end diff --git a/run.lua b/run.lua index ac06e57..b66f6fd 100644 --- a/run.lua +++ b/run.lua @@ -71,9 +71,7 @@ function run.initialize_globals() x=0, y=0, -- <==== Top-left corner of the viewport into the surface column_width=400, show_debug=false, - show_palette=false, - palette_command='', - palette_alternative_index=1, palette_candidates=nil, + palette=nil, -- {command='', alternative_index=1, candidates=nil} search_term='', search_backup_x=nil, search_backup_y=nil, search_backup_cursor_pane=nil, search_all_query=nil, search_all_terms=nil, @@ -457,7 +455,7 @@ function run.draw() if Display_settings.mode == 'search_all' or Display_settings.mode == 'searching_all' then draw_command_palette_for_search_all() else - if Display_settings.show_palette then + if Display_settings.palette then draw_command_palette() else show_error() @@ -596,7 +594,7 @@ function run.update(dt) edit.update(pane, dt) end end - if not Display_settings.show_palette and (Display_settings.mode == 'normal' or Display_settings.mode == 'search') and App.mouse_down(1) then + if not Display_settings.palette and (Display_settings.mode == 'normal' or Display_settings.mode == 'search') and App.mouse_down(1) then -- pan the surface by dragging plan_draw() end @@ -817,10 +815,10 @@ function run.text_input(t) Cursor_time = 0 -- ensure cursor is visible immediately after it moves --? print('textinput', t) -- hotkeys operating on the cursor pane - if Display_settings.show_palette then - Display_settings.palette_command = Display_settings.palette_command..t - Display_settings.palette_alternative_index = 1 - Display_settings.palette_candidates = candidates() + if Display_settings.palette then + Display_settings.palette.command = Display_settings.palette.command..t + Display_settings.palette.alternative_index = 1 + Display_settings.palette.candidates = candidates() elseif Display_settings.mode == 'normal' then if Cursor_pane.col >= 1 then local pane = Surface[Cursor_pane.col][Cursor_pane.row] @@ -893,12 +891,11 @@ function run.keychord_press(chord, key) elseif chord == 'C-0' then update_font_settings(20) -- mode-specific hotkeys - elseif Display_settings.show_palette then + elseif Display_settings.palette then keychord_press_on_command_palette(chord, key) elseif Display_settings.mode == 'normal' then if chord == 'C-return' then - Display_settings.show_palette = true - Display_settings.palette_candidates = candidates() + Display_settings.palette = {command='', alternative_index=1, candidates = initial_candidates()} elseif chord == 'C-f' then command.commence_find_on_surface() elseif Cursor_pane.col >= 1 then @@ -943,8 +940,7 @@ function run.keychord_press(chord, key) interrupt_search_all() elseif Display_settings.mode == 'maximize' then if chord == 'C-return' then - Display_settings.show_palette = true - Display_settings.palette_candidates = candidates() + Display_settings.palette = {command='', alternative_index=1, candidates = initial_candidates()} else keychord_press_in_maximize_mode(chord, key) end diff --git a/text.lua b/text.lua index 3cc8fd1..267ebb5 100644 --- a/text.lua +++ b/text.lua @@ -93,7 +93,7 @@ function Text.draw_cursor(State, x, y, force) if not State.editable and not force then return end - if Display_settings.show_palette then return end + if Display_settings.palette then return end -- blink every 0.5s if math.floor(Cursor_time*2)%2 == 0 then App.color(Cursor_color)