From 675d1cbbdf026313d682086e1652a69540f18334 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 17 Mar 2023 21:52:35 -0700 Subject: [PATCH] bugfix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks Mikoláš Štrajt. --- source_text.lua | 23 ++++++++++++++--------- source_text_tests.lua | 22 ++++++++++++++++++++++ text.lua | 23 ++++++++++++++--------- text_tests.lua | 22 ++++++++++++++++++++++ 4 files changed, 72 insertions(+), 18 deletions(-) diff --git a/source_text.lua b/source_text.lua index 4cf3edd..1c91f28 100644 --- a/source_text.lua +++ b/source_text.lua @@ -247,9 +247,10 @@ function Text.keychord_press(State, chord) local line_cache = State.line_cache[#State.line_cache] State.screen_top1 = {line=#State.lines, pos=line_cache.screen_line_starting_pos[#line_cache.screen_line_starting_pos]} elseif Text.lt1(State.cursor1, State.screen_top1) then - local top2 = Text.to2(State, State.screen_top1) - top2 = Text.previous_screen_line(State, top2, State.left, State.right) - State.screen_top1 = Text.to1(State, top2) + State.screen_top1 = { + 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 end Text.clear_screen_line_cache(State, State.cursor1.line) @@ -465,9 +466,11 @@ function Text.up(State) --? print('cursor pos is now '..tostring(State.cursor1.pos)) end if Text.lt1(State.cursor1, State.screen_top1) then - local top2 = Text.to2(State, State.screen_top1) - top2 = Text.previous_screen_line(State, top2) - State.screen_top1 = Text.to1(State, top2) + State.screen_top1 = { + 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 end end @@ -606,9 +609,11 @@ function Text.left(State) end end if Text.lt1(State.cursor1, State.screen_top1) then - local top2 = Text.to2(State, State.screen_top1) - top2 = Text.previous_screen_line(State, top2) - State.screen_top1 = Text.to1(State, top2) + State.screen_top1 = { + 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 end end diff --git a/source_text_tests.lua b/source_text_tests.lua index 2385325..7a7d71c 100644 --- a/source_text_tests.lua +++ b/source_text_tests.lua @@ -1251,6 +1251,28 @@ function test_up_arrow_scrolls_up_by_one_line() App.screen.check(y, 'ghi', 'screen:3') end +function test_up_arrow_scrolls_up_by_one_line_skipping_drawing() + -- display lines 3/4/5 with a drawing just off screen at line 2 + App.screen.init{width=120, height=60} + Editor_state = edit.initialize_test_state() + Editor_state.lines = load_array{'abc', '```lines', '```', 'def', 'ghi', 'jkl'} + Text.redraw_all(Editor_state) + Editor_state.cursor1 = {line=3, pos=1} + Editor_state.screen_top1 = {line=3, pos=1} + Editor_state.screen_bottom1 = {} + edit.draw(Editor_state) + local y = Editor_state.top + App.screen.check(y, 'def', 'baseline/screen:1') + y = y + Editor_state.line_height + App.screen.check(y, 'ghi', 'baseline/screen:2') + y = y + Editor_state.line_height + App.screen.check(y, 'jkl', 'baseline/screen:3') + -- after hitting the up arrow the screen scrolls up to previous text line + edit.run_after_keychord(Editor_state, 'up') + check_eq(Editor_state.screen_top1.line, 1, 'screen_top') + check_eq(Editor_state.cursor1.line, 1, 'cursor') +end + function test_up_arrow_scrolls_up_by_one_screen_line() -- display lines starting from second screen line of a line App.screen.init{width=Editor_state.left+30, height=60} diff --git a/text.lua b/text.lua index 1267699..6a1ef2d 100644 --- a/text.lua +++ b/text.lua @@ -230,9 +230,10 @@ function Text.keychord_press(State, chord) local line_cache = State.line_cache[#State.line_cache] State.screen_top1 = {line=#State.lines, pos=line_cache.screen_line_starting_pos[#line_cache.screen_line_starting_pos]} elseif Text.lt1(State.cursor1, State.screen_top1) then - local top2 = Text.to2(State, State.screen_top1) - top2 = Text.previous_screen_line(State, top2, State.left, State.right) - State.screen_top1 = Text.to1(State, top2) + State.screen_top1 = { + 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 end Text.clear_screen_line_cache(State, State.cursor1.line) @@ -448,9 +449,11 @@ function Text.up(State) --? print('cursor pos is now '..tostring(State.cursor1.pos)) end if Text.lt1(State.cursor1, State.screen_top1) then - local top2 = Text.to2(State, State.screen_top1) - top2 = Text.previous_screen_line(State, top2) - State.screen_top1 = Text.to1(State, top2) + State.screen_top1 = { + 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 end end @@ -589,9 +592,11 @@ function Text.left(State) end end if Text.lt1(State.cursor1, State.screen_top1) then - local top2 = Text.to2(State, State.screen_top1) - top2 = Text.previous_screen_line(State, top2) - State.screen_top1 = Text.to1(State, top2) + State.screen_top1 = { + 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 end end diff --git a/text_tests.lua b/text_tests.lua index d08848a..7cf980b 100644 --- a/text_tests.lua +++ b/text_tests.lua @@ -1281,6 +1281,28 @@ function test_up_arrow_scrolls_up_by_one_line() App.screen.check(y, 'ghi', 'screen:3') end +function test_up_arrow_scrolls_up_by_one_line_skipping_drawing() + -- display lines 3/4/5 with a drawing just off screen at line 2 + App.screen.init{width=120, height=60} + Editor_state = edit.initialize_test_state() + Editor_state.lines = load_array{'abc', '```lines', '```', 'def', 'ghi', 'jkl'} + Text.redraw_all(Editor_state) + Editor_state.cursor1 = {line=3, pos=1} + Editor_state.screen_top1 = {line=3, pos=1} + Editor_state.screen_bottom1 = {} + edit.draw(Editor_state) + local y = Editor_state.top + App.screen.check(y, 'def', 'baseline/screen:1') + y = y + Editor_state.line_height + App.screen.check(y, 'ghi', 'baseline/screen:2') + y = y + Editor_state.line_height + App.screen.check(y, 'jkl', 'baseline/screen:3') + -- after hitting the up arrow the screen scrolls up to previous text line + edit.run_after_keychord(Editor_state, 'up') + check_eq(Editor_state.screen_top1.line, 1, 'screen_top') + check_eq(Editor_state.cursor1.line, 1, 'cursor') +end + function test_up_arrow_scrolls_up_by_one_screen_line() -- display lines starting from second screen line of a line App.screen.init{width=Editor_state.left+30, height=60}