mirror of
https://github.com/godotengine/godot
synced 2024-11-02 11:59:10 +00:00
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:
parent
2f57da2907
commit
4c5c7cbb58
5 changed files with 6 additions and 15 deletions
|
@ -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);
|
||||
|
|
|
@ -134,30 +134,22 @@ 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));
|
||||
|
||||
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) {
|
||||
if (MessageQueue::get_singleton()->is_flushing()) {
|
||||
|
|
|
@ -88,7 +88,6 @@ class ProgressDialog : public PopupPanel {
|
|||
bool canceled = false;
|
||||
|
||||
protected:
|
||||
void _notification(int p_what);
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue