From 4c5c7cbb586bad26995dc56cfca20dca644745be Mon Sep 17 00:00:00 2001 From: Yuri Sizov Date: Mon, 29 May 2023 17:00:09 +0200 Subject: [PATCH] Fix auto-reparenting logic in the `ProgressDialog` * Make sure `Popup` signals are disconnected when unparented. * Remove a fail condition from `Window::is_embedded` when not in tree. --- editor/editor_node.cpp | 1 + editor/progress_dialog.cpp | 16 ++++------------ editor/progress_dialog.h | 1 - scene/gui/popup.cpp | 1 + scene/main/window.cpp | 2 -- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index f035541128e..215170f4c49 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -6981,6 +6981,7 @@ EditorNode::EditorNode() { resource_preview = memnew(EditorResourcePreview); add_child(resource_preview); progress_dialog = memnew(ProgressDialog); + progress_dialog->set_unparent_when_invisible(true); // Take up all screen. gui_base->set_anchor(SIDE_RIGHT, Control::ANCHOR_END); diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp index 6c63f0ba6a0..e5db5f9d30c 100644 --- a/editor/progress_dialog.cpp +++ b/editor/progress_dialog.cpp @@ -134,29 +134,21 @@ void BackgroundProgress::end_task(const String &p_task) { ProgressDialog *ProgressDialog::singleton = nullptr; -void ProgressDialog::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (!is_visible()) { - Node *p = get_parent(); - if (p) { - p->remove_child(this); - } - } - } -} - void ProgressDialog::_popup() { Size2 ms = main->get_combined_minimum_size(); ms.width = MAX(500 * EDSCALE, ms.width); Ref style = main->get_theme_stylebox(SNAME("panel"), SNAME("PopupMenu")); ms += style->get_minimum_size(); + main->set_offset(SIDE_LEFT, style->get_margin(SIDE_LEFT)); main->set_offset(SIDE_RIGHT, -style->get_margin(SIDE_RIGHT)); main->set_offset(SIDE_TOP, style->get_margin(SIDE_TOP)); main->set_offset(SIDE_BOTTOM, -style->get_margin(SIDE_BOTTOM)); - EditorInterface::get_singleton()->popup_dialog_centered(this, ms); + if (!is_inside_tree()) { + EditorInterface::get_singleton()->popup_dialog_centered(this, ms); + } } void ProgressDialog::add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) { diff --git a/editor/progress_dialog.h b/editor/progress_dialog.h index 7ac4864c9c8..ae47e5f25ca 100644 --- a/editor/progress_dialog.h +++ b/editor/progress_dialog.h @@ -88,7 +88,6 @@ class ProgressDialog : public PopupPanel { bool canceled = false; protected: - void _notification(int p_what); static void _bind_methods(); public: diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index 00ed457201d..c0a2dc81d0a 100644 --- a/scene/gui/popup.cpp +++ b/scene/gui/popup.cpp @@ -96,6 +96,7 @@ void Popup::_notification(int p_what) { } } break; + case NOTIFICATION_UNPARENTED: case NOTIFICATION_EXIT_TREE: { if (!is_in_edited_scene_root()) { _deinitialize_visible_parents(); diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 175c2848b4f..9f4ad88e649 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -524,8 +524,6 @@ void Window::set_ime_position(const Point2i &p_pos) { bool Window::is_embedded() const { ERR_READ_THREAD_GUARD_V(false); - ERR_FAIL_COND_V(!is_inside_tree(), false); - return get_embedder() != nullptr; }