From 14c08f9bd9a45d2f05727ea47b128afdbdff1d24 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Thu, 8 Jun 2023 01:02:54 -0700 Subject: [PATCH] several bugfixes in saving/loading cursor position --- Manual_tests.md | 4 ++++ edit.lua | 12 +++++++++++- run.lua | 15 +++++++++------ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Manual_tests.md b/Manual_tests.md index 4318496..4f74480 100644 --- a/Manual_tests.md +++ b/Manual_tests.md @@ -5,6 +5,10 @@ record those here. Initializing settings: - delete app settings, start; window opens running the text editor + - run with a filename on commandline, scroll around, quit; restart without a filename; window opens running the text editor in same position+dimensions + - run with a filename on commandline, scroll around, quit; restart with same filename; window opens running the text editor in same position+dimensions + - run with a filename on commandline, scroll around, quit; restart with new filename; window opens new filename with cursor up top + - run editor, scroll around, move cursor to end of some line, quit; restart with new filename; window opens running the text editor in same position+dimensions - quit while running the text editor, restart; window opens running the text editor in same position+dimensions - quit while editing source (color; no drawings; no selection), restart; window opens editing source in same position+dimensions - start out running the text editor, move window, press ctrl+e twice; window is running text editor in same position+dimensions diff --git a/edit.lua b/edit.lua index 442b986..ef1cda4 100644 --- a/edit.lua +++ b/edit.lua @@ -109,7 +109,7 @@ function edit.check_locs(State) -- if State is inconsistent (i.e. file changed by some other program), -- throw away all cursor state entirely if edit.invalid1(State, State.screen_top1) - or edit.invalid1(State, State.cursor1) + or edit.invalid_cursor1(State) or not edit.cursor_on_text(State) or not Text.le1(State.screen_top1, State.cursor1) then State.screen_top1 = {line=1, pos=1} @@ -124,6 +124,16 @@ function edit.invalid1(State, loc1) return loc1.pos > #State.lines[loc1.line].data end +-- cursor loc in particular differs from other locs in one way: +-- pos might occur just after end of line +function edit.invalid_cursor1(State) + local cursor1 = State.cursor1 + if cursor1.line > #State.lines then return true end + local l = State.lines[cursor1.line] + if l.mode ~= 'text' then return false end -- pos is irrelevant to validity for a drawing line + return cursor1.pos > #State.lines[cursor1.line].data + 1 +end + function edit.cursor_on_text(State) return State.cursor1.line <= #State.lines and State.lines[State.cursor1.line].mode == 'text' diff --git a/run.lua b/run.lua index 5f35a0b..f0482e0 100644 --- a/run.lua +++ b/run.lua @@ -19,7 +19,7 @@ function run.initialize(arg) run.initialize_default_settings() end - if #arg > 0 then + if #arg > 0 and Editor_state.filename ~= absolutize(arg[1]) then Editor_state.filename = arg[1] load_from_disk(Editor_state) Text.redraw_all(Editor_state) @@ -154,19 +154,22 @@ function run.settings() if Current_app == 'run' then Settings.x, Settings.y, Settings.displayindex = App.screen.position() end - local filename = Editor_state.filename - if is_relative_path(filename) then - filename = love.filesystem.getWorkingDirectory()..'/'..filename -- '/' should work even on Windows - end return { x=Settings.x, y=Settings.y, displayindex=Settings.displayindex, width=App.screen.width, height=App.screen.height, font_height=Editor_state.font_height, - filename=filename, + filename=absolutize(Editor_state.filename), screen_top=Editor_state.screen_top1, cursor=Editor_state.cursor1 } end +function absolutize(path) + if is_relative_path(path) then + return love.filesystem.getWorkingDirectory()..'/'..path -- '/' should work even on Windows + end + return path +end + function run.mouse_press(x,y, mouse_button) Cursor_time = 0 -- ensure cursor is visible immediately after it moves return edit.mouse_press(Editor_state, x,y, mouse_button)