Merge lines.love

This commit is contained in:
Kartik K. Agaram 2024-07-09 22:17:44 -07:00
commit 10d875fbcc
6 changed files with 24 additions and 63 deletions

View File

@ -274,7 +274,7 @@ function edit.keychord_press(State, chord, key)
State.cursor1 = State.search_backup.cursor
State.screen_top1 = State.search_backup.screen_top
State.search_backup = nil
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
elseif chord == 'return' then
State.search_term = nil
State.search_backup = nil
@ -319,9 +319,7 @@ function edit.keychord_press(State, chord, key)
State.cursor1 = deepcopy(src.cursor)
State.selection1 = deepcopy(src.selection)
patch(State.lines, event.after, event.before)
patch_placeholders(State.line_cache, event.after, event.before)
-- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
schedule_save(State)
end
elseif chord == 'C-y' then
@ -332,8 +330,7 @@ function edit.keychord_press(State, chord, key)
State.cursor1 = deepcopy(src.cursor)
State.selection1 = deepcopy(src.selection)
patch(State.lines, event.before, event.after)
-- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
schedule_save(State)
end
-- clipboard

View File

@ -53,8 +53,7 @@ function edit.initialize_state(top, left, right, font, font_height, line_height)
-- rendering wrapped text lines needs some additional short-lived data per line:
-- startpos, the index of data the line starts rendering from, can only be >1 for topmost line on screen
-- fragments: snippets of the line guaranteed to not straddle screen lines
-- screen_line_starting_pos: optional array of grapheme indices if it wraps over more than one screen line
-- screen_line_starting_pos: optional array of codepoint indices if it wraps over more than one screen line
line_cache = {},
-- Given wrapping, any potential location for the text cursor can be described in two ways:
@ -400,7 +399,7 @@ function edit.keychord_press(State, chord, key)
State.cursor1 = State.search_backup.cursor
State.screen_top1 = State.search_backup.screen_top
State.search_backup = nil
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
elseif chord == 'return' then
State.search_term = nil
State.search_backup = nil
@ -442,11 +441,9 @@ function edit.keychord_press(State, chord, key)
State.cursor1 = deepcopy(src.cursor)
State.selection1 = deepcopy(src.selection)
patch(State.lines, event.after, event.before)
patch_placeholders(State.line_cache, event.after, event.before)
-- invalidate various cached bits of lines
State.lines.current_drawing = nil
-- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
schedule_save(State)
end
elseif chord == 'C-y' then
@ -459,8 +456,7 @@ function edit.keychord_press(State, chord, key)
patch(State.lines, event.before, event.after)
-- invalidate various cached bits of lines
State.lines.current_drawing = nil
-- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
schedule_save(State)
end
-- clipboard

View File

@ -289,7 +289,7 @@ function Text.keychord_press(State, chord)
line=State.cursor1.line,
pos=Text.pos_at_start_of_screen_line(State, State.cursor1),
}
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
Text.clear_screen_line_cache(State, State.cursor1.line)
assert(Text.le1(State.screen_top1, State.cursor1), ('screen_top (line=%d,pos=%d) is below cursor (line=%d,pos=%d)'):format(State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos))
@ -427,7 +427,7 @@ function Text.pageup(State)
State.screen_top1 = Text.previous_screen_top1(State)
State.cursor1 = deepcopy(State.screen_top1)
Text.move_cursor_down_to_next_text_line_while_scrolling_again_if_necessary(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
-- return the top y coordinate of a given line_index,
@ -476,7 +476,7 @@ function Text.pagedown(State)
State.screen_top1 = Text.screen_bottom1(State)
State.cursor1 = deepcopy(State.screen_top1)
Text.move_cursor_down_to_next_text_line_while_scrolling_again_if_necessary(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
-- return the location of the start of the bottom-most line on screen
@ -538,7 +538,7 @@ function Text.up(State)
line=State.cursor1.line,
pos=Text.pos_at_start_of_screen_line(State, State.cursor1),
}
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
end
@ -684,7 +684,7 @@ function Text.left(State)
line=State.cursor1.line,
pos=Text.pos_at_start_of_screen_line(State, State.cursor1),
}
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
end
@ -829,7 +829,7 @@ function Text.snap_cursor_to_bottom_of_screen(State)
State.screen_top1 = Text.to1(State, top2)
--? print('top1 finally:', State.screen_top1.line, State.screen_top1.pos)
--? print('snap =>', State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos)
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
function Text.in_line(State, line_index, x,y)
@ -1118,7 +1118,7 @@ function Text.cursor_out_of_screen(State)
end
function Text.redraw_all(State)
--? print('clearing fragments')
--? print('clearing line caches')
-- Perform some early sanity checking here, in hopes that we correctly call
-- this whenever we change editor state.
if State.right <= State.left then

View File

