BufferView: fix more scrolling problems
This commit is contained in:
parent
33377f7668
commit
1d12a7fe7d
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user