Skip to content

Commit 1932a5c

Browse files
committed
Merge pull request #108391 from KoBeWi/archeoexpressology
Add expression history to evaluator
2 parents 8ff0683 + 0d16f78 commit 1932a5c

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
@@ -56,6 +56,41 @@ void EditorExpressionEvaluator::add_value(const Array &p_array) {
5656
inspector->set_h_scroll(0);
5757
}
5858

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

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

71110
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) {
@@ -114,9 +154,11 @@ EditorExpressionEvaluator::EditorExpressionEvaluator() {
114154

115155
expression_input = memnew(LineEdit);
116156
expression_input->set_h_size_flags(Control::SIZE_EXPAND_FILL);
117-
expression_input->set_placeholder(TTR("Expression to evaluate"));
157+
expression_input->set_placeholder(TTRC("Expression to evaluate (Up/Down: Navigate history)"));
118158
expression_input->set_accessibility_name(TTRC("Expression to evaluate"));
119159
expression_input->set_clear_button_enabled(true);
160+
expression_input->set_keep_editing_on_text_submit(true);
161+
expression_input->connect(SceneStringName(gui_input), callable_mp(this, &EditorExpressionEvaluator::_line_edit_gui_input));
120162
expression_input->connect(SceneStringName(text_submitted), callable_mp(this, &EditorExpressionEvaluator::_evaluate).unbind(1));
121163
expression_input->connect(SceneStringName(text_changed), callable_mp(this, &EditorExpressionEvaluator::_on_expression_input_changed));
122164
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)