@ -57,16 +57,8 @@ function snapshot(State, s,e)
end_line=e,
-- no filename; undo history is cleared when filename changes
}
-- deep copy lines without cached stuff like text fragments
for i=s,e do
local line = State.lines[i]
if line.mode == 'text' then
table.insert(event.lines, {mode='text', data=line.data}) -- I've forgotten: should we deepcopy(line.data)?
elseif line.mode == 'drawing' then
table.insert(event.lines, {mode='drawing', h=line.h, points=deepcopy(line.points), shapes=deepcopy(line.shapes), pending={}})
else
assert(false, ('unknown line mode %s'):format(line.mode))
end
table.insert(event.lines, deepcopy(State.lines[i]))
end
return event
end
@ -89,17 +81,6 @@ function patch(lines, from, to)
end
end
function patch_placeholders(line_cache, from, to)
assert(from.start_line == to.start_line, 'failed to patch undo operation')
for i=from.end_line,from.start_line,-1 do
table.remove(line_cache, i)
end
assert(#to.lines == to.end_line-to.start_line+1, 'failed to patch undo operation')
for i=1,#to.lines do
table.insert(line_cache, to.start_line+i-1, {})
end
end
-- https://stackoverflow.com/questions/640642/how-do-you-copy-a-lua-table-by-value/26367080#26367080
function deepcopy(obj, seen)
if type(obj) ~= 'table' then return obj end

View File

@ -47,7 +47,7 @@ function Text.draw(State, line_index, y, startpos)
end
end
end
-- render fragment
-- render screen line
App.color(Text_color)
App.screen.print(screen_line, State.left,y)
y = y + State.line_height
@ -208,7 +208,7 @@ function Text.keychord_press(State, chord)
line=State.cursor1.line,
pos=Text.pos_at_start_of_screen_line(State, State.cursor1),
}
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
Text.clear_screen_line_cache(State, State.cursor1.line)
assert(Text.le1(State.screen_top1, State.cursor1), ('screen_top (line=%d,pos=%d) is below cursor (line=%d,pos=%d)'):format(State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos))
@ -344,7 +344,7 @@ function Text.pageup(State)
State.screen_top1 = Text.previous_screen_top1(State)
State.cursor1 = deepcopy(State.screen_top1)
Text.move_cursor_down_to_next_text_line_while_scrolling_again_if_necessary(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
-- return the top y coordinate of a given line_index,
@ -382,7 +382,7 @@ function Text.pagedown(State)
State.screen_top1 = Text.screen_bottom1(State)
State.cursor1 = deepcopy(State.screen_top1)
Text.move_cursor_down_to_next_text_line_while_scrolling_again_if_necessary(State)
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
-- return the location of the start of the bottom-most line on screen
@ -435,7 +435,7 @@ function Text.up(State)
line=State.cursor1.line,
pos=Text.pos_at_start_of_screen_line(State, State.cursor1),
}
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
end
@ -564,7 +564,7 @@ function Text.left(State)
line=State.cursor1.line,
pos=Text.pos_at_start_of_screen_line(State, State.cursor1),
}
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
end
@ -658,7 +658,7 @@ function Text.snap_cursor_to_bottom_of_screen(State)
State.screen_top1 = Text.to1(State, top2)
--? print('top1 finally:', State.screen_top1.line, State.screen_top1.pos)
--? print('snap =>', State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos)
Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks
Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks
end
function Text.in_line(State, line_index, x,y)
@ -939,7 +939,7 @@ function Text.cursor_out_of_screen(State)
end
function Text.redraw_all(State)
--? print('clearing fragments')
--? print('clearing line caches')
-- Perform some early sanity checking here, in hopes that we correctly call
-- this whenever we change editor state.
if State.right <= State.left then

View File

@ -55,10 +55,8 @@ function snapshot(State, s,e)
end_line=e,
-- no filename; undo history is cleared when filename changes
}
-- deep copy lines without cached stuff like text fragments
for i=s,e do
local line = State.lines[i]
table.insert(event.lines, {data=line.data}) -- I've forgotten: should we deepcopy(line.data)?
table.insert(event.lines, deepcopy(State.lines[i]))
end
return event
end
@ -81,17 +79,6 @@ function patch(lines, from, to)
end
end
function patch_placeholders(line_cache, from, to)
assert(from.start_line == to.start_line, 'failed to patch undo operation')
for i=from.end_line,from.start_line,-1 do
table.remove(line_cache, i)
end
assert(#to.lines == to.end_line-to.start_line+1, 'failed to patch undo operation')
for i=1,#to.lines do
table.insert(line_cache, to.start_line+i-1, {})
end
end
-- https://stackoverflow.com/questions/640642/how-do-you-copy-a-lua-table-by-value/26367080#26367080
function deepcopy(obj, seen)
if type(obj) ~= 'table' then return obj end