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

Fix for RuntimeNodeSelect selection_list showing up as an orphaned node when editor is open during runtime

This commit is contained in:
yahkr
2024-12-03 17:49:39 -05:00
parent 0f20e67d8d
commit f3a3452bca
2 changed files with 36 additions and 23 deletions

View File

@@ -1242,13 +1242,6 @@ void RuntimeNodeSelect::_setup(const Dictionary &p_settings) {
root->connect(SceneStringName(window_input), callable_mp(this, &RuntimeNodeSelect::_root_window_input)); root->connect(SceneStringName(window_input), callable_mp(this, &RuntimeNodeSelect::_root_window_input));
root->connect("size_changed", callable_mp(this, &RuntimeNodeSelect::_queue_selection_update), CONNECT_DEFERRED); root->connect("size_changed", callable_mp(this, &RuntimeNodeSelect::_queue_selection_update), CONNECT_DEFERRED);
selection_list = memnew(PopupMenu);
selection_list->set_theme(ThemeDB::get_singleton()->get_default_theme());
selection_list->set_auto_translate_mode(Node::AUTO_TRANSLATE_MODE_DISABLED);
selection_list->set_force_native(true);
selection_list->connect("index_pressed", callable_mp(this, &RuntimeNodeSelect::_items_popup_index_pressed).bind(selection_list));
selection_list->connect("popup_hide", callable_mp(Object::cast_to<Node>(root), &Node::remove_child).bind(selection_list));
panner.instantiate(); panner.instantiate();
panner->set_callbacks(callable_mp(this, &RuntimeNodeSelect::_pan_callback), callable_mp(this, &RuntimeNodeSelect::_zoom_callback)); panner->set_callbacks(callable_mp(this, &RuntimeNodeSelect::_pan_callback), callable_mp(this, &RuntimeNodeSelect::_zoom_callback));
@@ -1356,9 +1349,9 @@ void RuntimeNodeSelect::_set_camera_override_enabled(bool p_enabled) {
void RuntimeNodeSelect::_root_window_input(const Ref<InputEvent> &p_event) { void RuntimeNodeSelect::_root_window_input(const Ref<InputEvent> &p_event) {
Window *root = SceneTree::get_singleton()->get_root(); Window *root = SceneTree::get_singleton()->get_root();
if (node_select_type == NODE_TYPE_NONE || selection_list->is_visible()) { if (node_select_type == NODE_TYPE_NONE || (selection_list && selection_list->is_visible())) {
// Workaround for platforms that don't allow subwindows. // Workaround for platforms that don't allow subwindows.
if (selection_list->is_visible() && selection_list->is_embedded()) { if (selection_list && selection_list->is_visible() && selection_list->is_embedded()) {
root->set_disable_input_override(false); root->set_disable_input_override(false);
selection_list->push_input(p_event); selection_list->push_input(p_event);
callable_mp(root->get_viewport(), &Viewport::set_disable_input_override).call_deferred(true); callable_mp(root->get_viewport(), &Viewport::set_disable_input_override).call_deferred(true);
@@ -1530,21 +1523,9 @@ void RuntimeNodeSelect::_click_point() {
message.append(items[0].item->get_instance_id()); message.append(items[0].item->get_instance_id());
EngineDebugger::get_singleton()->send_message("remote_node_clicked", message); EngineDebugger::get_singleton()->send_message("remote_node_clicked", message);
} else if (list_shortcut_pressed || node_select_mode == SELECT_MODE_LIST) { } else if (list_shortcut_pressed || node_select_mode == SELECT_MODE_LIST) {
if (!selection_list->is_inside_tree()) { if (!selection_list) {
root->add_child(selection_list); _open_selection_list(items, pos);
} }
selection_list->clear();
for (const SelectResult &I : items) {
selection_list->add_item(I.item->get_name());
selection_list->set_item_metadata(-1, I.item);
}
selection_list->set_position(selection_list->is_embedded() ? pos : selection_position + root->get_position());
selection_list->reset_size();
selection_list->popup();
// FIXME: Ugly hack that stops the popup from hiding when the button is released.
selection_list->call_deferred(SNAME("set_position"), selection_list->get_position() + Point2(1, 0));
} }
} }
@@ -1736,6 +1717,35 @@ void RuntimeNodeSelect::_clear_selection() {
#endif // _3D_DISABLED #endif // _3D_DISABLED
} }
void RuntimeNodeSelect::_open_selection_list(const Vector<SelectResult> &p_items, const Point2 &p_pos) {
Window *root = SceneTree::get_singleton()->get_root();
selection_list = memnew(PopupMenu);
selection_list->set_theme(ThemeDB::get_singleton()->get_default_theme());
selection_list->set_auto_translate_mode(Node::AUTO_TRANSLATE_MODE_DISABLED);
selection_list->set_force_native(true);
selection_list->connect("index_pressed", callable_mp(this, &RuntimeNodeSelect::_items_popup_index_pressed).bind(selection_list));
selection_list->connect("popup_hide", callable_mp(this, &RuntimeNodeSelect::_close_selection_list));
root->add_child(selection_list);
for (const SelectResult &I : p_items) {
selection_list->add_item(I.item->get_name());
selection_list->set_item_metadata(-1, I.item);
}
selection_list->set_position(selection_list->is_embedded() ? p_pos : selection_position + root->get_position());
selection_list->reset_size();
selection_list->popup();
// FIXME: Ugly hack that stops the popup from hiding when the button is released.
selection_list->call_deferred(SNAME("set_position"), selection_list->get_position() + Point2(1, 0));
}
void RuntimeNodeSelect::_close_selection_list() {
selection_list->queue_free();
selection_list = nullptr;
}
void RuntimeNodeSelect::_set_selection_visible(bool p_visible) { void RuntimeNodeSelect::_set_selection_visible(bool p_visible) {
selection_visible = p_visible; selection_visible = p_visible;

View File

@@ -295,6 +295,9 @@ private:
void _clear_selection(); void _clear_selection();
void _set_selection_visible(bool p_visible); void _set_selection_visible(bool p_visible);
void _open_selection_list(const Vector<SelectResult> &p_items, const Point2 &p_pos);
void _close_selection_list();
void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, Vector<SelectResult> &r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D()); void _find_canvas_items_at_pos(const Point2 &p_pos, Node *p_node, Vector<SelectResult> &r_items, const Transform2D &p_parent_xform = Transform2D(), const Transform2D &p_canvas_xform = Transform2D());
void _pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event); void _pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event);
void _zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event); void _zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event);