BufferView: fix more scrolling problems

This commit is contained in:
Josh Holtrop 2017-09-23 16:02:34 -04:00
parent 33377f7668
commit 1d12a7fe7d
2 changed files with 49 additions and 2 deletions

View File

@ -195,6 +195,7 @@ bool BufferView::cursor_move(CursorMovement which, bool allow_eol)
void BufferView::scroll_view_up(int n_lines, 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 so = effective_scroll_offset();
int rows_to_move_cursor = (so + n_lines) - (m_height - m_cursor_screen_row - 1); 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); 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)) if (move_cursor_screen_row_up(allow_eol))
{ {
actual_lines_moved++; actual_lines_moved++;
update();
} }
else else
{ {
break; 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) 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 so = effective_scroll_offset();
int rows_to_move_cursor = (so + n_lines) - m_cursor_screen_row; 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); 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)) if (move_cursor_screen_row_down(allow_eol))
{ {
actual_lines_moved++; actual_lines_moved++;
update();
} }
else else
{ {
break; break;
} }
} }
m_cursor_screen_row -= (n_lines - actual_lines_moved); m_cursor_screen_row = orig_cursor_screen_row - (n_lines - actual_lines_moved);
} }
/************************************************************************** /**************************************************************************

View File

@ -592,6 +592,49 @@ TEST(BufferViewTest, scrolls_the_view_up_and_down)
EXPECT_EQ(5, bv.cursor_screen_row()); 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) TEST(BufferViewTest, scrolls_the_view_up_and_down_with_nonzero_scroll_offset)
{ {
auto b = buffer1(); auto b = buffer1();