Code Editor: Add documentation tooltips

This commit is contained in:
Danil Alexeev
2024-12-14 21:25:05 +03:00
parent 863a24ac86
commit 80d11500b5
30 changed files with 1398 additions and 586 deletions

View File

@ -31,13 +31,27 @@
#include "code_edit.h"
#include "code_edit.compat.inc"
#include "core/config/project_settings.h"
#include "core/os/keyboard.h"
#include "core/string/string_builder.h"
#include "core/string/ustring.h"
#include "scene/theme/theme_db.h"
void CodeEdit::_apply_project_settings() {
symbol_tooltip_timer->set_wait_time(GLOBAL_GET("gui/timers/tooltip_delay_sec"));
}
void CodeEdit::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_READY: {
_apply_project_settings();
#ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint()) {
ProjectSettings::get_singleton()->connect("settings_changed", callable_mp(this, &CodeEdit::_apply_project_settings));
}
#endif // TOOLS_ENABLED
} break;
case NOTIFICATION_THEME_CHANGED: {
set_gutter_width(main_gutter, get_line_height());
_update_line_number_gutter_width();
@ -262,6 +276,7 @@ void CodeEdit::_notification(int p_what) {
case NOTIFICATION_MOUSE_EXIT: {
queue_redraw();
symbol_tooltip_timer->stop();
} break;
}
}
@ -438,6 +453,12 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
}
}
if (symbol_tooltip_on_hover_enabled) {
symbol_tooltip_pos = get_line_column_at_pos(mpos, false);
symbol_tooltip_word = get_word_at_pos(mpos);
symbol_tooltip_timer->start();
}
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;
@ -2408,6 +2429,26 @@ void CodeEdit::set_symbol_lookup_word_as_valid(bool p_valid) {
}
}
/* Symbol tooltip */
void CodeEdit::set_symbol_tooltip_on_hover_enabled(bool p_enabled) {
symbol_tooltip_on_hover_enabled = p_enabled;
if (!p_enabled) {
symbol_tooltip_timer->stop();
}
}
bool CodeEdit::is_symbol_tooltip_on_hover_enabled() const {
return symbol_tooltip_on_hover_enabled;
}
void CodeEdit::_on_symbol_tooltip_timer_timeout() {
const int line = symbol_tooltip_pos.y;
const int column = symbol_tooltip_pos.x;
if (line >= 0 && column >= 0 && !symbol_tooltip_word.is_empty() && !has_selection() && !Input::get_singleton()->is_anything_pressed()) {
emit_signal(SNAME("symbol_hovered"), symbol_tooltip_word, line, column);
}
}
/* Text manipulation */
void CodeEdit::move_lines_up() {
begin_complex_operation();
@ -2771,6 +2812,10 @@ void CodeEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_symbol_lookup_word_as_valid", "valid"), &CodeEdit::set_symbol_lookup_word_as_valid);
/* Symbol tooltip */
ClassDB::bind_method(D_METHOD("set_symbol_tooltip_on_hover_enabled", "enable"), &CodeEdit::set_symbol_tooltip_on_hover_enabled);
ClassDB::bind_method(D_METHOD("is_symbol_tooltip_on_hover_enabled"), &CodeEdit::is_symbol_tooltip_on_hover_enabled);
/* Text manipulation */
ClassDB::bind_method(D_METHOD("move_lines_up"), &CodeEdit::move_lines_up);
ClassDB::bind_method(D_METHOD("move_lines_down"), &CodeEdit::move_lines_down);
@ -2780,6 +2825,7 @@ void CodeEdit::_bind_methods() {
/* Inspector */
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "symbol_lookup_on_click"), "set_symbol_lookup_on_click_enabled", "is_symbol_lookup_on_click_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "symbol_tooltip_on_hover"), "set_symbol_tooltip_on_hover_enabled", "is_symbol_tooltip_on_hover_enabled");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "line_folding"), "set_line_folding_enabled", "is_line_folding_enabled");
ADD_PROPERTY(PropertyInfo(Variant::PACKED_INT32_ARRAY, "line_length_guidelines"), "set_line_length_guidelines", "get_line_length_guidelines");
@ -2826,6 +2872,9 @@ void CodeEdit::_bind_methods() {
ADD_SIGNAL(MethodInfo("symbol_lookup", PropertyInfo(Variant::STRING, "symbol"), PropertyInfo(Variant::INT, "line"), PropertyInfo(Variant::INT, "column")));
ADD_SIGNAL(MethodInfo("symbol_validate", PropertyInfo(Variant::STRING, "symbol")));
/* Symbol tooltip */
ADD_SIGNAL(MethodInfo("symbol_hovered", PropertyInfo(Variant::STRING, "symbol"), PropertyInfo(Variant::INT, "line"), PropertyInfo(Variant::INT, "column")));
/* Theme items */
/* Gutters */
BIND_THEME_ITEM(Theme::DATA_TYPE_COLOR, CodeEdit, code_folding_color);
@ -3749,6 +3798,13 @@ CodeEdit::CodeEdit() {
set_gutter_custom_draw(gutter_idx, callable_mp(this, &CodeEdit::_fold_gutter_draw_callback));
gutter_idx++;
/* Symbol tooltip */
symbol_tooltip_timer = memnew(Timer);
symbol_tooltip_timer->set_wait_time(0.5); // See `_apply_project_settings()`.
symbol_tooltip_timer->set_one_shot(true);
symbol_tooltip_timer->connect("timeout", callable_mp(this, &CodeEdit::_on_symbol_tooltip_timer_timeout));
add_child(symbol_tooltip_timer, false, INTERNAL_MODE_FRONT);
connect("lines_edited_from", callable_mp(this, &CodeEdit::_lines_edited_from));
connect("text_set", callable_mp(this, &CodeEdit::_text_set));
connect(SceneStringName(text_changed), callable_mp(this, &CodeEdit::_text_changed));