Skip to content

Commit 0d16f78

Browse files
committed
Add expression history to evaluator
1 parent 4d1f26e commit 0d16f78

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

editor/debugger/editor_expression_evaluator.cpp

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,41 @@ void EditorExpressionEvaluator::add_value(const Array &p_array) {
5555
inspector->set_h_scroll(0);
5656
}
5757

58+
void EditorExpressionEvaluator::_line_edit_gui_input(const Ref<InputEvent> &p_event) {
59+
if (!expression_input->is_editing()) {
60+
return;
61+
}
62+
63+
const Ref<InputEventKey> k = p_event;
64+
if (k.is_null() || !k->is_pressed()) {
65+
return;
66+
}
67+
68+
if (k->is_action_pressed("ui_up", true)) {
69+
int size = expression_history.size();
70+
if (expression_index < size - 1) {
71+
expression_index++;
72+
73+
const String &history_text = expression_history[expression_history.size() - expression_index - 1];
74+
expression_input->set_text(history_text);
75+
expression_input->set_caret_column(history_text.size());
76+
}
77+
accept_event();
78+
} else if (k->is_action_pressed("ui_down", true)) {
79+
if (expression_index > 0) {
80+
expression_index--;
81+
82+
const String &history_text = expression_history[expression_history.size() - expression_index - 1];
83+
expression_input->set_text(history_text);
84+
expression_input->set_caret_column(history_text.size());
85+
} else if (expression_index == 0) {
86+
expression_index = -1;
87+
expression_input->clear();
88+
}
89+
accept_event();
90+
}
91+
}
92+
5893
void EditorExpressionEvaluator::_evaluate() {
5994
const String &expression = expression_input->get_text();
6095
if (expression.is_empty()) {
@@ -65,6 +100,10 @@ void EditorExpressionEvaluator::_evaluate() {
65100
return;
66101
}
67102

103+
expression_history.erase(expression);
104+
expression_history.push_back(expression);
105+
expression_index = -1;
106+
68107
editor_debugger->request_remote_evaluate(expression, editor_debugger->get_stack_script_frame());
69108

70109
expression_input->clear();
@@ -81,6 +120,7 @@ void EditorExpressionEvaluator::_remote_object_selected(ObjectID p_id) {
81120

82121
void EditorExpressionEvaluator::_on_expression_input_changed(const String &p_expression) {
83122
evaluate_btn->set_disabled(p_expression.is_empty());
123+
expression_index = -1;
84124
}
85125

86126
void EditorExpressionEvaluator::_on_debugger_breaked(bool p_breaked, bool p_can_debug) {
@@ -110,9 +150,11 @@ EditorExpressionEvaluator::EditorExpressionEvaluator() {
110150

111151
expression_input = memnew(LineEdit);
112152
expression_input->set_h_size_flags(Control::SIZE_EXPAND_FILL);
113-
expression_input->set_placeholder(TTR("Expression to evaluate"));
153+
expression_input->set_placeholder(TTRC("Expression to evaluate (Up/Down: Navigate history)"));
114154
expression_input->set_accessibility_name(TTRC("Expression to evaluate"));
115155
expression_input->set_clear_button_enabled(true);
156+
expression_input->set_keep_editing_on_text_submit(true);
157+
expression_input->connect(SceneStringName(gui_input), callable_mp(this, &EditorExpressionEvaluator::_line_edit_gui_input));
116158
expression_input->connect(SceneStringName(text_submitted), callable_mp(this, &EditorExpressionEvaluator::_evaluate).unbind(1));
117159
expression_input->connect(SceneStringName(text_changed), callable_mp(this, &EditorExpressionEvaluator::_on_expression_input_changed));
118160
hb->add_child(expression_input);

editor/debugger/editor_expression_evaluator.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ class EditorExpressionEvaluator : public VBoxContainer {
5252

5353
EditorDebuggerInspector *inspector = nullptr;
5454

55+
LocalVector<String> expression_history;
56+
int expression_index = -1;
57+
58+
void _line_edit_gui_input(const Ref<InputEvent> &p_event);
5559
void _evaluate();
5660
void _clear();
5761

0 commit comments

Comments
 (0)