From 9ae48c72b41d688f27e6a1142a4ea809f068699c Mon Sep 17 00:00:00 2001 From: trollodel <33117082+trollodel@users.noreply.github.com> Date: Fri, 13 Oct 2023 22:05:02 +0200 Subject: [PATCH] Keep focus on floating window when showing ProgressDialog --- editor/progress_dialog.cpp | 12 ++++++++++++ editor/progress_dialog.h | 4 ++++ editor/window_wrapper.cpp | 3 +++ 3 files changed, 19 insertions(+) diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp index e5db5f9d30c..366d0cb2fc3 100644 --- a/editor/progress_dialog.cpp +++ b/editor/progress_dialog.cpp @@ -147,6 +147,13 @@ void ProgressDialog::_popup() { main->set_offset(SIDE_BOTTOM, -style->get_margin(SIDE_BOTTOM)); if (!is_inside_tree()) { + for (Window *window : host_windows) { + if (window->has_focus()) { + popup_exclusive_centered(window, ms); + return; + } + } + // No host window found, use main window. EditorInterface::get_singleton()->popup_dialog_centered(this, ms); } } @@ -226,6 +233,11 @@ void ProgressDialog::end_task(const String &p_task) { } } +void ProgressDialog::add_host_window(Window *p_window) { + ERR_FAIL_NULL(p_window); + host_windows.push_back(p_window); +} + void ProgressDialog::_cancel_pressed() { canceled = true; } diff --git a/editor/progress_dialog.h b/editor/progress_dialog.h index ae47e5f25ca..c75c8fac109 100644 --- a/editor/progress_dialog.h +++ b/editor/progress_dialog.h @@ -81,6 +81,8 @@ class ProgressDialog : public PopupPanel { VBoxContainer *main = nullptr; uint64_t last_progress_tick; + LocalVector host_windows; + static ProgressDialog *singleton; void _popup(); @@ -96,6 +98,8 @@ public: bool task_step(const String &p_task, const String &p_state, int p_step = -1, bool p_force_redraw = true); void end_task(const String &p_task); + void add_host_window(Window *p_window); + ProgressDialog(); }; diff --git a/editor/window_wrapper.cpp b/editor/window_wrapper.cpp index a5c862ffd63..2d89e4df46e 100644 --- a/editor/window_wrapper.cpp +++ b/editor/window_wrapper.cpp @@ -34,6 +34,7 @@ #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "editor/editor_string_names.h" +#include "editor/progress_dialog.h" #include "scene/gui/box_container.h" #include "scene/gui/label.h" #include "scene/gui/panel.h" @@ -332,6 +333,8 @@ WindowWrapper::WindowWrapper() { window_background = memnew(Panel); window_background->set_anchors_and_offsets_preset(PRESET_FULL_RECT); window->add_child(window_background); + + ProgressDialog::get_singleton()->add_host_window(window); } // ScreenSelect