Browse Source

Merge pull request #45881 from nekomatata/textedit-wrap-autoscroll

Fix TextEdit autoscroll with wrapped lines
Rémi Verschelde 4 years ago
parent
commit
48e7cced9f
2 changed files with 11 additions and 11 deletions
  1. 9 9
      scene/gui/text_edit.cpp
  2. 2 2
      scene/gui/text_edit.h

+ 9 - 9
scene/gui/text_edit.cpp

@@ -500,7 +500,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;
@@ -3775,8 +3775,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_wrap = get_last_visible_line_wrap_index();
+		int last_vis_line = get_last_full_visible_line();
+		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);
@@ -4149,8 +4149,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_wrap = get_last_visible_line_wrap_index();
+	int last_vis_line = get_last_full_visible_line();
+	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.
@@ -6163,19 +6163,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;
 }
 }
 
 

+ 2 - 2
scene/gui/text_edit.h

@@ -373,8 +373,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_visible_line_wrap_index() const;
+	int get_last_full_visible_line() 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;