about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2023-06-08 01:02:54 -0700
committerKartik K. Agaram <vc@akkartik.com>2023-06-08 01:02:54 -0700
commit14c08f9bd9a45d2f05727ea47b128afdbdff1d24 (patch)
tree3e146695f66458990d2c07602a728faf0e3aa46c
parent68eaba7d3db72dda06c4504ec744f1d2f47f994c (diff)
downloadtext.love-14c08f9bd9a45d2f05727ea47b128afdbdff1d24.tar.gz
several bugfixes in saving/loading cursor position
-rw-r--r--Manual_tests.md4
-rw-r--r--edit.lua12
-rw-r--r--run.lua15
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)