From 1d12a7fe7de103e9301f51a574a3c6fccbad9e98 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 23 Sep 2017 16:02:34 -0400 Subject: [PATCH] BufferView: fix more scrolling problems --- src/core/BufferView.cc | 8 +++++-- test/src/test_BufferView.cc | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/core/BufferView.cc b/src/core/BufferView.cc index 3878c3a..e7cceae 100644 --- a/src/core/BufferView.cc +++ b/src/core/BufferView.cc @@ -195,6 +195,7 @@ bool BufferView::cursor_move(CursorMovement which, bool allow_eol) void BufferView::scroll_view_up(int n_lines, bool allow_eol) { + int orig_cursor_screen_row = m_cursor_screen_row; int so = effective_scroll_offset(); int rows_to_move_cursor = (so + n_lines) - (m_height - m_cursor_screen_row - 1); rows_to_move_cursor = std::min(calculate_rows_above_screen(rows_to_move_cursor), rows_to_move_cursor); @@ -204,17 +205,19 @@ void BufferView::scroll_view_up(int n_lines, bool allow_eol) if (move_cursor_screen_row_up(allow_eol)) { actual_lines_moved++; + update(); } else { break; } } - m_cursor_screen_row += (n_lines - actual_lines_moved); + m_cursor_screen_row = orig_cursor_screen_row + (n_lines - actual_lines_moved); } void BufferView::scroll_view_down(int n_lines, bool allow_eol) { + int orig_cursor_screen_row = m_cursor_screen_row; int so = effective_scroll_offset(); int rows_to_move_cursor = (so + n_lines) - m_cursor_screen_row; rows_to_move_cursor = std::min(calculate_rows_below_screen(rows_to_move_cursor), rows_to_move_cursor); @@ -224,13 +227,14 @@ void BufferView::scroll_view_down(int n_lines, bool allow_eol) if (move_cursor_screen_row_down(allow_eol)) { actual_lines_moved++; + update(); } else { break; } } - m_cursor_screen_row -= (n_lines - actual_lines_moved); + m_cursor_screen_row = orig_cursor_screen_row - (n_lines - actual_lines_moved); } /************************************************************************** diff --git a/test/src/test_BufferView.cc b/test/src/test_BufferView.cc index 364e132..6d083f1 100644 --- a/test/src/test_BufferView.cc +++ b/test/src/test_BufferView.cc @@ -592,6 +592,49 @@ TEST(BufferViewTest, scrolls_the_view_up_and_down) EXPECT_EQ(5, bv.cursor_screen_row()); } +TEST(BufferViewTest, scrolls_the_view_up_and_down_with_wrapped_lines) +{ + auto b = buffer1(); + auto iterator = b->add_iterator(); + BufferView bv(b, iterator, Cwd); + bv.resize(4, 2); + bv.update(); + EXPECT_EQ(0, LineNumber(iterator)); + EXPECT_EQ(0, bv.cursor_screen_row()); + bv.scroll_view_down(6, false); + bv.update(); + EXPECT_EQ(6, LineNumber(iterator)); + EXPECT_EQ(C('6'), **iterator); + EXPECT_EQ(0, bv.cursor_screen_row()); + bv.scroll_view_down(1, false); + bv.update(); + EXPECT_EQ(6, LineNumber(iterator)); + EXPECT_EQ(C('d'), **iterator); + bv.scroll_view_down(1, false); + bv.update(); + EXPECT_EQ(7, LineNumber(iterator)); + EXPECT_EQ(C('7'), **iterator); + bv.scroll_view_down(4, false); + bv.update(); + EXPECT_EQ(9, LineNumber(iterator)); + EXPECT_EQ(C('h'), **iterator); + bv.scroll_view_down(2, false); + bv.update(); + EXPECT_EQ(10, LineNumber(iterator)); + EXPECT_EQ(C('1'), **iterator); + + bv.cursor_move(BufferView::CursorMovement::RIGHT, false); + bv.update(); + bv.scroll_view_up(3, false); + bv.update(); + EXPECT_EQ(9, LineNumber(iterator)); + EXPECT_EQ(C('i'), **iterator); + bv.scroll_view_up(5, false); + bv.update(); + EXPECT_EQ(6, LineNumber(iterator)); + EXPECT_EQ(C('e'), **iterator); +} + TEST(BufferViewTest, scrolls_the_view_up_and_down_with_nonzero_scroll_offset) { auto b = buffer1();