Pārlūkot izejas kodu

Merge pull request #77433 from YuriSizov/editor-reparented-popups-fix

Fix auto-reparenting logic in the `ProgressDialog`
Yuri Sizov 2 gadi atpakaļ
vecāks
revīzija
ee7b26403b

+ 1 - 0
editor/editor_node.cpp

@@ -6981,6 +6981,7 @@ EditorNode::EditorNode() {
 	resource_preview = memnew(EditorResourcePreview);
 	resource_preview = memnew(EditorResourcePreview);
 	add_child(resource_preview);
 	add_child(resource_preview);
 	progress_dialog = memnew(ProgressDialog);
 	progress_dialog = memnew(ProgressDialog);
+	progress_dialog->set_unparent_when_invisible(true);
 
 
 	// Take up all screen.
 	// Take up all screen.
 	gui_base->set_anchor(SIDE_RIGHT, Control::ANCHOR_END);
 	gui_base->set_anchor(SIDE_RIGHT, Control::ANCHOR_END);

+ 4 - 12
editor/progress_dialog.cpp

@@ -134,29 +134,21 @@ void BackgroundProgress::end_task(const String &p_task) {
 
 
 ProgressDialog *ProgressDialog::singleton = nullptr;
 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() {
 void ProgressDialog::_popup() {
 	Size2 ms = main->get_combined_minimum_size();
 	Size2 ms = main->get_combined_minimum_size();
 	ms.width = MAX(500 * EDSCALE, ms.width);
 	ms.width = MAX(500 * EDSCALE, ms.width);
 
 
 	Ref<StyleBox> style = main->get_theme_stylebox(SNAME("panel"), SNAME("PopupMenu"));
 	Ref<StyleBox> style = main->get_theme_stylebox(SNAME("panel"), SNAME("PopupMenu"));
 	ms += style->get_minimum_size();
 	ms += style->get_minimum_size();
+
 	main->set_offset(SIDE_LEFT, style->get_margin(SIDE_LEFT));
 	main->set_offset(SIDE_LEFT, style->get_margin(SIDE_LEFT));
 	main->set_offset(SIDE_RIGHT, -style->get_margin(SIDE_RIGHT));
 	main->set_offset(SIDE_RIGHT, -style->get_margin(SIDE_RIGHT));
 	main->set_offset(SIDE_TOP, style->get_margin(SIDE_TOP));
 	main->set_offset(SIDE_TOP, style->get_margin(SIDE_TOP));
 	main->set_offset(SIDE_BOTTOM, -style->get_margin(SIDE_BOTTOM));
 	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) {
 void ProgressDialog::add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {

+ 0 - 1
editor/progress_dialog.h

@@ -88,7 +88,6 @@ class ProgressDialog : public PopupPanel {
 	bool canceled = false;
 	bool canceled = false;
 
 
 protected:
 protected:
-	void _notification(int p_what);
 	static void _bind_methods();
 	static void _bind_methods();
 
 
 public:
 public:

+ 1 - 0
scene/gui/popup.cpp

@@ -96,6 +96,7 @@ void Popup::_notification(int p_what) {
 			}
 			}
 		} break;
 		} break;
 
 
+		case NOTIFICATION_UNPARENTED:
 		case NOTIFICATION_EXIT_TREE: {
 		case NOTIFICATION_EXIT_TREE: {
 			if (!is_in_edited_scene_root()) {
 			if (!is_in_edited_scene_root()) {
 				_deinitialize_visible_parents();
 				_deinitialize_visible_parents();

+ 0 - 2
scene/main/window.cpp

@@ -524,8 +524,6 @@ void Window::set_ime_position(const Point2i &p_pos) {
 
 
 bool Window::is_embedded() const {
 bool Window::is_embedded() const {
 	ERR_READ_THREAD_GUARD_V(false);
 	ERR_READ_THREAD_GUARD_V(false);
-	ERR_FAIL_COND_V(!is_inside_tree(), false);
-
 	return get_embedder() != nullptr;
 	return get_embedder() != nullptr;
 }
 }