Преглед изворни кода

Merge pull request #62448 from MinusKube/completion-scroll-click

Add the ability to drag the code completion scrollbar using the mouse click
Rémi Verschelde пре 3 година
родитељ
комит
1d06fec535

+ 3 - 0
doc/classes/CodeEdit.xml

@@ -592,6 +592,9 @@
 		<theme_item name="completion_scroll_color" data_type="color" type="Color" default="Color(1, 1, 1, 0.29)">
 			[Color] of the scrollbar in the code completion popup.
 		</theme_item>
+		<theme_item name="completion_scroll_hovered_color" data_type="color" type="Color" default="Color(1, 1, 1, 0.4)">
+			[Color] of the scrollbar in the code completion popup when hovered.
+		</theme_item>
 		<theme_item name="completion_selected_color" data_type="color" type="Color" default="Color(0.26, 0.26, 0.27, 1)">
 			Background highlight [Color] for the current selected option item in the code completion popup.
 		</theme_item>

+ 1 - 0
editor/editor_settings.cpp

@@ -763,6 +763,7 @@ void EditorSettings::_load_godot2_text_editor_theme() {
 	_initial_set("text_editor/theme/highlighting/completion_selected_color", Color(0.26, 0.26, 0.27));
 	_initial_set("text_editor/theme/highlighting/completion_existing_color", Color(0.87, 0.87, 0.87, 0.13));
 	_initial_set("text_editor/theme/highlighting/completion_scroll_color", Color(1, 1, 1, 0.29));
+	_initial_set("text_editor/theme/highlighting/completion_scroll_hovered_color", Color(1, 1, 1, 0.4));
 	_initial_set("text_editor/theme/highlighting/completion_font_color", Color(0.67, 0.67, 0.67));
 	_initial_set("text_editor/theme/highlighting/text_color", Color(0.67, 0.67, 0.67));
 	_initial_set("text_editor/theme/highlighting/line_number_color", Color(0.67, 0.67, 0.67, 0.4));

+ 3 - 0
editor/editor_themes.cpp

@@ -1683,6 +1683,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
 	const Color completion_existing_color = alpha2;
 	// Same opacity as the scroll grabber editor icon.
 	const Color completion_scroll_color = Color(mono_value, mono_value, mono_value, 0.29);
+	const Color completion_scroll_hovered_color = Color(mono_value, mono_value, mono_value, 0.4);
 	const Color completion_font_color = font_color;
 	const Color text_color = font_color;
 	const Color line_number_color = dim_color;
@@ -1721,6 +1722,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
 		setting->set_initial_value("text_editor/theme/highlighting/completion_selected_color", completion_selected_color, true);
 		setting->set_initial_value("text_editor/theme/highlighting/completion_existing_color", completion_existing_color, true);
 		setting->set_initial_value("text_editor/theme/highlighting/completion_scroll_color", completion_scroll_color, true);
+		setting->set_initial_value("text_editor/theme/highlighting/completion_scroll_hovered_color", completion_scroll_hovered_color, true);
 		setting->set_initial_value("text_editor/theme/highlighting/completion_font_color", completion_font_color, true);
 		setting->set_initial_value("text_editor/theme/highlighting/text_color", text_color, true);
 		setting->set_initial_value("text_editor/theme/highlighting/line_number_color", line_number_color, true);
@@ -1766,6 +1768,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
 	theme->set_color("completion_selected_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_selected_color"));
 	theme->set_color("completion_existing_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_existing_color"));
 	theme->set_color("completion_scroll_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_scroll_color"));
+	theme->set_color("completion_scroll_hovered_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_scroll_hovered_color"));
 	theme->set_color("completion_font_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_font_color"));
 	theme->set_color("font_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/text_color"));
 	theme->set_color("line_number_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/line_number_color"));

+ 50 - 1
scene/gui/code_edit.cpp

@@ -68,6 +68,7 @@ void CodeEdit::_notification(int p_what) {
 			code_completion_max_lines = get_theme_constant(SNAME("completion_lines"));
 			code_completion_scroll_width = get_theme_constant(SNAME("completion_scroll_width"));
 			code_completion_scroll_color = get_theme_color(SNAME("completion_scroll_color"));
+			code_completion_scroll_hovered_color = get_theme_color(SNAME("completion_scroll_hovered_color"));
 			code_completion_background_color = get_theme_color(SNAME("completion_background_color"));
 			code_completion_selected_color = get_theme_color(SNAME("completion_selected_color"));
 			code_completion_existing_color = get_theme_color(SNAME("completion_existing_color"));
@@ -134,6 +135,9 @@ void CodeEdit::_notification(int p_what) {
 					RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(code_completion_rect.position, code_completion_rect.size + Size2(scroll_width, 0)), code_completion_background_color);
 				}
 
+				code_completion_scroll_rect.position = code_completion_rect.position + Vector2(code_completion_rect.size.width, 0);
+				code_completion_scroll_rect.size = Vector2(scroll_width, code_completion_rect.size.height);
+
 				code_completion_line_ofs = CLAMP(code_completion_current_selected - lines / 2, 0, code_completion_options_count - lines);
 				RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(code_completion_rect.position.x, code_completion_rect.position.y + (code_completion_current_selected - code_completion_line_ofs) * row_height), Size2(code_completion_rect.size.width, row_height)), code_completion_selected_color);
 
