more robust state validation
This commit is contained in:
parent
224e8fe85a
commit
e2c1bbe4e5
26
edit.lua
26
edit.lua
|
@ -109,10 +109,32 @@ function edit.initialize_state(top, left, right, font_height, line_height) -- c
|
||||||
return result
|
return result
|
||||||
end -- App.initialize_state
|
end -- App.initialize_state
|
||||||
|
|
||||||
function edit.fixup_cursor(State)
|
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 not edit.cursor_on_text(State)
|
||||||
|
or not Text.le1(State.screen_top1, State.cursor1) then
|
||||||
|
State.screen_top1 = {line=1, pos=1}
|
||||||
|
edit.put_cursor_on_first_text_line(State)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function edit.invalid1(State, loc1)
|
||||||
|
return loc1.line > #State.lines
|
||||||
|
or loc1.pos > #State.lines[loc1.line].data
|
||||||
|
end
|
||||||
|
|
||||||
|
function edit.cursor_on_text(State)
|
||||||
|
return State.cursor1.line <= #State.lines
|
||||||
|
and State.lines[State.cursor1.line].mode == 'text'
|
||||||
|
end
|
||||||
|
|
||||||
|
function edit.put_cursor_on_first_text_line(State)
|
||||||
for i,line in ipairs(State.lines) do
|
for i,line in ipairs(State.lines) do
|
||||||
if line.mode == 'text' then
|
if line.mode == 'text' then
|
||||||
State.cursor1.line = i
|
State.cursor1 = {line=i, pos=1}
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
7
run.lua
7
run.lua
|
@ -28,14 +28,11 @@ function run.initialize(arg)
|
||||||
Text.redraw_all(Editor_state)
|
Text.redraw_all(Editor_state)
|
||||||
Editor_state.screen_top1 = {line=1, pos=1}
|
Editor_state.screen_top1 = {line=1, pos=1}
|
||||||
Editor_state.cursor1 = {line=1, pos=1}
|
Editor_state.cursor1 = {line=1, pos=1}
|
||||||
edit.fixup_cursor(Editor_state)
|
|
||||||
else
|
else
|
||||||
load_from_disk(Editor_state)
|
load_from_disk(Editor_state)
|
||||||
Text.redraw_all(Editor_state)
|
Text.redraw_all(Editor_state)
|
||||||
if Editor_state.cursor1.line > #Editor_state.lines or Editor_state.lines[Editor_state.cursor1.line].mode ~= 'text' then
|
|
||||||
edit.fixup_cursor(Editor_state)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
edit.check_locs(Editor_state)
|
||||||
love.window.setTitle('lines.love - '..Editor_state.filename)
|
love.window.setTitle('lines.love - '..Editor_state.filename)
|
||||||
|
|
||||||
if #arg > 1 then
|
if #arg > 1 then
|
||||||
|
@ -112,7 +109,7 @@ function run.file_drop(file)
|
||||||
Editor_state.lines = load_from_file(file)
|
Editor_state.lines = load_from_file(file)
|
||||||
file:close()
|
file:close()
|
||||||
Text.redraw_all(Editor_state)
|
Text.redraw_all(Editor_state)
|
||||||
edit.fixup_cursor(Editor_state)
|
edit.check_locs(Editor_state)
|
||||||
love.window.setTitle('lines.love - '..Editor_state.filename)
|
love.window.setTitle('lines.love - '..Editor_state.filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue