diff --git a/editor/export/export_template_manager.cpp b/editor/export/export_template_manager.cpp index c4f9869507..9e77ebd749 100644 --- a/editor/export/export_template_manager.cpp +++ b/editor/export/export_template_manager.cpp @@ -42,6 +42,7 @@ #include "editor/export/editor_export_preset.h" #include "editor/file_system/editor_file_system.h" #include "editor/file_system/editor_paths.h" +#include "editor/gui/editor_bottom_panel.h" #include "editor/gui/editor_file_dialog.h" #include "editor/gui/progress_dialog.h" #include "editor/settings/editor_settings.h" @@ -213,6 +214,11 @@ void ExportTemplateManager::_download_template(const String &p_url, bool p_skip_ set_process(true); _set_current_progress_status(TTR("Connecting to the mirror...")); + + ProgressIndicator *indicator = EditorNode::get_bottom_panel()->get_progress_indicator(); + indicator->set_tooltip_text(TTRC("Downloading export templates...")); + indicator->set_value(0); + indicator->show(); } void ExportTemplateManager::_download_template_completed(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data) { @@ -259,6 +265,7 @@ void ExportTemplateManager::_download_template_completed(int p_status, int p_cod } break; } + EditorNode::get_bottom_panel()->get_progress_indicator()->hide(); set_process(false); } @@ -421,6 +428,9 @@ void ExportTemplateManager::_set_current_progress_status(const String &p_status, } void ExportTemplateManager::_set_current_progress_value(float p_value, const String &p_status) { + if (!is_visible()) { + return; + } download_progress_bar->show(); download_progress_bar->set_indeterminate(false); download_progress_bar->set_value(p_value); @@ -929,6 +939,10 @@ Error ExportTemplateManager::install_android_template_from_file(const String &p_ void ExportTemplateManager::_notification(int p_what) { switch (p_what) { + case NOTIFICATION_READY: { + EditorNode::get_bottom_panel()->get_progress_indicator()->connect("clicked", callable_mp(this, &ExportTemplateManager::popup_manager)); + } break; + case NOTIFICATION_THEME_CHANGED: { current_value->add_theme_font_override(SceneStringName(font), get_theme_font(SNAME("main"), EditorStringName(EditorFonts))); current_missing_label->add_theme_color_override(SceneStringName(font_color), get_theme_color(SNAME("error_color"), EditorStringName(Editor))); @@ -937,14 +951,6 @@ void ExportTemplateManager::_notification(int p_what) { mirror_options_button->set_button_icon(get_editor_theme_icon(SNAME("GuiTabMenuHl"))); } break; - case NOTIFICATION_VISIBILITY_CHANGED: { - if (!is_visible()) { - set_process(false); - } else if (is_visible() && is_downloading_templates) { - set_process(true); - } - } break; - case NOTIFICATION_PROCESS: { update_countdown -= get_process_delta_time(); if (update_countdown > 0) { @@ -959,7 +965,9 @@ void ExportTemplateManager::_notification(int p_what) { if (downloaded_bytes >= 0) { if (total_bytes > 0) { - _set_current_progress_value(float(downloaded_bytes) / total_bytes, status); + float progress = float(downloaded_bytes) / total_bytes; + EditorNode::get_bottom_panel()->get_progress_indicator()->set_value(progress); + _set_current_progress_value(progress, status); } else { _set_current_progress_value(0, status); } @@ -968,6 +976,7 @@ void ExportTemplateManager::_notification(int p_what) { } if (!success) { + EditorNode::get_bottom_panel()->get_progress_indicator()->hide(); set_process(false); } } break; diff --git a/editor/gui/editor_bottom_panel.cpp b/editor/gui/editor_bottom_panel.cpp index 9a6e300831..dfa97723b5 100644 --- a/editor/gui/editor_bottom_panel.cpp +++ b/editor/gui/editor_bottom_panel.cpp @@ -287,6 +287,12 @@ EditorBottomPanel::EditorBottomPanel() : editor_toaster = memnew(EditorToaster); bottom_hbox->add_child(editor_toaster); + // NOTE: This is currently used only for ExportTemplateManager and hard-coded for that task. + progress_indicator = memnew(ProgressIndicator); + progress_indicator->set_v_size_flags(SIZE_SHRINK_CENTER); + progress_indicator->hide(); + bottom_hbox->add_child(progress_indicator); + EditorVersionButton *version_btn = memnew(EditorVersionButton(EditorVersionButton::FORMAT_BASIC)); // Fade out the version label to be less prominent, but still readable. version_btn->set_self_modulate(Color(1, 1, 1, 0.65)); @@ -321,3 +327,30 @@ EditorBottomPanel::~EditorBottomPanel() { memdelete(b); } } + +void ProgressIndicator::_notification(int p_what) { + if (p_what == NOTIFICATION_THEME_CHANGED) { + const Ref ring_texture = get_editor_theme_icon(SNAME("ProgressRing")); + set_progress_texture(ring_texture); + set_tint_progress(get_theme_color(SNAME("accent_color"), EditorStringName(Editor))); + set_under_texture(ring_texture); + } +} + +void ProgressIndicator::_bind_methods() { + ADD_SIGNAL(MethodInfo("clicked")); +} + +void ProgressIndicator::gui_input(const Ref &p_event) { + Ref mb = p_event; + if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { + emit_signal("clicked"); + } +} + +ProgressIndicator::ProgressIndicator() { + set_fill_mode(FILL_CLOCKWISE); + set_tint_under(Color()); + set_step(0.0); + set_max(1.0); +} diff --git a/editor/gui/editor_bottom_panel.h b/editor/gui/editor_bottom_panel.h index 99353efe57..e997c1cc3c 100644 --- a/editor/gui/editor_bottom_panel.h +++ b/editor/gui/editor_bottom_panel.h @@ -31,6 +31,7 @@ #pragma once #include "editor/docks/dock_tab_container.h" +#include "scene/gui/texture_progress_bar.h" class Button; class ConfigFile; @@ -38,11 +39,25 @@ class EditorDock; class EditorToaster; class HBoxContainer; +class ProgressIndicator : public TextureProgressBar { + GDCLASS(ProgressIndicator, TextureProgressBar); + +protected: + void _notification(int p_what); + static void _bind_methods(); + + virtual void gui_input(const Ref &p_event) override; + +public: + ProgressIndicator(); +}; + class EditorBottomPanel : public DockTabContainer { GDCLASS(EditorBottomPanel, DockTabContainer); HBoxContainer *bottom_hbox = nullptr; EditorToaster *editor_toaster = nullptr; + ProgressIndicator *progress_indicator = nullptr; Button *pin_button = nullptr; Button *expand_button = nullptr; @@ -84,6 +99,8 @@ public: void _theme_changed(); bool is_locked() const { return lock_panel_switching; } + ProgressIndicator *get_progress_indicator() { return progress_indicator; } + void set_bottom_panel_offset(int p_offset); int get_bottom_panel_offset(); diff --git a/editor/icons/ProgressRing.svg b/editor/icons/ProgressRing.svg new file mode 100644 index 0000000000..21c65c8484 --- /dev/null +++ b/editor/icons/ProgressRing.svg @@ -0,0 +1 @@ +