From 9862e7f75b3418a27a6b26dbcdfa1efb6bbd517d Mon Sep 17 00:00:00 2001 From: kit Date: Thu, 22 Feb 2024 15:32:12 -0500 Subject: [PATCH] Make Goto line a Popup and allow expressions --- editor/code_editor.cpp | 51 +++++++++++++++------------ editor/code_editor.h | 24 ++++++------- editor/plugins/script_text_editor.cpp | 6 ++-- editor/plugins/script_text_editor.h | 2 +- editor/plugins/text_editor.cpp | 6 ++-- editor/plugins/text_editor.h | 2 +- editor/plugins/text_shader_editor.cpp | 6 ++-- editor/plugins/text_shader_editor.h | 2 +- 8 files changed, 51 insertions(+), 48 deletions(-) diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 180c25c34f16..f6871417d1c3 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -43,33 +43,37 @@ #include "scene/gui/separator.h" #include "scene/resources/font.h" -void GotoLineDialog::popup_find_line(CodeEdit *p_edit) { - text_editor = p_edit; +void GotoLinePopup::popup_find_line(CodeTextEditor *p_text_editor) { + text_editor = p_text_editor; // Add 1 because text_editor->get_caret_line() starts from 0, but the editor user interface starts from 1. - line->set_text(itos(text_editor->get_caret_line() + 1)); - line->select_all(); - popup_centered(Size2(180, 80) * EDSCALE); - line->grab_focus(); -} + TextEdit *text_edit = text_editor->get_text_editor(); + int original_line = text_edit->get_caret_line() + 1; + line_input->set_max(text_edit->get_line_count()); + line_input->set_value_no_signal(original_line); -int GotoLineDialog::get_line() const { - return line->get_text().to_int(); + Rect2i parent_rect = text_editor->get_global_rect(); + Point2i centered_pos(parent_rect.get_center().x - get_contents_minimum_size().x / 2.0, parent_rect.position.y); + popup_on_parent(Rect2i(centered_pos, Size2())); + reset_size(); + line_input->setup_and_show(); } -void GotoLineDialog::ok_pressed() { +void GotoLinePopup::_goto_line() { // Subtract 1 because the editor user interface starts from 1, but text_editor->set_caret_line(n) starts from 0. - const int line_number = get_line() - 1; - if (line_number < 0 || line_number >= text_editor->get_line_count()) { + const int line_number = line_input->get_value() - 1; + if (line_number < 0 || line_number >= text_editor->get_text_editor()->get_line_count()) { return; } - text_editor->remove_secondary_carets(); - text_editor->unfold_line(line_number); - text_editor->set_caret_line(line_number); + text_editor->goto_line_centered(line_number); +} + +void GotoLinePopup::_submit() { + _goto_line(); hide(); } -GotoLineDialog::GotoLineDialog() { +GotoLinePopup::GotoLinePopup() { set_title(TTR("Go to Line")); VBoxContainer *vbc = memnew(VBoxContainer); @@ -83,14 +87,15 @@ GotoLineDialog::GotoLineDialog() { l->set_text(TTR("Line Number:")); vbc->add_child(l); - line = memnew(LineEdit); - vbc->add_child(line); - register_text_enter(line); - text_editor = nullptr; - - line_label = nullptr; + line_input = memnew(EditorSpinSlider); + line_input->set_custom_minimum_size(Size2(100, 0) * EDSCALE); + line_input->set_step(1); + line_input->set_min(1); + line_input->connect("value_changed", callable_mp(this, &GotoLinePopup::_goto_line).unbind(1)); + line_input->get_line_edit()->connect("text_submitted", callable_mp(this, &GotoLinePopup::_submit).unbind(1)); + vbc->add_child(line_input); - set_hide_on_ok(false); + text_editor = nullptr; } void FindReplaceBar::_notification(int p_what) { diff --git a/editor/code_editor.h b/editor/code_editor.h index d209d5c7a28c..49ec430277e2 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -31,36 +31,34 @@ #ifndef CODE_EDITOR_H #define CODE_EDITOR_H +#include "editor/gui/editor_spin_slider.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/check_box.h" #include "scene/gui/code_edit.h" #include "scene/gui/dialogs.h" #include "scene/gui/label.h" -#include "scene/gui/line_edit.h" +#include "scene/gui/popup.h" #include "scene/main/timer.h" class MenuButton; +class CodeTextEditor; -class GotoLineDialog : public ConfirmationDialog { - GDCLASS(GotoLineDialog, ConfirmationDialog); - - Label *line_label = nullptr; - LineEdit *line = nullptr; +class GotoLinePopup : public PopupPanel { + GDCLASS(GotoLinePopup, PopupPanel); - CodeEdit *text_editor = nullptr; + EditorSpinSlider *line_input = nullptr; + CodeTextEditor *text_editor = nullptr; - virtual void ok_pressed() override; + void _goto_line(); + void _submit(); public: - void popup_find_line(CodeEdit *p_edit); - int get_line() const; + void popup_find_line(CodeTextEditor *p_text_editor); - GotoLineDialog(); + GotoLinePopup(); }; -class CodeTextEditor; - class FindReplaceBar : public HBoxContainer { GDCLASS(FindReplaceBar, HBoxContainer); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index eb39a27d021e..032d466b0a43 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1518,7 +1518,7 @@ void ScriptTextEditor::_edit_option(int p_op) { quick_open->set_title(TTR("Go to Function")); } break; case SEARCH_GOTO_LINE: { - goto_line_dialog->popup_find_line(tx); + goto_line_popup->popup_find_line(code_editor); } break; case BOOKMARK_TOGGLE: { code_editor->toggle_bookmark(); @@ -2274,8 +2274,8 @@ void ScriptTextEditor::_enable_code_editor() { quick_open->connect("goto_line", callable_mp(this, &ScriptTextEditor::_goto_line)); add_child(quick_open); - goto_line_dialog = memnew(GotoLineDialog); - add_child(goto_line_dialog); + goto_line_popup = memnew(GotoLinePopup); + add_child(goto_line_popup); add_child(connection_info_dialog); diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 7aa0726479f5..618027be255e 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -85,7 +85,7 @@ class ScriptTextEditor : public ScriptEditorBase { PopupMenu *highlighter_menu = nullptr; PopupMenu *context_menu = nullptr; - GotoLineDialog *goto_line_dialog = nullptr; + GotoLinePopup *goto_line_popup = nullptr; ScriptEditorQuickOpen *quick_open = nullptr; ConnectionInfoDialog *connection_info_dialog = nullptr; diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index cb1f6c1ec63b..a3ec951dc581 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -467,7 +467,7 @@ void TextEditor::_edit_option(int p_op) { emit_signal(SNAME("replace_in_files_requested"), selected_text); } break; case SEARCH_GOTO_LINE: { - goto_line_dialog->popup_find_line(tx); + goto_line_popup->popup_find_line(code_editor); } break; case BOOKMARK_TOGGLE: { code_editor->toggle_bookmark(); @@ -704,8 +704,8 @@ TextEditor::TextEditor() { bookmarks_menu->connect("about_to_popup", callable_mp(this, &TextEditor::_update_bookmark_list)); bookmarks_menu->connect("index_pressed", callable_mp(this, &TextEditor::_bookmark_item_pressed)); - goto_line_dialog = memnew(GotoLineDialog); - add_child(goto_line_dialog); + goto_line_popup = memnew(GotoLinePopup); + add_child(goto_line_popup); } TextEditor::~TextEditor() { diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index 1acec4e95976..ed80a705e91c 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -53,7 +53,7 @@ class TextEditor : public ScriptEditorBase { PopupMenu *bookmarks_menu = nullptr; PopupMenu *context_menu = nullptr; - GotoLineDialog *goto_line_dialog = nullptr; + GotoLinePopup *goto_line_popup = nullptr; enum { EDIT_UNDO, diff --git a/editor/plugins/text_shader_editor.cpp b/editor/plugins/text_shader_editor.cpp index 4d8f3298b68f..5d35f36dbce0 100644 --- a/editor/plugins/text_shader_editor.cpp +++ b/editor/plugins/text_shader_editor.cpp @@ -712,7 +712,7 @@ void TextShaderEditor::_menu_option(int p_option) { code_editor->get_find_replace_bar()->popup_replace(); } break; case SEARCH_GOTO_LINE: { - goto_line_dialog->popup_find_line(code_editor->get_text_editor()); + goto_line_popup->popup_find_line(code_editor); } break; case BOOKMARK_TOGGLE: { code_editor->toggle_bookmark(); @@ -1235,8 +1235,8 @@ TextShaderEditor::TextShaderEditor() { editor_box->add_child(warnings_panel); code_editor->set_warnings_panel(warnings_panel); - goto_line_dialog = memnew(GotoLineDialog); - add_child(goto_line_dialog); + goto_line_popup = memnew(GotoLinePopup); + add_child(goto_line_popup); disk_changed = memnew(ConfirmationDialog); diff --git a/editor/plugins/text_shader_editor.h b/editor/plugins/text_shader_editor.h index 55efb4e30ed8..afcb03e05894 100644 --- a/editor/plugins/text_shader_editor.h +++ b/editor/plugins/text_shader_editor.h @@ -145,7 +145,7 @@ class TextShaderEditor : public ShaderEditor { RichTextLabel *warnings_panel = nullptr; uint64_t idle = 0; - GotoLineDialog *goto_line_dialog = nullptr; + GotoLinePopup *goto_line_popup = nullptr; ConfirmationDialog *erase_tab_confirm = nullptr; ConfirmationDialog *disk_changed = nullptr;