Add the ability to drag the code completion scrollbar using the mouse click
This commit is contained in:
parent
898e09e2e6
commit
336400dc42
6 changed files with 63 additions and 1 deletions
|
@ -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>
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue