mirror of
https://github.com/Redot-Engine/redot-engine.git
synced 2025-12-06 23:31:53 -05:00
Merge commit godotengine/godot@d33da79d3f
This commit is contained in:
@@ -37,6 +37,8 @@
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/themes/editor_scale.h"
|
||||
#include "main/main.h"
|
||||
#include "scene/gui/panel_container.h"
|
||||
#include "scene/main/window.h"
|
||||
#include "servers/display_server.h"
|
||||
|
||||
void BackgroundProgress::_add_task(const String &p_task, const String &p_label, int p_steps) {
|
||||
@@ -128,6 +130,21 @@ void BackgroundProgress::end_task(const String &p_task) {
|
||||
|
||||
ProgressDialog *ProgressDialog::singleton = nullptr;
|
||||
|
||||
void ProgressDialog::_notification(int p_what) {
|
||||
switch (p_what) {
|
||||
case NOTIFICATION_THEME_CHANGED: {
|
||||
Ref<StyleBox> style = main->get_theme_stylebox(SceneStringName(panel), SNAME("PopupMenu"));
|
||||
main_border_size = 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));
|
||||
|
||||
center_panel->add_theme_style_override(SceneStringName(panel), get_theme_stylebox(SceneStringName(panel), "PopupPanel"));
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
void ProgressDialog::_update_ui() {
|
||||
// Run main loop for two frames.
|
||||
if (is_inside_tree()) {
|
||||
@@ -137,33 +154,33 @@ void ProgressDialog::_update_ui() {
|
||||
}
|
||||
|
||||
void ProgressDialog::_popup() {
|
||||
// Activate processing of all inputs in EditorNode, and the EditorNode::input method
|
||||
// will discard every key input.
|
||||
EditorNode::get_singleton()->set_process_input(true);
|
||||
// Disable all other windows to prevent interaction with them.
|
||||
for (Window *w : host_windows) {
|
||||
w->set_process_mode(PROCESS_MODE_DISABLED);
|
||||
}
|
||||
|
||||
Size2 ms = main->get_combined_minimum_size();
|
||||
ms.width = MAX(500 * EDSCALE, ms.width);
|
||||
ms += main_border_size;
|
||||
|
||||
Ref<StyleBox> style = main->get_theme_stylebox(SceneStringName(panel), SNAME("PopupMenu"));
|
||||
ms += style->get_minimum_size();
|
||||
center_panel->set_custom_minimum_size(ms);
|
||||
|
||||
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()) {
|
||||
Rect2i adjust = _popup_adjust_rect();
|
||||
if (adjust != Rect2i()) {
|
||||
set_position(adjust.position);
|
||||
set_size(adjust.size);
|
||||
}
|
||||
} else {
|
||||
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);
|
||||
Window *current_window = Window::get_from_id(DisplayServer::get_singleton()->get_focused_window());
|
||||
if (!current_window) {
|
||||
current_window = get_tree()->get_root();
|
||||
}
|
||||
|
||||
reparent(current_window);
|
||||
|
||||
// Ensures that events are properly released before the dialog blocks input.
|
||||
bool window_is_input_disabled = current_window->is_input_disabled();
|
||||
current_window->set_disable_input(!window_is_input_disabled);
|
||||
current_window->set_disable_input(window_is_input_disabled);
|
||||
|
||||
show();
|
||||
}
|
||||
|
||||
void ProgressDialog::add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
|
||||
@@ -233,6 +250,10 @@ void ProgressDialog::end_task(const String &p_task) {
|
||||
|
||||
if (tasks.is_empty()) {
|
||||
hide();
|
||||
EditorNode::get_singleton()->set_process_input(false);
|
||||
for (Window *w : host_windows) {
|
||||
w->set_process_mode(PROCESS_MODE_INHERIT);
|
||||
}
|
||||
} else {
|
||||
_popup();
|
||||
}
|
||||
@@ -243,17 +264,31 @@ void ProgressDialog::add_host_window(Window *p_window) {
|
||||
host_windows.push_back(p_window);
|
||||
}
|
||||
|
||||
void ProgressDialog::remove_host_window(Window *p_window) {
|
||||
ERR_FAIL_NULL(p_window);
|
||||
host_windows.erase(p_window);
|
||||
}
|
||||
|
||||
void ProgressDialog::_cancel_pressed() {
|
||||
canceled = true;
|
||||
}
|
||||
|
||||
ProgressDialog::ProgressDialog() {
|
||||
main = memnew(VBoxContainer);
|
||||
add_child(main);
|
||||
main->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
|
||||
set_exclusive(true);
|
||||
set_flag(Window::FLAG_POPUP, false);
|
||||
// We want to cover the entire screen to prevent the user from interacting with the Editor.
|
||||
set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT);
|
||||
// Be sure it's the top most component.
|
||||
set_z_index(RS::CANVAS_ITEM_Z_MAX);
|
||||
singleton = this;
|
||||
hide();
|
||||
|
||||
center_panel = memnew(PanelContainer);
|
||||
add_child(center_panel);
|
||||
center_panel->set_h_size_flags(SIZE_SHRINK_BEGIN);
|
||||
center_panel->set_v_size_flags(SIZE_SHRINK_BEGIN);
|
||||
|
||||
main = memnew(VBoxContainer);
|
||||
center_panel->add_child(main);
|
||||
|
||||
cancel_hb = memnew(HBoxContainer);
|
||||
main->add_child(cancel_hb);
|
||||
cancel_hb->hide();
|
||||
|
||||
Reference in New Issue
Block a user