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.
This commit is contained in:
Yuri Sizov 2023-05-29 17:00:09 +02:00
parent 2f57da2907
commit 4c5c7cbb58
5 changed files with 6 additions and 15 deletions

View file

@ -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);

View file

@ -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<StyleBox> 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) {

View file

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

View file

@ -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();

View file

@ -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;
}