Fix TextEdit autoscroll with wrapped lines

Index to find the last line wrap index was off by one, which prevented the first wrapped line to trigger autoscroll.

(cherry picked from commit 121030940c)
This commit is contained in:
PouleyKetchoupp 2021-02-10 19:02:30 -07:00 committed by Rémi Verschelde
parent 6c6f4e9895
commit ac9e5d9c60
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 11 additions and 13 deletions

View file

@ -558,7 +558,7 @@ void TextEdit::_update_minimap_click() {
int row; int row;
_get_minimap_mouse_row(Point2i(mp.x, mp.y), row); _get_minimap_mouse_row(Point2i(mp.x, mp.y), row);
if (row >= get_first_visible_line() && (row < get_last_visible_line() || row >= (text.size() - 1))) { if (row >= get_first_visible_line() && (row < get_last_full_visible_line() || row >= (text.size() - 1))) {
minimap_scroll_ratio = v_scroll->get_as_ratio(); minimap_scroll_ratio = v_scroll->get_as_ratio();
minimap_scroll_click_pos = mp.y; minimap_scroll_click_pos = mp.y;
can_drag_minimap = true; can_drag_minimap = true;
@ -3940,8 +3940,8 @@ void TextEdit::_scroll_lines_up() {
if (!selection.active) { if (!selection.active) {
int cur_line = cursor.line; int cur_line = cursor.line;
int cur_wrap = get_cursor_wrap_index(); int cur_wrap = get_cursor_wrap_index();
int last_vis_line = get_last_visible_line(); int last_vis_line = get_last_full_visible_line();
int last_vis_wrap = get_last_visible_line_wrap_index(); int last_vis_wrap = get_last_full_visible_line_wrap_index();
if (cur_line > last_vis_line || (cur_line == last_vis_line && cur_wrap > last_vis_wrap)) { if (cur_line > last_vis_line || (cur_line == last_vis_line && cur_wrap > last_vis_wrap)) {
cursor_set_line(last_vis_line, false, false, last_vis_wrap); cursor_set_line(last_vis_line, false, false, last_vis_wrap);
@ -4340,8 +4340,8 @@ void TextEdit::adjust_viewport_to_cursor() {
int first_vis_line = get_first_visible_line(); int first_vis_line = get_first_visible_line();
int first_vis_wrap = cursor.wrap_ofs; int first_vis_wrap = cursor.wrap_ofs;
int last_vis_line = get_last_visible_line(); int last_vis_line = get_last_full_visible_line();
int last_vis_wrap = get_last_visible_line_wrap_index(); int last_vis_wrap = get_last_full_visible_line_wrap_index();
if (cur_line < first_vis_line || (cur_line == first_vis_line && cur_wrap < first_vis_wrap)) { if (cur_line < first_vis_line || (cur_line == first_vis_line && cur_wrap < first_vis_wrap)) {
// Cursor is above screen. // Cursor is above screen.
@ -6397,21 +6397,19 @@ int TextEdit::get_first_visible_line() const {
return CLAMP(cursor.line_ofs, 0, text.size() - 1); return CLAMP(cursor.line_ofs, 0, text.size() - 1);
} }
int TextEdit::get_last_visible_line() const { int TextEdit::get_last_full_visible_line() const {
int first_vis_line = get_first_visible_line(); int first_vis_line = get_first_visible_line();
int last_vis_line = 0; int last_vis_line = 0;
int wi; int wi;
last_vis_line = first_vis_line + num_lines_from_rows(first_vis_line, cursor.wrap_ofs, get_visible_rows() + 1, wi) - 1; last_vis_line = first_vis_line + num_lines_from_rows(first_vis_line, cursor.wrap_ofs, get_visible_rows(), wi) - 1;
last_vis_line = CLAMP(last_vis_line, 0, text.size() - 1); last_vis_line = CLAMP(last_vis_line, 0, text.size() - 1);
return last_vis_line; return last_vis_line;
} }
int TextEdit::get_last_visible_line_wrap_index() const { int TextEdit::get_last_full_visible_line_wrap_index() const {
int first_vis_line = get_first_visible_line(); int first_vis_line = get_first_visible_line();
int wi; int wi;
num_lines_from_rows(first_vis_line, cursor.wrap_ofs, get_visible_rows() + 1, wi); num_lines_from_rows(first_vis_line, cursor.wrap_ofs, get_visible_rows(), wi);
return wi; return wi;
} }

View file

@ -460,8 +460,8 @@ private:
void set_line_as_center_visible(int p_line, int p_wrap_index = 0); void set_line_as_center_visible(int p_line, int p_wrap_index = 0);
void set_line_as_last_visible(int p_line, int p_wrap_index = 0); void set_line_as_last_visible(int p_line, int p_wrap_index = 0);
int get_first_visible_line() const; int get_first_visible_line() const;
int get_last_visible_line() const; int get_last_full_visible_line() const;
int get_last_visible_line_wrap_index() const; int get_last_full_visible_line_wrap_index() const;
double get_visible_rows_offset() const; double get_visible_rows_offset() const;
double get_v_scroll_offset() const; double get_v_scroll_offset() const;