Code Editor: Add documentation tooltips
This commit is contained in:
@ -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));
|
||||
|
||||
Reference in New Issue
Block a user