diff --git a/editor/debugger/editor_expression_evaluator.cpp b/editor/debugger/editor_expression_evaluator.cpp index 3f9eca86364..9d6d2104bb2 100644 --- a/editor/debugger/editor_expression_evaluator.cpp +++ b/editor/debugger/editor_expression_evaluator.cpp @@ -55,6 +55,41 @@ void EditorExpressionEvaluator::add_value(const Array &p_array) { inspector->set_h_scroll(0); } +void EditorExpressionEvaluator::_line_edit_gui_input(const Ref &p_event) { + if (!expression_input->is_editing()) { + return; + } + + const Ref k = p_event; + if (k.is_null() || !k->is_pressed()) { + return; + } + + if (k->is_action_pressed("ui_up", true)) { + int size = expression_history.size(); + if (expression_index < size - 1) { + expression_index++; + + const String &history_text = expression_history[expression_history.size() - expression_index - 1]; + expression_input->set_text(history_text); + expression_input->set_caret_column(history_text.size()); + } + accept_event(); + } else if (k->is_action_pressed("ui_down", true)) { + if (expression_index > 0) { + expression_index--; + + const String &history_text = expression_history[expression_history.size() - expression_index - 1]; + expression_input->set_text(history_text); + expression_input->set_caret_column(history_text.size()); + } else if (expression_index == 0) { + expression_index = -1; + expression_input->clear(); + } + accept_event(); + } +} + void EditorExpressionEvaluator::_evaluate() { const String &expression = expression_input->get_text(); if (expression.is_empty()) { @@ -65,6 +100,10 @@ void EditorExpressionEvaluator::_evaluate() { return; } + expression_history.erase(expression); + expression_history.push_back(expression); + expression_index = -1; + editor_debugger->request_remote_evaluate(expression, editor_debugger->get_stack_script_frame()); expression_input->clear(); @@ -81,6 +120,7 @@ void EditorExpressionEvaluator::_remote_object_selected(ObjectID p_id) { void EditorExpressionEvaluator::_on_expression_input_changed(const String &p_expression) { evaluate_btn->set_disabled(p_expression.is_empty()); + expression_index = -1; } void EditorExpressionEvaluator::_on_debugger_breaked(bool p_breaked, bool p_can_debug) { @@ -110,9 +150,11 @@ EditorExpressionEvaluator::EditorExpressionEvaluator() { expression_input = memnew(LineEdit); expression_input->set_h_size_flags(Control::SIZE_EXPAND_FILL); - expression_input->set_placeholder(TTR("Expression to evaluate")); + expression_input->set_placeholder(TTRC("Expression to evaluate (Up/Down: Navigate history)")); expression_input->set_accessibility_name(TTRC("Expression to evaluate")); expression_input->set_clear_button_enabled(true); + expression_input->set_keep_editing_on_text_submit(true); + expression_input->connect(SceneStringName(gui_input), callable_mp(this, &EditorExpressionEvaluator::_line_edit_gui_input)); expression_input->connect(SceneStringName(text_submitted), callable_mp(this, &EditorExpressionEvaluator::_evaluate).unbind(1)); expression_input->connect(SceneStringName(text_changed), callable_mp(this, &EditorExpressionEvaluator::_on_expression_input_changed)); hb->add_child(expression_input); diff --git a/editor/debugger/editor_expression_evaluator.h b/editor/debugger/editor_expression_evaluator.h index 3153d2d6a9b..e4e015b54e1 100644 --- a/editor/debugger/editor_expression_evaluator.h +++ b/editor/debugger/editor_expression_evaluator.h @@ -52,6 +52,10 @@ private: EditorDebuggerInspector *inspector = nullptr; + LocalVector expression_history; + int expression_index = -1; + + void _line_edit_gui_input(const Ref &p_event); void _evaluate(); void _clear();