From fdfc6ef249847bf7314cd0273df2b96dc26df3d2 Mon Sep 17 00:00:00 2001 From: Jakub Neruda Date: Sat, 17 Feb 2024 13:37:23 +0100 Subject: [PATCH] Add loading message when launching game from editor --- src/lib-app/include/app/AppStateEditor.hpp | 7 ++++++ src/lib-app/src/app/AppStateEditor.cpp | 23 ++++++++++++++++-- src/lib-defines/include/Configs/Strings.hpp | 4 ++++ .../include/Dialogs/LoadingDialog.hpp | 20 ++++++++++++++++ .../src/Dialogs/ErrorInfoDialog.cpp | 3 ++- src/lib-editor/src/Dialogs/LoadingDialog.cpp | 24 +++++++++++++++++++ 6 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 src/lib-editor/include/Dialogs/LoadingDialog.hpp create mode 100644 src/lib-editor/src/Dialogs/LoadingDialog.cpp diff --git a/src/lib-app/include/app/AppStateEditor.hpp b/src/lib-app/include/app/AppStateEditor.hpp index cf7cd3ec..33f28f33 100644 --- a/src/lib-app/include/app/AppStateEditor.hpp +++ b/src/lib-app/include/app/AppStateEditor.hpp @@ -4,6 +4,7 @@ #include "Commands/CommandHistory.hpp" #include "Commands/CommandQueue.hpp" #include "Dialogs/LoadLevelDialog.hpp" +#include "Dialogs/LoadingDialog.hpp" #include "Dialogs/NewLevelDialog.hpp" #include "Dialogs/SaveLevelDialog.hpp" #include "Editor/Editor.hpp" @@ -18,6 +19,7 @@ #include #include #include +#include import Memory; import Options; @@ -55,6 +57,7 @@ class AppStateEditor : public dgm::AppState virtual void restoreFocus() { jukebox->stop(); + dialogLoading.close(); } protected: @@ -102,6 +105,7 @@ class AppStateEditor : public dgm::AppState std::optional pathToConfigOverride = {}); void handleSaveLevel(bool forceNewPath = false) noexcept; void saveLevel(); + void handlePlayLevelWrapper(bool useBot); void handlePlayLevel(bool useBot); void handleUndo(); void handleRedo(); @@ -148,8 +152,11 @@ class AppStateEditor : public dgm::AppState ModernNewLevelDialog dialogNewLevel; LoadLevelDialog dialogLoadLevel; NewSaveLevelDialog dialogSaveLevel; + LoadingDialog dialogLoading; ClickPreventer clickPreventer; mem::Rc levelMetadata; + std::stack> delayedActions; + int delayActionsForNumFrames = 0; std::function onStateChanged = [this] { diff --git a/src/lib-app/src/app/AppStateEditor.cpp b/src/lib-app/src/app/AppStateEditor.cpp index 8b845a7c..9b96c028 100644 --- a/src/lib-app/src/app/AppStateEditor.cpp +++ b/src/lib-app/src/app/AppStateEditor.cpp @@ -38,6 +38,7 @@ AppStateEditor::AppStateEditor( , dialogLoadLevel(gui, settings->cmdSettings.resourcesDir) , dialogSaveLevel( gui, Filesystem::getLevelsDir(settings->cmdSettings.resourcesDir)) + , dialogLoading(gui) { jukebox->stop(); @@ -145,6 +146,14 @@ void AppStateEditor::update() { clickPreventer.update(); + while (!delayedActions.empty() && delayActionsForNumFrames == 0) + { + delayedActions.top()(); + delayedActions.pop(); + } + + if (delayActionsForNumFrames > 0) delayActionsForNumFrames--; + if (commandQueue->isEmpty()) return; unsavedChanges = true; @@ -235,8 +244,10 @@ tgui::MenuBar::Ptr AppStateEditor::buildMenuBarLayout( SAVE, [this] { handleSaveLevel(); }, sf::Keyboard::S); addFileMenuItem(SAVE_AS, [this] { handleSaveLevel(true); }); addFileMenuItem( - PLAY, [this] { handlePlayLevel("useBot"_false); }, sf::Keyboard::F5); - addFileMenuItem(PLAY2P, [this] { handlePlayLevel("useBot"_true); }); + PLAY, + [this] { handlePlayLevelWrapper("useBot"_false); }, + sf::Keyboard::F5); + addFileMenuItem(PLAY2P, [this] { handlePlayLevelWrapper("useBot"_true); }); addFileMenuItem( UNDO, [this] { handleUndo(); }, sf::Keyboard::Z); addFileMenuItem( @@ -363,6 +374,13 @@ void AppStateEditor::saveLevel() } } +void AppStateEditor::handlePlayLevelWrapper(bool useBot) +{ + dialogLoading.open(Strings::Dialog::Message::COMPUTING_DISTANCE_INDEX); + delayedActions.push([this, useBot]() { handlePlayLevel(useBot); }); + delayActionsForNumFrames = 1; +} + void AppStateEditor::handlePlayLevel(bool useBot) { if (savePath.empty()) @@ -385,6 +403,7 @@ void AppStateEditor::handlePlayLevel(bool useBot) auto lvd = LevelD {}; lvd.loadFromFile(savePath); + app.pushState( resmgr, nativeGui, diff --git a/src/lib-defines/include/Configs/Strings.hpp b/src/lib-defines/include/Configs/Strings.hpp index 0f6e03d1..ea580092 100644 --- a/src/lib-defines/include/Configs/Strings.hpp +++ b/src/lib-defines/include/Configs/Strings.hpp @@ -75,6 +75,8 @@ namespace Strings RAWSTRING SAVE_LEVEL = "Save level"; RAWSTRING EDIT_METADATA = "Edit level metadata"; RAWSTRING NEW_LEVEL = "New level"; + RAWSTRING ERR = "Error"; + RAWSTRING LOADING = "Loading"; } // namespace Title namespace Message @@ -86,6 +88,8 @@ namespace Strings "Cannot play level because no level is opened."; RAWSTRING LEVEL_NAME_EMPTY = "Level name cannot be empty."; RAWSTRING LEVEL_NAME_TAKEN = "Level name is already taken"; + RAWSTRING BAKING_LIGHTS = "Baking in lights..."; + RAWSTRING COMPUTING_DISTANCE_INDEX = "Computing distance index..."; } // namespace Message namespace Body diff --git a/src/lib-editor/include/Dialogs/LoadingDialog.hpp b/src/lib-editor/include/Dialogs/LoadingDialog.hpp new file mode 100644 index 00000000..d5c75800 --- /dev/null +++ b/src/lib-editor/include/Dialogs/LoadingDialog.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "Gui.hpp" +#include "Interfaces/DialogInterfaces.hpp" + +import Memory; + +class [[nodiscard]] LoadingDialog final +{ +public: + LoadingDialog(mem::Rc gui) noexcept : gui(gui) {} + +public: + void open(const std::string& text); + void close(); + +private: + mem::Rc gui; + constexpr static inline const char* DIALOG_ID = "LoadingDialog"; +}; diff --git a/src/lib-editor/src/Dialogs/ErrorInfoDialog.cpp b/src/lib-editor/src/Dialogs/ErrorInfoDialog.cpp index 5146cdbe..54597756 100644 --- a/src/lib-editor/src/Dialogs/ErrorInfoDialog.cpp +++ b/src/lib-editor/src/Dialogs/ErrorInfoDialog.cpp @@ -1,9 +1,10 @@ #include "Dialogs/ErrorInfoDialog.hpp" #include "Globals.hpp" +#include void ErrorInfoDialog::open(const std::string& text) { - auto modal = gui->createNewChildWindow("Error"); + auto modal = gui->createNewChildWindow(Strings::Dialog::Title::ERR); modal->setSize("30%", "20%"); modal->setPosition("35%", "40%"); modal->setPositionLocked(true); diff --git a/src/lib-editor/src/Dialogs/LoadingDialog.cpp b/src/lib-editor/src/Dialogs/LoadingDialog.cpp new file mode 100644 index 00000000..286d37c9 --- /dev/null +++ b/src/lib-editor/src/Dialogs/LoadingDialog.cpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +void LoadingDialog::open(const std::string& text) +{ + auto modal = gui->createNewChildWindow(Strings::Dialog::Title::LOADING); + modal->setSize("50%", "20%"); + modal->setPosition("25%", "40%"); + modal->setPositionLocked(true); + gui->addModal(modal, DIALOG_ID); + + auto label = tgui::Label::create(text); + label->setSize({ "98%", "98%" }); + label->setPosition({ "1%", "1%" }); + label->setTextSize(Sizers::GetMenuBarTextHeight()); + modal->add(label); +} + +void LoadingDialog::close() +{ + gui->closeModal(DIALOG_ID); +}