diff options
Diffstat (limited to 'scene/gui/text_edit.cpp')
| -rw-r--r-- | scene/gui/text_edit.cpp | 30 | 
1 files changed, 21 insertions, 9 deletions
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 55a650ff12..4fe06e9a4c 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -426,6 +426,9 @@ void TextEdit::_update_scrollbars() {  void TextEdit::_click_selection_held() { +	// Warning: is_mouse_button_pressed(BUTTON_LEFT) returns false for double+ clicks, so this doesn't work for MODE_WORD +	// and MODE_LINE. However, moving the mouse triggers _gui_input, which calls these functions too, so that's not a huge problem. +	// I'm unsure if there's an actual fix that doesn't have a ton of side effects.  	if (Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT) && selection.selecting_mode != Selection::MODE_NONE) {  		switch (selection.selecting_mode) {  			case Selection::MODE_POINTER: { @@ -447,7 +450,7 @@ void TextEdit::_click_selection_held() {  }  void TextEdit::_update_selection_mode_pointer() { -	Point2 mp = Input::get_singleton()->get_mouse_position() - get_global_position(); +	Point2 mp = get_local_mouse_position();  	int row, col;  	_get_mouse_pos(Point2i(mp.x, mp.y), row, col); @@ -455,14 +458,14 @@ void TextEdit::_update_selection_mode_pointer() {  	select(selection.selecting_line, selection.selecting_column, row, col);  	cursor_set_line(row, false); -	cursor_set_column(col, false); +	cursor_set_column(col);  	update();  	click_select_held->start();  }  void TextEdit::_update_selection_mode_word() { -	Point2 mp = Input::get_singleton()->get_mouse_position() - get_global_position(); +	Point2 mp = get_local_mouse_position();  	int row, col;  	_get_mouse_pos(Point2i(mp.x, mp.y), row, col); @@ -496,26 +499,29 @@ void TextEdit::_update_selection_mode_word() {  		selection.selected_word_beg = beg;  		selection.selected_word_end = end;  		selection.selected_word_origin = beg; +		cursor_set_line(selection.to_line, false);  		cursor_set_column(selection.to_column);  	} else {  		if ((col <= selection.selected_word_origin && row == selection.selecting_line) || row < selection.selecting_line) {  			selection.selecting_column = selection.selected_word_end;  			select(row, beg, selection.selecting_line, selection.selected_word_end); +			cursor_set_line(selection.from_line, false);  			cursor_set_column(selection.from_column);  		} else {  			selection.selecting_column = selection.selected_word_beg;  			select(selection.selecting_line, selection.selected_word_beg, row, end); +			cursor_set_line(selection.to_line, false);  			cursor_set_column(selection.to_column);  		}  	} -	cursor_set_line(row, false);  	update(); +  	click_select_held->start();  }  void TextEdit::_update_selection_mode_line() { -	Point2 mp = Input::get_singleton()->get_mouse_position() - get_global_position(); +	Point2 mp = get_local_mouse_position();  	int row, col;  	_get_mouse_pos(Point2i(mp.x, mp.y), row, col); @@ -531,7 +537,7 @@ void TextEdit::_update_selection_mode_line() {  		selection.selecting_column = 0;  		col = text[row].length();  	} -	cursor_set_column(0, false); +	cursor_set_column(0);  	select(selection.selecting_line, selection.selecting_column, row, col);  	update(); @@ -1388,6 +1394,7 @@ void TextEdit::_notification(int p_what) {  			}  			if (has_focus()) { +				OS::get_singleton()->set_ime_active(true);  				OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos + Point2(0, get_row_height()));  				OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this);  			} @@ -1399,6 +1406,7 @@ void TextEdit::_notification(int p_what) {  				draw_caret = true;  			} +			OS::get_singleton()->set_ime_active(true);  			Point2 cursor_pos = Point2(cursor_get_column(), cursor_get_line()) * get_row_height();  			OS::get_singleton()->set_ime_position(get_global_position() + cursor_pos);  			OS::get_singleton()->set_ime_intermediate_text_callback(_ime_text_callback, this); @@ -1413,6 +1421,7 @@ void TextEdit::_notification(int p_what) {  			OS::get_singleton()->set_ime_position(Point2());  			OS::get_singleton()->set_ime_intermediate_text_callback(NULL, NULL); +			OS::get_singleton()->set_ime_active(false);  			ime_text = "";  			ime_selection = Point2(); @@ -1657,14 +1666,17 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co  	rows /= get_row_height();  	rows += get_v_scroll_offset();  	int first_vis_line = get_first_visible_line(); +	int last_vis_line = get_last_visible_line();  	int row = first_vis_line + Math::floor(rows);  	int wrap_index = 0;  	if (is_wrap_enabled() || is_hiding_enabled()) { -		int f_ofs = num_lines_from_rows(first_vis_line, cursor.wrap_ofs, rows + 1, wrap_index) - 1; -		row = first_vis_line + f_ofs; -		row = CLAMP(row, 0, get_last_visible_line() + 1); +		int f_ofs = num_lines_from_rows(first_vis_line, cursor.wrap_ofs, rows + (1 * SGN(rows)), wrap_index) - 1; +		if (rows < 0) +			row = first_vis_line - f_ofs; +		else +			row = first_vis_line + f_ofs;  	}  	if (row < 0)  |