1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #106588 from timothyqiu/tree-new-bee

Lazy create menu and slider nodes in `Tree`
This commit is contained in:
Thaddeus Crews
2025-05-19 16:22:30 -05:00
2 changed files with 49 additions and 44 deletions

View File

@@ -3197,12 +3197,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
} break; } break;
case TreeItem::CELL_MODE_RANGE: { case TreeItem::CELL_MODE_RANGE: {
if (!c.text.is_empty()) { if (!c.text.is_empty()) {
popup_menu->clear(); _update_popup_menu(c);
for (int i = 0; i < c.text.get_slice_count(","); i++) {
String s = c.text.get_slicec(',', i);
popup_menu->add_item(s.get_slicec(':', 0), s.get_slicec(':', 1).is_empty() ? i : s.get_slicec(':', 1).to_int());
}
popup_menu->set_size(Size2(col_width, 0)); popup_menu->set_size(Size2(col_width, 0));
popup_menu->set_position(get_screen_position() + Point2i(col_ofs, _get_title_button_height() + y_ofs + item_h) - theme_cache.offset); popup_menu->set_position(get_screen_position() + Point2i(col_ofs, _get_title_button_height() + y_ofs + item_h) - theme_cache.offset);
popup_menu->popup(); popup_menu->popup();
@@ -3332,7 +3327,7 @@ void Tree::_text_editor_popup_modal_close() {
return; // ESC pressed, app focus lost, or forced close from code. return; // ESC pressed, app focus lost, or forced close from code.
} }
if (value_editor->has_point(value_editor->get_local_mouse_position())) { if (value_editor && value_editor->has_point(value_editor->get_local_mouse_position())) {
return; return;
} }
@@ -3449,6 +3444,37 @@ void Tree::value_editor_changed(double p_value) {
queue_redraw(); queue_redraw();
} }
void Tree::_update_popup_menu(const TreeItem::Cell &p_cell) {
if (popup_menu == nullptr) {
popup_menu = memnew(PopupMenu);
popup_menu->hide();
add_child(popup_menu, false, INTERNAL_MODE_FRONT);
popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &Tree::popup_select));
}
popup_menu->clear();
for (int i = 0; i < p_cell.text.get_slice_count(","); i++) {
String s = p_cell.text.get_slicec(',', i);
popup_menu->add_item(s.get_slicec(':', 0), s.get_slicec(':', 1).is_empty() ? i : s.get_slicec(':', 1).to_int());
}
}
void Tree::_update_value_editor(const TreeItem::Cell &p_cell) {
if (value_editor == nullptr) {
value_editor = memnew(HSlider);
value_editor->set_v_size_flags(SIZE_EXPAND_FILL);
value_editor->hide();
popup_editor_vb->add_child(value_editor);
value_editor->connect(SceneStringName(value_changed), callable_mp(this, &Tree::value_editor_changed));
}
updating_value_editor = true;
value_editor->set_min(p_cell.min);
value_editor->set_max(p_cell.max);
value_editor->set_step(p_cell.step);
value_editor->set_value(p_cell.val);
value_editor->set_exp_ratio(p_cell.expr);
updating_value_editor = false;
}
void Tree::popup_select(int p_option) { void Tree::popup_select(int p_option) {
if (!popup_edited_item) { if (!popup_edited_item) {
return; return;
@@ -4308,12 +4334,7 @@ bool Tree::edit_selected(bool p_force_edit) {
return true; return true;
} else if (c.mode == TreeItem::CELL_MODE_RANGE && !c.text.is_empty()) { } else if (c.mode == TreeItem::CELL_MODE_RANGE && !c.text.is_empty()) {
popup_menu->clear(); _update_popup_menu(c);
for (int i = 0; i < c.text.get_slice_count(","); i++) {
String s2 = c.text.get_slicec(',', i);
popup_menu->add_item(s2.get_slicec(':', 0), s2.get_slicec(':', 1).is_empty() ? i : s2.get_slicec(':', 1).to_int());
}
popup_menu->set_size(Size2(rect.size.width, 0)); popup_menu->set_size(Size2(rect.size.width, 0));
popup_menu->set_position(get_screen_position() + rect.position + Point2i(0, rect.size.height)); popup_menu->set_position(get_screen_position() + rect.position + Point2i(0, rect.size.height));
popup_menu->popup(); popup_menu->popup();
@@ -4322,9 +4343,16 @@ bool Tree::edit_selected(bool p_force_edit) {
return true; return true;
} else if ((c.mode == TreeItem::CELL_MODE_STRING && !c.edit_multiline) || c.mode == TreeItem::CELL_MODE_RANGE) { } else if ((c.mode == TreeItem::CELL_MODE_STRING && !c.edit_multiline) || c.mode == TreeItem::CELL_MODE_RANGE) {
Rect2 popup_rect; int value_editor_height = 0;
if (c.mode == TreeItem::CELL_MODE_RANGE) {
_update_value_editor(c);
value_editor_height = value_editor->get_minimum_size().height;
value_editor->show();
} else if (value_editor) {
value_editor->hide();
}
int value_editor_height = c.mode == TreeItem::CELL_MODE_RANGE ? value_editor->get_minimum_size().height : 0; Rect2 popup_rect;
// `floor()` centers vertically. // `floor()` centers vertically.
Vector2 ofs(0, Math::floor((MAX(line_editor->get_minimum_size().height, rect.size.height - value_editor_height) - rect.size.height) / 2)); Vector2 ofs(0, Math::floor((MAX(line_editor->get_minimum_size().height, rect.size.height - value_editor_height) - rect.size.height) / 2));
@@ -4334,8 +4362,7 @@ bool Tree::edit_selected(bool p_force_edit) {
icon_ofs = _get_cell_icon_size(c).x * popup_scale + theme_cache.h_separation; icon_ofs = _get_cell_icon_size(c).x * popup_scale + theme_cache.h_separation;
} }
popup_rect.size = rect.size; popup_rect.size = rect.size + Vector2(-icon_ofs, value_editor_height);
popup_rect.size.x -= icon_ofs;
popup_rect.position = rect.position - ofs; popup_rect.position = rect.position - ofs;
popup_rect.position.x += icon_ofs; popup_rect.position.x += icon_ofs;
@@ -4351,21 +4378,6 @@ bool Tree::edit_selected(bool p_force_edit) {
text_editor->hide(); text_editor->hide();
if (c.mode == TreeItem::CELL_MODE_RANGE) {
popup_rect.size.y += value_editor_height;
value_editor->show();
updating_value_editor = true;
value_editor->set_min(c.min);
value_editor->set_max(c.max);
value_editor->set_step(c.step);
value_editor->set_value(c.val);
value_editor->set_exp_ratio(c.expr);
updating_value_editor = false;
} else {
value_editor->hide();
}
popup_editor->set_position(popup_rect.position); popup_editor->set_position(popup_rect.position);
popup_editor->set_size(popup_rect.size * popup_scale); popup_editor->set_size(popup_rect.size * popup_scale);
if (!popup_editor->is_embedded()) { if (!popup_editor->is_embedded()) {
@@ -6634,14 +6646,10 @@ Tree::Tree() {
set_focus_mode(FOCUS_ALL); set_focus_mode(FOCUS_ALL);
popup_menu = memnew(PopupMenu);
popup_menu->hide();
add_child(popup_menu, false, INTERNAL_MODE_FRONT);
popup_editor = memnew(Popup); popup_editor = memnew(Popup);
add_child(popup_editor, false, INTERNAL_MODE_FRONT); add_child(popup_editor, false, INTERNAL_MODE_FRONT);
VBoxContainer *popup_editor_vb = memnew(VBoxContainer); popup_editor_vb = memnew(VBoxContainer);
popup_editor_vb->add_theme_constant_override("separation", 0); popup_editor_vb->add_theme_constant_override("separation", 0);
popup_editor_vb->set_anchors_and_offsets_preset(PRESET_FULL_RECT); popup_editor_vb->set_anchors_and_offsets_preset(PRESET_FULL_RECT);
popup_editor->add_child(popup_editor_vb); popup_editor->add_child(popup_editor_vb);
@@ -6656,11 +6664,6 @@ Tree::Tree() {
text_editor->hide(); text_editor->hide();
popup_editor_vb->add_child(text_editor); popup_editor_vb->add_child(text_editor);
value_editor = memnew(HSlider);
value_editor->set_v_size_flags(SIZE_EXPAND_FILL);
value_editor->hide();
popup_editor_vb->add_child(value_editor);
h_scroll = memnew(HScrollBar); h_scroll = memnew(HScrollBar);
v_scroll = memnew(VScrollBar); v_scroll = memnew(VScrollBar);
@@ -6676,8 +6679,6 @@ Tree::Tree() {
line_editor->connect(SceneStringName(text_submitted), callable_mp(this, &Tree::_line_editor_submit)); line_editor->connect(SceneStringName(text_submitted), callable_mp(this, &Tree::_line_editor_submit));
text_editor->connect(SceneStringName(gui_input), callable_mp(this, &Tree::_text_editor_gui_input)); text_editor->connect(SceneStringName(gui_input), callable_mp(this, &Tree::_text_editor_gui_input));
popup_editor->connect("popup_hide", callable_mp(this, &Tree::_text_editor_popup_modal_close)); popup_editor->connect("popup_hide", callable_mp(this, &Tree::_text_editor_popup_modal_close));
popup_menu->connect(SceneStringName(id_pressed), callable_mp(this, &Tree::popup_select));
value_editor->connect(SceneStringName(value_changed), callable_mp(this, &Tree::value_editor_changed));
set_notify_transform(true); set_notify_transform(true);

View File

@@ -33,6 +33,7 @@
#include "scene/gui/control.h" #include "scene/gui/control.h"
#include "scene/resources/text_paragraph.h" #include "scene/resources/text_paragraph.h"
class VBoxContainer;
class HScrollBar; class HScrollBar;
class HSlider; class HSlider;
class LineEdit; class LineEdit;
@@ -529,6 +530,7 @@ private:
bool popup_edit_committed = true; bool popup_edit_committed = true;
RID accessibility_scroll_element; RID accessibility_scroll_element;
VBoxContainer *popup_editor_vb = nullptr;
Popup *popup_editor = nullptr; Popup *popup_editor = nullptr;
LineEdit *line_editor = nullptr; LineEdit *line_editor = nullptr;
TextEdit *text_editor = nullptr; TextEdit *text_editor = nullptr;
@@ -559,6 +561,8 @@ private:
void _text_editor_popup_modal_close(); void _text_editor_popup_modal_close();
void _text_editor_gui_input(const Ref<InputEvent> &p_event); void _text_editor_gui_input(const Ref<InputEvent> &p_event);
void value_editor_changed(double p_value); void value_editor_changed(double p_value);
void _update_popup_menu(const TreeItem::Cell &p_cell);
void _update_value_editor(const TreeItem::Cell &p_cell);
void popup_select(int p_option); void popup_select(int p_option);