瀏覽代碼

Keep focus on floating window when showing ProgressDialog

trollodel 1 年之前
父節點
當前提交
9ae48c72b4
共有 3 個文件被更改,包括 19 次插入0 次删除
  1. 12 0
      editor/progress_dialog.cpp
  2. 4 0
      editor/progress_dialog.h
  3. 3 0
      editor/window_wrapper.cpp

+ 12 - 0
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;
 }

+ 4 - 0
editor/progress_dialog.h

@@ -81,6 +81,8 @@ class ProgressDialog : public PopupPanel {
 	VBoxContainer *main = nullptr;
 	uint64_t last_progress_tick;
 
+	LocalVector<Window *> 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();
 };
 

+ 3 - 0
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