summaryrefslogtreecommitdiff
path: root/src/citron/loading_screen.h
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2024-12-31 16:19:25 +1000
committerZephyron <zephyron@citron-emu.org>2024-12-31 16:19:25 +1000
commit9427e27e24a7135880ee2881c3c44988e174b41a (patch)
tree83f0062a35be144f6b162eaa823c5b3c7620146e /src/citron/loading_screen.h
parentb35ae725d20960411e8588b11c12a2d55f86c9d0 (diff)
chore: update project branding to citron
Diffstat (limited to 'src/citron/loading_screen.h')
-rw-r--r--src/citron/loading_screen.h94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/citron/loading_screen.h b/src/citron/loading_screen.h
new file mode 100644
index 000000000..17045595d
--- /dev/null
+++ b/src/citron/loading_screen.h
@@ -0,0 +1,94 @@
+// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <chrono>
+#include <memory>
+#include <QString>
+#include <QWidget>
+#include <QtGlobal>
+
+#if !QT_CONFIG(movie)
+#define YUZU_QT_MOVIE_MISSING 1
+#endif
+
+namespace Loader {
+class AppLoader;
+}
+
+namespace Ui {
+class LoadingScreen;
+}
+
+namespace VideoCore {
+enum class LoadCallbackStage;
+}
+
+class QBuffer;
+class QByteArray;
+class QGraphicsOpacityEffect;
+class QMovie;
+class QPropertyAnimation;
+
+class LoadingScreen : public QWidget {
+ Q_OBJECT
+
+public:
+ explicit LoadingScreen(QWidget* parent = nullptr);
+
+ ~LoadingScreen();
+
+ /// Call before showing the loading screen to load the widgets with the logo and banner for the
+ /// currently loaded application.
+ void Prepare(Loader::AppLoader& loader);
+
+ /// After the loading screen is hidden, the owner of this class can call this to clean up any
+ /// used resources such as the logo and banner.
+ void Clear();
+
+ /// Slot used to update the status of the progress bar
+ void OnLoadProgress(VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total);
+
+ /// Hides the LoadingScreen with a fade out effect
+ void OnLoadComplete();
+
+ // In order to use a custom widget with a stylesheet, you need to override the paintEvent
+ // See https://wiki.qt.io/How_to_Change_the_Background_Color_of_QWidget
+ void paintEvent(QPaintEvent* event) override;
+
+signals:
+ void LoadProgress(VideoCore::LoadCallbackStage stage, std::size_t value, std::size_t total);
+ /// Signals that this widget is completely hidden now and should be replaced with the other
+ /// widget
+ void Hidden();
+
+private:
+#ifndef YUZU_QT_MOVIE_MISSING
+ std::unique_ptr<QMovie> animation;
+ std::unique_ptr<QBuffer> backing_buf;
+ std::unique_ptr<QByteArray> backing_mem;
+#endif
+ std::unique_ptr<Ui::LoadingScreen> ui;
+ std::size_t previous_total = 0;
+ VideoCore::LoadCallbackStage previous_stage;
+
+ QGraphicsOpacityEffect* opacity_effect = nullptr;
+ std::unique_ptr<QPropertyAnimation> fadeout_animation;
+
+ // Definitions for the differences in text and styling for each stage
+ std::unordered_map<VideoCore::LoadCallbackStage, const char*> progressbar_style;
+ std::unordered_map<VideoCore::LoadCallbackStage, QString> stage_translations;
+
+ // newly generated shaders are added to the end of the file, so when loading and compiling
+ // shaders, it will start quickly but end slow if new shaders were added since previous launch.
+ // These variables are used to detect the change in speed so we can generate an ETA
+ bool slow_shader_compile_start = false;
+ std::chrono::steady_clock::time_point slow_shader_start;
+ std::chrono::steady_clock::time_point previous_time;
+ std::size_t slow_shader_first_value = 0;
+};
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+Q_DECLARE_METATYPE(VideoCore::LoadCallbackStage);
+#endif