@@ -185,9 +189,11 @@ void CodeEdit::_notification(int p_what) {
 
 				/* Draw a small scroll rectangle to show a position in the options. */
 				if (scroll_width) {
+					Color scroll_color = is_code_completion_scroll_hovered || is_code_completion_scroll_pressed ? code_completion_scroll_hovered_color : code_completion_scroll_color;
+
 					float r = (float)code_completion_max_lines / code_completion_options_count;
 					float o = (float)code_completion_line_ofs / code_completion_options_count;
-					draw_rect(Rect2(code_completion_rect.position.x + code_completion_rect.size.width, code_completion_rect.position.y + o * code_completion_rect.size.y, scroll_width, code_completion_rect.size.y * r), code_completion_scroll_color);
+					draw_rect(Rect2(code_completion_rect.position.x + code_completion_rect.size.width, code_completion_rect.position.y + o * code_completion_rect.size.y, scroll_width, code_completion_rect.size.y * r), scroll_color);
 				}
 			}
 
@@ -260,6 +266,12 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 			return;
 		}
 
+		if (is_code_completion_scroll_pressed && mb->get_button_index() == MouseButton::LEFT) {
+			is_code_completion_scroll_pressed = false;
+			update();
+			return;
+		}
+
 		if (code_completion_active && code_completion_rect.has_point(mb->get_position())) {
 			if (!mb->is_pressed()) {
 				return;
@@ -288,8 +300,22 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 				default:
 					break;
 			}
+			return;
+		} else if (code_completion_active && code_completion_scroll_rect.has_point(mb->get_position())) {
+			if (mb->get_button_index() != MouseButton::LEFT) {
+				return;
+			}
+
+			if (mb->is_pressed()) {
+				is_code_completion_scroll_pressed = true;
+
+				_update_scroll_selected_line(mb->get_position().y);
+				update();
+			}
+
 			return;
 		}
+
 		cancel_code_completion();
 		set_code_hint("");
 
@@ -354,6 +380,18 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 				set_symbol_lookup_word_as_valid(false);
 			}
 		}
+
+		bool scroll_hovered = code_completion_scroll_rect.has_point(mpos);
+		if (is_code_completion_scroll_hovered != scroll_hovered) {
+			is_code_completion_scroll_hovered = scroll_hovered;
+			update();
+		}
+
+		if (is_code_completion_scroll_pressed) {
+			_update_scroll_selected_line(mpos.y);
+			update();
+			return;
+		}
 	}
 
 	Ref<InputEventKey> k = p_gui_input;
@@ -546,6 +584,10 @@ Control::CursorShape CodeEdit::get_cursor_shape(const Point2 &p_pos) const {
 		return CURSOR_ARROW;
 	}
 
+	if (code_completion_active && code_completion_scroll_rect.has_point(p_pos)) {
+		return CURSOR_ARROW;
+	}
+
 	Point2i pos = get_line_column_at_pos(p_pos, false);
 	int line = pos.y;
 	int col = pos.x;
@@ -2697,6 +2739,13 @@ TypedArray<String> CodeEdit::_get_delimiters(DelimiterType p_type) const {
 }
 
 /* Code Completion */
+void CodeEdit::_update_scroll_selected_line(float p_mouse_y) {
+	float percent = (float)(p_mouse_y - code_completion_scroll_rect.position.y) / code_completion_scroll_rect.size.height;
+	percent = CLAMP(percent, 0.0f, 1.0f);
+
+	code_completion_current_selected = (int)(percent * (code_completion_options.size() - 1));
+}
+
 void CodeEdit::_filter_code_completion_candidates_impl() {
 	int line_height = get_line_height();
 

+ 5 - 0
scene/gui/code_edit.h

@@ -203,22 +203,27 @@ private:
 	int code_completion_max_lines = 7;
 	int code_completion_scroll_width = 0;
 	Color code_completion_scroll_color = Color(0, 0, 0, 0);
+	Color code_completion_scroll_hovered_color = Color(0, 0, 0, 0);
 	Color code_completion_background_color = Color(0, 0, 0, 0);
 	Color code_completion_selected_color = Color(0, 0, 0, 0);
 	Color code_completion_existing_color = Color(0, 0, 0, 0);
 
 	bool code_completion_active = false;
+	bool is_code_completion_scroll_hovered = false;
+	bool is_code_completion_scroll_pressed = false;
 	Vector<ScriptLanguage::CodeCompletionOption> code_completion_options;
 	int code_completion_line_ofs = 0;
 	int code_completion_current_selected = 0;
 	int code_completion_longest_line = 0;
 	Rect2i code_completion_rect;
+	Rect2i code_completion_scroll_rect;
 
 	HashSet<char32_t> code_completion_prefixes;
 	List<ScriptLanguage::CodeCompletionOption> code_completion_option_submitted;
 	List<ScriptLanguage::CodeCompletionOption> code_completion_option_sources;
 	String code_completion_base;
 
+	void _update_scroll_selected_line(float p_mouse_y);
 	void _filter_code_completion_candidates_impl();
 
 	/* Line length guidelines */

+ 1 - 0
scene/resources/default_theme/default_theme.cpp

@@ -467,6 +467,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
 	theme->set_color("completion_selected_color", "CodeEdit", Color(0.26, 0.26, 0.27));
 	theme->set_color("completion_existing_color", "CodeEdit", Color(0.87, 0.87, 0.87, 0.13));
 	theme->set_color("completion_scroll_color", "CodeEdit", control_font_pressed_color * Color(1, 1, 1, 0.29));
+	theme->set_color("completion_scroll_hovered_color", "CodeEdit", control_font_pressed_color * Color(1, 1, 1, 0.4));
 	theme->set_color("completion_font_color", "CodeEdit", Color(0.67, 0.67, 0.67));
 	theme->set_color("font_color", "CodeEdit", control_font_color);
 	theme->set_color("font_selected_color", "CodeEdit", Color(0, 0, 0));