From 779a7c6479f74bfd7b988c9b4794ed4f96d403d2 Mon Sep 17 00:00:00 2001 From: StackZ <47382115+SuperSaiyajinStackZ@users.noreply.github.com> Date: Wed, 27 May 2020 13:49:37 +0200 Subject: [PATCH] Add Fade effects. Also change me to `SuperSaiyajinStackie`. Also update for latest Universal-Core changes. --- Universal-Core | 2 +- assets/gfx/sprites/credits/stackZ.png | Bin 16312 -> 0 bytes assets/gfx/sprites/credits/stackie.png | Bin 0 -> 18338 bytes include/gui/gfx.hpp | 3 +- include/gui/msg.hpp | 3 +- include/screens/credits.hpp | 3 +- include/screens/exiting.hpp | 38 ++++++++++++ include/screens/ftpScreen.hpp | 3 +- include/screens/mainMenu.hpp | 3 +- include/screens/scriptBrowse.hpp | 3 +- include/screens/scriptCreator.hpp | 3 +- include/screens/scriptlist.hpp | 3 +- include/screens/settings.hpp | 10 +++- include/screens/unistore.hpp | 3 +- include/utils/config.hpp | 2 +- include/utils/stringutils.hpp | 3 +- romfs/lang/en/app.json | 9 ++- source/gui/msg.cpp | 14 +++-- source/init.cpp | 41 +++++++------ source/screens/credits.cpp | 16 ++--- source/screens/exiting.cpp | 37 ++++++++++++ source/screens/ftpScreen.cpp | 14 ++--- source/screens/mainMenu.cpp | 23 +++---- source/screens/scriptBrowse.cpp | 14 +++-- source/screens/scriptCreator.cpp | 11 ++-- source/screens/scriptlist.cpp | 24 ++++---- source/screens/settings.cpp | 80 ++++++++++++++++++------- source/screens/unistore.cpp | 17 ++++-- source/utils/config.cpp | 11 +++- 29 files changed, 267 insertions(+), 126 deletions(-) delete mode 100644 assets/gfx/sprites/credits/stackZ.png create mode 100644 assets/gfx/sprites/credits/stackie.png create mode 100644 include/screens/exiting.hpp create mode 100644 source/screens/exiting.cpp diff --git a/Universal-Core b/Universal-Core index c82ad8d..d0d78f2 160000 --- a/Universal-Core +++ b/Universal-Core @@ -1 +1 @@ -Subproject commit c82ad8d6e11e4842c6099b53595aa3692f24910b +Subproject commit d0d78f2bfbda1e37d1edd93fa9e3644860ed56d5 diff --git a/assets/gfx/sprites/credits/stackZ.png b/assets/gfx/sprites/credits/stackZ.png deleted file mode 100644 index 6006788e4f9ccfd7c10a824e771515edbf95feb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16312 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�p zVk&DhJR-|(NCYV)zVva0yY41XV;dA++_oYd+D;&qRs?P^LOlDfZ_gHt##Dw2^Uok1 z!7#I4k(TvjhgM+_{{9!f_?^aPBD_s(+qHkTs%`axFdztgE28B(m+qWa7_&aI#)?`= zpPdklt)OD}_{NC$lewSV*=%}5%pDIuNT-b{qIiBEs(mrnSh zZwv -namespace Msg -{ +namespace Msg { void DisplayMsg(std::string text); void DisplayWarnMsg(std::string Text); bool promptMsg(std::string promptMsg); diff --git a/include/screens/credits.hpp b/include/screens/credits.hpp index 208c9bf..8181b7c 100644 --- a/include/screens/credits.hpp +++ b/include/screens/credits.hpp @@ -32,8 +32,7 @@ #include -class Credits : public Screen -{ +class Credits : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; diff --git a/include/screens/exiting.hpp b/include/screens/exiting.hpp new file mode 100644 index 0000000..b2345d0 --- /dev/null +++ b/include/screens/exiting.hpp @@ -0,0 +1,38 @@ +/* +* This file is part of Universal-Updater +* Copyright (C) 2019-2020 DeadPhoenix8091, Epicpkmn11, Flame, RocketRobz, StackZ, TotallyNotGuy +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* Additional Terms 7.b and 7.c of GPLv3 apply to this file: +* * Requiring preservation of specified reasonable legal notices or +* author attributions in that material or in the Appropriate Legal +* Notices displayed by works containing it. +* * Prohibiting misrepresentation of the origin of that material, +* or requiring that modified versions of such material be marked in +* reasonable ways as different from the original version. +*/ + +#ifndef EXITING_HPP +#define EXITING_HPP + +#include "common.hpp" + +class Exiting : public Screen { +public: + void Draw(void) const override; + void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; +}; + +#endif \ No newline at end of file diff --git a/include/screens/ftpScreen.hpp b/include/screens/ftpScreen.hpp index 61a530b..7a4f1fe 100644 --- a/include/screens/ftpScreen.hpp +++ b/include/screens/ftpScreen.hpp @@ -29,8 +29,7 @@ #include -class FTPScreen : public Screen -{ +class FTPScreen : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; diff --git a/include/screens/mainMenu.hpp b/include/screens/mainMenu.hpp index 1b71455..bd8b6d6 100644 --- a/include/screens/mainMenu.hpp +++ b/include/screens/mainMenu.hpp @@ -32,8 +32,7 @@ #include -class MainMenu : public Screen -{ +class MainMenu : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; diff --git a/include/screens/scriptBrowse.hpp b/include/screens/scriptBrowse.hpp index 1b9cb8d..ce72521 100644 --- a/include/screens/scriptBrowse.hpp +++ b/include/screens/scriptBrowse.hpp @@ -33,8 +33,7 @@ #include -class ScriptBrowse : public Screen -{ +class ScriptBrowse : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; diff --git a/include/screens/scriptCreator.hpp b/include/screens/scriptCreator.hpp index a441b18..ee228f9 100644 --- a/include/screens/scriptCreator.hpp +++ b/include/screens/scriptCreator.hpp @@ -32,8 +32,7 @@ #include -class ScriptCreator : public Screen -{ +class ScriptCreator : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; diff --git a/include/screens/scriptlist.hpp b/include/screens/scriptlist.hpp index 4459422..d7e8dd1 100644 --- a/include/screens/scriptlist.hpp +++ b/include/screens/scriptlist.hpp @@ -34,8 +34,7 @@ #include -class ScriptList : public Screen -{ +class ScriptList : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; diff --git a/include/screens/settings.hpp b/include/screens/settings.hpp index ef00f7c..a6a8dd3 100644 --- a/include/screens/settings.hpp +++ b/include/screens/settings.hpp @@ -33,8 +33,7 @@ #include -class Settings : public Screen -{ +class Settings : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; @@ -65,6 +64,13 @@ private: {80, 150, 149, 52} // Credits. }; + std::vector mainButtons2 = { + {0, 60, 149, 52}, // Change Music File. + {162, 60, 149, 52}, // Change bar style. + {0, 130, 149, 52}, // Change Key Delay. + {162, 130, 149, 52} // Toggle animation. + }; + std::vector arrowPos = { {0, 0, 25, 25}, // Previous Arrow. {295, 0, 25, 25}, // Next Arrow. diff --git a/include/screens/unistore.hpp b/include/screens/unistore.hpp index 0b143a0..a2c6305 100644 --- a/include/screens/unistore.hpp +++ b/include/screens/unistore.hpp @@ -34,8 +34,7 @@ #include -class UniStore : public Screen -{ +class UniStore : public Screen { public: void Draw(void) const override; void Logic(u32 hDown, u32 hHeld, touchPosition touch) override; diff --git a/include/utils/config.hpp b/include/utils/config.hpp index 21fa5d2..4f99684 100644 --- a/include/utils/config.hpp +++ b/include/utils/config.hpp @@ -32,7 +32,7 @@ namespace Config { extern int LangPath, Color1, Color2, Color3, TxtColor, SelectedColor, UnselectedColor, viewMode, progressbarColor, autoboot, outdated, uptodate, notFound, future, Button, keyDelay; extern std::string lang, ScriptPath, MusicPath, StorePath, AutobootFile; - extern bool Logging, UseBars, GodMode; + extern bool Logging, UseBars, fading; void load(); void save(); diff --git a/include/utils/stringutils.hpp b/include/utils/stringutils.hpp index f08a4b0..fc7a6ec 100644 --- a/include/utils/stringutils.hpp +++ b/include/utils/stringutils.hpp @@ -5,8 +5,7 @@ bool matchPattern(std::string pattern, std::string tested); -namespace StringUtils -{ +namespace StringUtils { std::string format(const std::string& fmt_str, ...); } diff --git a/romfs/lang/en/app.json b/romfs/lang/en/app.json index 9c43909..8165494 100644 --- a/romfs/lang/en/app.json +++ b/romfs/lang/en/app.json @@ -56,7 +56,7 @@ "CREDITS": "Credits", "DEVELOPED_BY": "Developed by: Universal-Team.", - "MAIN_DEV": "Main Developer: StackZ", + "MAIN_DEV": "Main Developer: SuperSaiyajinStackie", "CURRENT_VERSION": "Current version: ", "MANY_THANKS": "Many Thanks to:", "TRANSLATORS": "All our Translators", @@ -171,5 +171,10 @@ "MOVE_ERROR": "Move Error!", "DELETE_ERROR": "Delete Error!", "CHANGE_KEY_DELAY": "Change Key Delay", - "ENTER_KEY_DELAY": "Enter the Key Delay for Scrolling." + "ENTER_KEY_DELAY": "Enter the Key Delay for Scrolling.", + "TOGGLE_FADE": "Toggle Fade Effect", + "TOGGLE_FADE_ENABLE": "Would you like to enable the Screen fade effect?", + "TOGGLE_FADE_DISABLE": "Would you like to disable the Screen fade effect?", + "ENABLED": "Enabled!", + "DISABLED": "Disabled!" } diff --git a/source/gui/msg.cpp b/source/gui/msg.cpp index 0d50624..d9e46c5 100644 --- a/source/gui/msg.cpp +++ b/source/gui/msg.cpp @@ -34,6 +34,7 @@ extern u32 bgTopColor; extern u32 bgBottomColor; extern u32 TextColor; +// I do not think we need that at all. void Msg::DisplayStartMSG() { Gui::clearTextBufs(); C3D_FrameBegin(C3D_FRAME_SYNCDRAW); @@ -44,12 +45,15 @@ void Msg::DisplayStartMSG() { Gui::Draw_Rect(0, 25, 400, 190, Config::Color2); Gui::Draw_Rect(0, 215, 400, 25, Config::Color1); Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, Lang::get("STARTING_UNIVERSAL_UPDATER")); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect Gui::ScreenDraw(Bottom); Gui::Draw_Rect(0, 0, 320, 25, Config::Color1); Gui::Draw_Rect(0, 25, 320, 190, Config::Color2); Gui::Draw_Rect(0, 215, 320, 25, Config::Color1); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect C3D_FrameEnd(0); } + void Msg::DisplayMsg(std::string text) { Gui::clearTextBufs(); C3D_FrameBegin(C3D_FRAME_SYNCDRAW); @@ -65,8 +69,7 @@ void Msg::DisplayMsg(std::string text) { C3D_FrameEnd(0); } -void Msg::DisplayWarnMsg(std::string Text) -{ +void Msg::DisplayWarnMsg(std::string Text) { Gui::clearTextBufs(); C3D_FrameBegin(C3D_FRAME_SYNCDRAW); C2D_TargetClear(Top, BLACK); @@ -94,8 +97,7 @@ extern touchPosition touch; extern bool touching(touchPosition touch, Structs::ButtonPos button); // Display a Message, which needs to be confirmed with A/B. -bool Msg::promptMsg(std::string promptMsg) -{ +bool Msg::promptMsg(std::string promptMsg) { Gui::clearTextBufs(); C3D_FrameBegin(C3D_FRAME_SYNCDRAW); C2D_TargetClear(Top, BLACK); @@ -108,6 +110,7 @@ bool Msg::promptMsg(std::string promptMsg) Gui::DrawStringCentered(0, (240-Gui::GetStringHeight(0.6f, promptMsg))/2, 0.6f, TextColor, promptMsg, 395, 70); Gui::DrawStringCentered(0, 217, 0.72f, TextColor, Lang::get("CONFIRM_OR_CANCEL"), 400); } + GFX::DrawBottom(); if (isScriptSelected == false) { Gui::Draw_Rect(10, 100, 140, 35, Config::Color1); @@ -122,8 +125,7 @@ bool Msg::promptMsg(std::string promptMsg) } C3D_FrameEnd(0); - while(1) - { + while(1) { gspWaitForVBlank(); hidScanInput(); hidTouchRead(&touch); diff --git a/source/init.cpp b/source/init.cpp index eeba792..4c77156 100644 --- a/source/init.cpp +++ b/source/init.cpp @@ -40,10 +40,6 @@ #include #include -// The classic Fade Effect! ;P -int fadealpha = 255; -bool fadein = true; - bool exiting = false; bool dspFound = false; touchPosition touch; @@ -100,11 +96,18 @@ Result Init::Initialize() { mkdir("sdmc:/3ds/Universal-Updater/stores", 0777); // We need to make sure, the file exist. - if(access("sdmc:/3ds/Universal-Updater/Settings.json", F_OK) == -1 ) { + if (access("sdmc:/3ds/Universal-Updater/Settings.json", F_OK) == -1 ) { Config::initializeNewConfig(); } + Config::load(); Lang::load(Config::lang); + + if (Config::fading) { + fadein = true; + fadealpha = 255; + } + // In case it takes a bit longer to autoboot a script or so. Msg::DisplayStartMSG(); if (Config::Logging == true) { @@ -116,24 +119,24 @@ Result Init::Initialize() { if (Config::autoboot == 1) { if (access(Config::AutobootFile.c_str(), F_OK) == 0) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), false, true); } else { AutobootWhat = 0; Config::autoboot = 0; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), false, true); } } else if (Config::autoboot == 2) { if (access(Config::AutobootFile.c_str(), F_OK) == 0) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), false, true); } else { AutobootWhat = 0; Config::autoboot = 0; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), false, true); } } else { AutobootWhat = 0; Config::autoboot = 0; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), false, true); } osSetSpeedupEnable(true); // Enable speed-up for New 3DS users @@ -151,10 +154,8 @@ Result Init::Initialize() { Result Init::MainLoop() { // Initialize everything. Initialize(); - // Loop as long as the status is not exiting. - while (aptMainLoop() && !exiting) - { + while (aptMainLoop()) { hidScanInput(); u32 hHeld = hidKeysHeld(); u32 hDown = hidKeysDown(); @@ -163,17 +164,15 @@ Result Init::MainLoop() { C2D_TargetClear(Top, BLACK); C2D_TargetClear(Bottom, BLACK); Gui::clearTextBufs(); - Gui::mainLoop(hDown, hHeld, touch); + Gui::DrawScreen(true); + Gui::ScreenLogic(hDown, hHeld, touch, true, true); C3D_FrameEnd(0); gspWaitForVBlank(); - - if (fadein == true) { - fadealpha -= 3; - if (fadealpha < 0) { - fadealpha = 0; - fadein = false; - } + if (exiting) { + if (!fadeout) break; } + + Gui::fadeEffects(16, 16, true); } // Exit all services and exit the app. Exit(); diff --git a/source/screens/credits.cpp b/source/screens/credits.cpp index 7c80f4b..cddaa9a 100644 --- a/source/screens/credits.cpp +++ b/source/screens/credits.cpp @@ -39,7 +39,7 @@ const std::vector Translators = { "lemonnade0", "Pk11", "Roby Spia", - "StackZ", + "SuperSaiyajinStackie", "XDgierman", "YoSoy" }; @@ -66,15 +66,15 @@ const std::vector UniversalTeam = { "FlameKat53", "Pk11", "RocketRobz", - "StackZ", + "SuperSaiyajinStackie", "TotallyNotGuy" }; // Script Page 3. const std::vector ScriptCreators = { - "DualBladedKirito", "Glazed_Belmont", "Pk11", "StackZ", "The Conceptionist", "YoSoy" + "cooolgamer", "DualBladedKirito", "Glazed_Belmont", "Pk11", "SuperSaiyajinStackie", "The Conceptionist", "YoSoy" }; -const std::vector ScriptAmount = {"1", "1", "1", "5", "10", "1 | 2"}; +const std::vector ScriptAmount = {"1", "1", "1", "1", "5", "10", "1 | 2"}; void Credits::Draw(void) const { std::string title = "Universal-Updater - "; @@ -87,8 +87,8 @@ void Credits::Draw(void) const { Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, title, 400); } Gui::DrawStringCentered(0, 30, 0.7f, Config::TxtColor, Lang::get("DEVELOPED_BY"), 390); - Gui::DrawStringCentered(0, 70, 0.7f, Config::TxtColor, Lang::get("MAIN_DEV"), 390); - GFX::DrawSprite(sprites_stackZ_idx, 5, 85); + Gui::DrawStringCentered(0, 60, 0.7f, Config::TxtColor, Lang::get("MAIN_DEV"), 390); + GFX::DrawSprite(sprites_stackie_idx, 5, 85); GFX::DrawSprite(sprites_universal_core_idx, 200, 110); std::string currentVersion = Lang::get("CURRENT_VERSION"); currentVersion += V_STRING; @@ -97,7 +97,9 @@ void Credits::Draw(void) const { Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(0, 0, 0, 190)); GFX::DrawSprite(sprites_discord_idx, 115, 35); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect DrawBottom(); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void Credits::DrawBottom(void) const { @@ -211,7 +213,7 @@ void Credits::Logic(u32 hDown, u32 hHeld, touchPosition touch) { } if (hDown & KEY_B) { - Gui::screenBack(); + Gui::screenBack(Config::fading); return; } diff --git a/source/screens/exiting.cpp b/source/screens/exiting.cpp new file mode 100644 index 0000000..b3868bb --- /dev/null +++ b/source/screens/exiting.cpp @@ -0,0 +1,37 @@ +/* +* This file is part of Universal-Updater +* Copyright (C) 2019-2020 DeadPhoenix8091, Epicpkmn11, Flame, RocketRobz, StackZ, TotallyNotGuy +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* Additional Terms 7.b and 7.c of GPLv3 apply to this file: +* * Requiring preservation of specified reasonable legal notices or +* author attributions in that material or in the Appropriate Legal +* Notices displayed by works containing it. +* * Prohibiting misrepresentation of the origin of that material, +* or requiring that modified versions of such material be marked in +* reasonable ways as different from the original version. +*/ + +#include "common.hpp" +#include "exiting.hpp" + +void Exiting::Draw(void) const { + GFX::DrawTop(); + Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, 255)); // Fade in/out effect + Gui::ScreenDraw(Bottom); + Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, 255)); // Fade in/out effect +} + +void Exiting::Logic(u32 hDown, u32 hHeld, touchPosition touch) { } \ No newline at end of file diff --git a/source/screens/ftpScreen.cpp b/source/screens/ftpScreen.cpp index 09e28d3..39c383d 100644 --- a/source/screens/ftpScreen.cpp +++ b/source/screens/ftpScreen.cpp @@ -24,7 +24,6 @@ * reasonable ways as different from the original version. */ - #include "ftpScreen.hpp" #include @@ -38,8 +37,7 @@ extern "C" { extern bool touching(touchPosition touch, Structs::ButtonPos button); extern touchPosition touch; -void FTPScreen::Draw(void) const -{ +void FTPScreen::Draw(void) const { ftp_init(); Result ret = 0; char buf[137], hostname[128]; @@ -56,6 +54,7 @@ void FTPScreen::Draw(void) const } else { Gui::DrawString((400-Gui::GetStringWidth(0.7f, Lang::get("FTP_MODE")))/2, 2, 0.7f, Config::TxtColor, Lang::get("FTP_MODE"), 400); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(0, 218, 0, 1); ret = ACU_GetWifiStatus(&wifiStatus); @@ -77,7 +76,7 @@ void FTPScreen::Draw(void) const Gui::DrawStringCentered(0, 60, 0.48, Config::TxtColor, buf, 320); Gui::DrawStringCentered(0, 222, 0.48f, Config::TxtColor, Lang::get("B_FTP_EXIT"), 320); - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect Gui::clearTextBufs(); C3D_FrameEnd(0); hidScanInput(); @@ -91,11 +90,8 @@ void FTPScreen::Draw(void) const memset(ftp_file_transfer, 0, 50); // Empty transfer status. ftp_exit(); - Gui::screenBack(); - return; + Gui::screenBack(false); } // Needed here, otherwise it won't compile. -void FTPScreen::Logic(u32 hDown, u32 hHeld, touchPosition touch) -{ -} \ No newline at end of file +void FTPScreen::Logic(u32 hDown, u32 hHeld, touchPosition touch) { } \ No newline at end of file diff --git a/source/screens/mainMenu.cpp b/source/screens/mainMenu.cpp index 9f5b2b6..695ca0f 100644 --- a/source/screens/mainMenu.cpp +++ b/source/screens/mainMenu.cpp @@ -25,6 +25,7 @@ */ #include "config.hpp" +#include "exiting.hpp" #include "ftpScreen.hpp" #include "mainMenu.hpp" #include "scriptHelper.hpp" @@ -49,7 +50,7 @@ void MainMenu::Draw(void) const { Gui::DrawString(397-Gui::GetStringWidth(0.5f, V_STRING), 237-Gui::GetStringHeight(0.5f, V_STRING), 0.5f, Config::TxtColor, V_STRING); } - if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(0, 0, 0, fadealpha)); // Fade in out effect + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(0, 218, 0, 1); @@ -62,12 +63,14 @@ void MainMenu::Draw(void) const { // Draw UniStore Icon. ;P //GFX::DrawSprite(sprites_uniStore_idx, 10, 65); - if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(0, 0, 0, fadealpha)); // Fade in out effect + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void MainMenu::Logic(u32 hDown, u32 hHeld, touchPosition touch) { if ((hDown & KEY_START) || (hDown & KEY_TOUCH && touching(touch, mainButtons[4]))) { exiting = true; + Gui::setScreen(std::make_unique(), Config::fading, true); + fadecolor = 0; } // Navigation. @@ -84,29 +87,29 @@ void MainMenu::Logic(u32 hDown, u32 hHeld, touchPosition touch) { if (hDown & KEY_A) { switch(Selection) { case 0: - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); break; case 1: - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); break; case 2: - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); break; case 3: - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), false, true); break; } } if (hDown & KEY_TOUCH) { if (touching(touch, mainButtons[0])) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else if (touching(touch, mainButtons[1])) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else if (touching(touch, mainButtons[2])) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else if (touching(touch, mainButtons[3])) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), false, true); } } } \ No newline at end of file diff --git a/source/screens/scriptBrowse.cpp b/source/screens/scriptBrowse.cpp index e10d464..6fd6c8b 100644 --- a/source/screens/scriptBrowse.cpp +++ b/source/screens/scriptBrowse.cpp @@ -94,6 +94,7 @@ ScriptBrowse::ScriptBrowse() { loaded = false; return; } + FILE* file = fopen(metaFile, "r"); if(file) { infoJson = nlohmann::json::parse(file, nullptr, false); @@ -167,6 +168,7 @@ void ScriptBrowse::DrawBrowse(void) const { } else if(infoJson[Selection]["curRevision"] > infoJson[Selection]["revision"]) { Gui::DrawStringCentered(0, 219, 0.7f, Config::TxtColor, Lang::get("FUTURE_SCRIPT"), 370); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(295, -1); GFX::DrawArrow(315, 240, 180.0); @@ -244,8 +246,10 @@ void ScriptBrowse::DrawBrowse(void) const { Gui::DrawString(dropPos[1].x+30, dropPos[1].y+5, 0.4f, Config::TxtColor, Lang::get("REFRESH_BROWSE_DDM"), 100); Gui::DrawString(dropPos[2].x+30, dropPos[2].y+5, 0.4f, Config::TxtColor, Lang::get("VIEW_DDM"), 100); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } else { GFX::DrawBottom(); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } } @@ -273,7 +277,7 @@ void ScriptBrowse::DrawGlossary(void) const { Gui::DrawString(15, 185, 0.7f, Config::TxtColor, std::to_string(int64_t(infoJson[Selection]["curRevision"])) + " | " + std::to_string(int64_t(infoJson[Selection]["revision"])), 40); Gui::DrawString(65, 185, 0.7f, Config::TxtColor, Lang::get("REVISION"), 300); - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawSpriteBlend(sprites_download_all_idx, 20, 25); Gui::DrawString(50, 27, 0.6f, Config::TxtColor, Lang::get("DOWNLOAD_ALL"), 260); @@ -290,8 +294,10 @@ void ScriptBrowse::DrawGlossary(void) const { GFX::DrawSpriteBlend(sprites_update_idx, 20, 195); Gui::DrawString(50, 197, 0.6f, Config::TxtColor, Lang::get("REFRESH_SCRIPTBROWSE"), 260); GFX::DrawArrow(0, 218, 0, 1); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } else { GFX::DrawBottom(); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } } @@ -375,8 +381,7 @@ void ScriptBrowse::Logic(u32 hDown, u32 hHeld, touchPosition touch) { } else { if ((hDown & KEY_B) || (hDown & KEY_TOUCH && touching(touch, arrowPos[2]))) { infoJson.clear(); - Gui::screenBack(); - return; + Gui::screenBack(Config::fading); } if (mode == 0) { if ((hHeld & KEY_DOWN && !keyRepeatDelay) || (hDown & KEY_TOUCH && touching(touch, arrowPos[1]))) { @@ -516,8 +521,7 @@ void ScriptBrowse::Logic(u32 hDown, u32 hHeld, touchPosition touch) { } } else { if (hDown & KEY_B) { - Gui::screenBack(); - return; + Gui::screenBack(Config::fading); } } } \ No newline at end of file diff --git a/source/screens/scriptCreator.cpp b/source/screens/scriptCreator.cpp index 46fdcfb..92869fc 100644 --- a/source/screens/scriptCreator.cpp +++ b/source/screens/scriptCreator.cpp @@ -83,7 +83,7 @@ void ScriptCreator::DrawSubMenu(void) const { } else { Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, Lang::get("SCRIPTCREATOR"), 400); } - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); for (int i = 0; i < 2; i++) { @@ -96,6 +96,7 @@ void ScriptCreator::DrawSubMenu(void) const { Gui::DrawString((320-Gui::GetStringWidth(0.6f, "New script"))/2, mainButtons[0].y+10, 0.6f, Config::TxtColor, "New script", 140); Gui::DrawString((320-Gui::GetStringWidth(0.6f, "Existing script"))/2, mainButtons[1].y+10, 0.6f, Config::TxtColor, "Existing script", 140); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void ScriptCreator::DrawScriptScreen(void) const { @@ -105,7 +106,7 @@ void ScriptCreator::DrawScriptScreen(void) const { } else { Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, "Selected Entry: " + entryName, 400); } - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); // Draw Page. @@ -142,6 +143,7 @@ void ScriptCreator::DrawScriptScreen(void) const { Gui::DrawString((320-Gui::GetStringWidth(0.6f, "rmdir"))/2-150+70, creatorButtons[0].y+10, 0.6f, Config::TxtColor, "rmdir", 140); Gui::DrawString((320-Gui::GetStringWidth(0.6f, "mkfile"))/2+150-70, creatorButtons[1].y+10, 0.6f, Config::TxtColor, "mkfile", 140); Gui::DrawString((320-Gui::GetStringWidth(0.6f, "TimeMsg"))/2-150+70, creatorButtons[2].y+10, 0.6f, Config::TxtColor, "TimeMsg", 140); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } } @@ -284,7 +286,7 @@ void ScriptCreator::setInfoStuff(void) { void ScriptCreator::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { if (hDown & KEY_B) { - Gui::screenBack(); + Gui::screenBack(Config::fading); return; } @@ -323,7 +325,7 @@ void ScriptCreator::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { } if (hDown & KEY_DOWN) { - if(Selection == 0) Selection = 1; + if (Selection == 0) Selection = 1; } } @@ -364,7 +366,6 @@ void ScriptCreator::scriptLogic(u32 hDown, u32 hHeld, touchPosition touch) { } // Page 2. - if (hDown & KEY_R) { if (page == 0) { page = 1; diff --git a/source/screens/scriptlist.cpp b/source/screens/scriptlist.cpp index 966e552..7ff3bcb 100644 --- a/source/screens/scriptlist.cpp +++ b/source/screens/scriptlist.cpp @@ -160,7 +160,7 @@ void ScriptList::DrawSubMenu(void) const { } else { Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, Lang::get("SCRIPTS_SUBMENU"), 400); } - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(0, 218, 0, 1); @@ -170,6 +170,7 @@ void ScriptList::DrawSubMenu(void) const { GFX::DrawButton(subPos[3].x, subPos[3].y, Lang::get("CHANGE_SCRIPTPATH")); // Selector. Animation::Button(subPos[Selection].x, subPos[Selection].y, .060); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } // Load the description. @@ -192,7 +193,7 @@ ScriptList::ScriptList() { if (access(Config::AutobootFile.c_str(), F_OK) != 0) { AutobootWhat = 0; changeBackHandle = true; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } if (ScriptHelper::checkIfValid(Config::AutobootFile) == true) { @@ -213,7 +214,7 @@ ScriptList::ScriptList() { } else { AutobootWhat = 0; changeBackHandle = true; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } } } @@ -233,7 +234,7 @@ void ScriptList::DrawList(void) const { Gui::DrawStringCentered(0, 80, 0.7f, Config::TxtColor, Lang::get("TITLE") + std::string(fileInfo[Selection].title), 400); Gui::DrawStringCentered(0, 100, 0.7f, Config::TxtColor, Lang::get("AUTHOR") + std::string(fileInfo[Selection].author), 400); Gui::DrawStringCentered(0, 120, 0.6f, Config::TxtColor, std::string(fileInfo[Selection].shortDesc), 400); - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(295, -1); GFX::DrawArrow(315, 240, 180.0); @@ -284,6 +285,7 @@ void ScriptList::DrawList(void) const { Gui::DrawString(dropPos[0].x+30, dropPos[0].y+5, 0.4f, Config::TxtColor, Lang::get("DELETE_DDM"), 100); Gui::DrawString(dropPos[1].x+30, dropPos[1].y+5, 0.4f, Config::TxtColor, Lang::get("VIEW_DDM"), 100); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void ScriptList::Draw(void) const { @@ -312,6 +314,7 @@ void ScriptList::DrawSingleObject(void) const { for(uint i=0;i 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(295, -1); GFX::DrawArrow(315, 240, 180.0); @@ -353,6 +356,7 @@ void ScriptList::DrawSingleObject(void) const { // Dropdown Text. Gui::DrawString(dropPos[0].x+30, dropPos[0].y+5, 0.4f, Config::TxtColor, Lang::get("VIEW_DDM"), 100); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void ScriptList::refreshList() { @@ -377,9 +381,9 @@ void ScriptList::refreshList() { void ScriptList::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { if ((hDown & KEY_B) || (hDown & KEY_TOUCH && touching(touch, arrowPos[2]))) { if (changeBackHandle) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else { - Gui::screenBack(); + Gui::screenBack(Config::fading); return; } } @@ -413,14 +417,14 @@ void ScriptList::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { break; case 1: if (checkWifiStatus() == true) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else { notConnectedMsg(); } break; case 2: if (isTesting == true) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else { notImplemented(); } @@ -451,13 +455,13 @@ void ScriptList::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { } } else if (touching(touch, subPos[1])) { if (checkWifiStatus() == true) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else { notConnectedMsg(); } } else if (touching(touch, subPos[2])) { if (isTesting == true) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else { notImplemented(); } diff --git a/source/screens/settings.cpp b/source/screens/settings.cpp index ef76498..3f385ae 100644 --- a/source/screens/settings.cpp +++ b/source/screens/settings.cpp @@ -57,6 +57,7 @@ void Settings::DrawSubMenu(void) const { } else { Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, "Universal-Updater", 400); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(0, 218, 0, 1); GFX::DrawArrow(318, 240, 180.0, 1); @@ -66,6 +67,7 @@ void Settings::DrawSubMenu(void) const { GFX::DrawButton(mainButtons[2].x, mainButtons[2].y, Lang::get("CREDITS")); // Selector. Animation::Button(mainButtons[Selection].x, mainButtons[Selection].y, .060); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } const std::vector languages = { @@ -91,6 +93,7 @@ void Settings::DrawLanguageSelection(void) const { } else { Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, Lang::get("SELECT_LANG"), 400); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); for(int i=0;i 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } const std::vector colorList = { @@ -155,7 +159,7 @@ void Settings::DrawColorChanging(void) const { } - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); if (!dropDownMenu) { GFX::DrawArrow(0, 218, 0, 1); @@ -222,6 +226,7 @@ void Settings::DrawColorChanging(void) const { GFX::DrawButton(mainButtons[2].x, mainButtons[2].y, ColorHelper::getColorName(Config::Button, 0).c_str(), C2D_Color32(0, 0, 255, 255)); } } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void Settings::DrawMiscSettings(void) const { @@ -231,26 +236,21 @@ void Settings::DrawMiscSettings(void) const { } else { Gui::DrawStringCentered(0, 2, 0.7f, Config::TxtColor, "Universal-Updater", 400); } - + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(0, 218, 0, 1); - GFX::DrawButton(mainButtons[0].x, mainButtons[0].y, Lang::get("CHANGE_MUSICFILE")); - GFX::DrawButton(mainButtons[1].x, mainButtons[1].y, Lang::get("CHANGE_BAR_STYLE")); - GFX::DrawButton(mainButtons[2].x, mainButtons[2].y, Lang::get("CHANGE_KEY_DELAY")); + GFX::DrawButton(mainButtons2[0].x, mainButtons2[0].y, Lang::get("CHANGE_MUSICFILE")); + GFX::DrawButton(mainButtons2[1].x, mainButtons2[1].y, Lang::get("CHANGE_BAR_STYLE")); + GFX::DrawButton(mainButtons2[2].x, mainButtons2[2].y, Lang::get("CHANGE_KEY_DELAY")); + GFX::DrawButton(mainButtons2[3].x, mainButtons2[3].y, Lang::get("TOGGLE_FADE")); + // Selector. - Animation::Button(mainButtons[Selection].x, mainButtons[Selection].y, .060); + Animation::Button(mainButtons2[Selection].x, mainButtons2[Selection].y, .060); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void Settings::MiscSettingsLogic(u32 hDown, u32 hHeld, touchPosition touch) { - if (hDown & KEY_UP) { - if (Selection > 0) Selection--; - } - - if (hDown & KEY_DOWN) { - if (Selection < 2) Selection++; - } - if (hDown & KEY_A) { if (Selection == 0) { std::string tempMusic = selectFilePath(Lang::get("SELECT_MUSIC_FILE"), "sdmc:/", {"wav"}, 2); @@ -265,23 +265,51 @@ void Settings::MiscSettingsLogic(u32 hDown, u32 hHeld, touchPosition touch) { } else if (Selection == 2) { Config::keyDelay = Input::getUint(255, Lang::get("ENTER_KEY_DELAY")); changesMade = true; + } else if (Selection == 3) { + if (Config::fading) { + if (Msg::promptMsg(Lang::get("TOGGLE_FADE_DISABLE"))) { + Config::fading = false; + Msg::DisplayWarnMsg(Lang::get("DISABLED")); + changesMade = true; + } + } else { + if (Msg::promptMsg(Lang::get("TOGGLE_FADE_ENABLE"))) { + Config::fading = true; + Msg::DisplayWarnMsg(Lang::get("ENABLED")); + changesMade = true; + } + } } } if (hDown & KEY_TOUCH) { - if (touching(touch, mainButtons[0])) { + if (touching(touch, mainButtons2[0])) { std::string tempMusic = selectFilePath(Lang::get("SELECT_MUSIC_FILE"), "sdmc:/", {"wav"}, 2); if (tempMusic != "") { Config::MusicPath = tempMusic; changesMade = true; } - } else if (touching(touch, mainButtons[1])) { + } else if (touching(touch, mainButtons2[1])) { if (Config::UseBars == true) Config::UseBars = false; else if (Config::UseBars == false) Config::UseBars = true; changesMade = true; - } else if (touching(touch, mainButtons[2])) { + } else if (touching(touch, mainButtons2[2])) { Config::keyDelay = Input::getUint(255, Lang::get("ENTER_KEY_DELAY")); changesMade = true; + } else if (touching(touch, mainButtons2[3])) { + if (Config::fading) { + if (Msg::promptMsg(Lang::get("TOGGLE_FADE_DISABLE"))) { + Config::fading = false; + Msg::DisplayWarnMsg(Lang::get("DISABLED")); + changesMade = true; + } + } else { + if (Msg::promptMsg(Lang::get("TOGGLE_FADE_ENABLE"))) { + Config::fading = true; + Msg::DisplayWarnMsg(Lang::get("ENABLED")); + changesMade = true; + } + } } } @@ -289,6 +317,18 @@ void Settings::MiscSettingsLogic(u32 hDown, u32 hHeld, touchPosition touch) { Selection = 0; mode = 0; } + + + // Navigation. + if (hDown & KEY_UP) { + if (Selection > 1) Selection -= 2; + } else if (hDown & KEY_DOWN) { + if (Selection < 3 && Selection != 2 && Selection != 3) Selection += 2; + } else if (hDown & KEY_LEFT) { + if (Selection%2) Selection--; + } else if (hDown & KEY_RIGHT) { + if (!(Selection%2)) Selection++; + } } @@ -313,7 +353,7 @@ void Settings::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { mode = 2; break; case 2: - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); break; } } @@ -327,12 +367,12 @@ void Settings::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { screenPos = 0; mode = 2; } else if (touching(touch, mainButtons[2])) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } } if ((hDown & KEY_B) || (hDown & KEY_TOUCH && touching(touch, arrowPos[2]))) { - Gui::screenBack(); + Gui::screenBack(Config::fading); return; } diff --git a/source/screens/unistore.cpp b/source/screens/unistore.cpp index 669b9e9..595c392 100644 --- a/source/screens/unistore.cpp +++ b/source/screens/unistore.cpp @@ -183,7 +183,7 @@ UniStore::UniStore() { if (access(Config::AutobootFile.c_str(), F_OK) != 0) { AutobootWhat = 0; changeBackState = true; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } StoreInfo SI; @@ -203,7 +203,7 @@ UniStore::UniStore() { } else { AutobootWhat = 0; changeBackState = true; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } if (ScriptHelper::checkIfValid(Config::AutobootFile, 1) == true) { @@ -226,7 +226,7 @@ UniStore::UniStore() { } else { AutobootWhat = 0; changeBackState = true; - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } } } @@ -242,6 +242,7 @@ void UniStore::DrawSubMenu(void) const { } GFX::DrawSprite(sprites_uniStore_HD_idx, 140, 50, 0.2, 0.2); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(0, 218, 0, 1); @@ -250,6 +251,7 @@ void UniStore::DrawSubMenu(void) const { GFX::DrawButton(subPos[2].x, subPos[2].y, Lang::get("CHANGE_STOREPATH")); // Selector. Animation::Button(subPos[Selection].x, subPos[Selection].y, .060); + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } @@ -269,7 +271,7 @@ void UniStore::DrawStoreList(void) const { for(uint i=0;i 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); GFX::DrawArrow(295, -1); GFX::DrawArrow(315, 240, 180.0); @@ -322,6 +324,7 @@ void UniStore::DrawStoreList(void) const { Gui::DrawString(dropPos[1].x+30, dropPos[1].y+5, 0.4f, Config::TxtColor, Lang::get("UPDATE_DDM"), 100); Gui::DrawString(dropPos[2].x+30, dropPos[2].y+5, 0.4f, Config::TxtColor, Lang::get("VIEW_DDM"), 100); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void UniStore::DrawStore(void) const { @@ -368,6 +371,7 @@ void UniStore::DrawStore(void) const { } } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 400, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect GFX::DrawBottom(); // Bottom Background. if (appStoreJson.at("storeInfo").contains("iconIndexBottom") && sheetHasLoaded == true) { @@ -430,6 +434,7 @@ void UniStore::DrawStore(void) const { // Dropdown Text. Gui::DrawString(dropPos[0].x+30, dropPos[0].y+5, 0.4f, Config::TxtColor, Lang::get("VIEW_DDM"), 100); } + if (fadealpha > 0) Gui::Draw_Rect(0, 0, 320, 240, C2D_Color32(fadecolor, fadecolor, fadecolor, fadealpha)); // Fade in/out effect } void UniStore::Draw(void) const { @@ -501,9 +506,9 @@ void UniStore::refreshList() { void UniStore::SubMenuLogic(u32 hDown, u32 hHeld, touchPosition touch) { if ((hDown & KEY_B) || (hDown & KEY_TOUCH && touching(touch, arrowPos[2]))) { if (changeBackState) { - Gui::setScreen(std::make_unique()); + Gui::setScreen(std::make_unique(), Config::fading, true); } else { - Gui::screenBack(); + Gui::screenBack(Config::fading); return; } } diff --git a/source/utils/config.cpp b/source/utils/config.cpp index f5e554c..2fba676 100644 --- a/source/utils/config.cpp +++ b/source/utils/config.cpp @@ -47,7 +47,6 @@ bool Config::Logging; bool Config::UseBars; std::string Config::StorePath; int Config::LangPath; -bool Config::GodMode = false; int Config::autoboot = 0; std::string Config::AutobootFile = ""; int Config::outdated; @@ -56,6 +55,7 @@ int Config::notFound; int Config::future; int Config::Button; int Config::keyDelay = 5; +bool Config::fading = true; nlohmann::json configJson; extern bool changesMade; @@ -208,6 +208,12 @@ void Config::load() { keyDelay = getInt("KEY_DELAY"); } + if(!configJson.contains("SCREEN_FADE")) { + fading = true; + } else { + fading = getBool("SCREEN_FADE"); + } + fclose(file); } else { Color1 = BarColor; @@ -233,6 +239,7 @@ void Config::load() { future = C2D_Color32(255, 255, 0, 255); Button = C2D_Color32(0, 0, 50, 255); keyDelay = 5; + fading = true; } } @@ -260,6 +267,7 @@ void Config::save() { setInt("FUTURE", future); setInt("BUTTON", Button); setInt("KEY_DELAY", keyDelay); + setBool("SCREEN_FADE", fading); FILE* file = fopen("sdmc:/3ds/Universal-Updater/Settings.json", "w"); if(file) fwrite(configJson.dump(1, '\t').c_str(), 1, configJson.dump(1, '\t').size(), file); @@ -293,6 +301,7 @@ void Config::initializeNewConfig() { setInt("FUTURE", C2D_Color32(255, 255, 0, 255)); setInt("BUTTON", C2D_Color32(0, 0, 50, 255)); setInt("KEY_DELAY", 5); + setBool("SCREEN_FADE", true); if(file) fwrite(configJson.dump(1, '\t').c_str(), 1, configJson.dump(1, '\t').size(), file); fclose(file);