From ec2417d068c310acb228c7c500a3588b4edf2934 Mon Sep 17 00:00:00 2001 From: J-D-K Date: Thu, 30 Oct 2025 13:34:03 -0400 Subject: [PATCH] Add comments to states. --- include/JKSV.hpp | 9 ++ include/appstates/BackupMenuState.hpp | 2 + include/appstates/BaseState.hpp | 1 + include/appstates/MainMenuState.hpp | 1 + romfs/Sound/ConfirmPop.wav | Bin 21920 -> 21920 bytes romfs/Sound/MenuCursor.wav | Bin 750 -> 2528 bytes romfs/Sound/PopMessage.wav | Bin 13450 -> 13450 bytes romfs/Sound/TitleInfo.wav | Bin 44262 -> 44262 bytes source/JKSV.cpp | 105 +++++++++++++++------- source/appstates/BackupMenuState.cpp | 7 ++ source/appstates/BaseState.cpp | 3 + source/appstates/BaseTask.cpp | 3 + source/appstates/BlacklistEditState.cpp | 6 ++ source/appstates/DataLoadingState.cpp | 6 ++ source/appstates/ExtrasMenuState.cpp | 6 ++ source/appstates/FadeState.cpp | 3 + source/appstates/FileModeState.cpp | 6 ++ source/appstates/FileOptionState.cpp | 8 ++ source/appstates/MainMenuState.cpp | 6 ++ source/appstates/MessageState.cpp | 6 ++ source/appstates/ProgressState.cpp | 6 ++ source/appstates/SaveCreateState.cpp | 8 ++ source/appstates/SaveImportState.cpp | 6 ++ source/appstates/SettingsState.cpp | 14 ++- source/appstates/TaskState.cpp | 4 + source/appstates/TextTitleSelectState.cpp | 6 ++ source/appstates/TitleInfoState.cpp | 10 ++- source/appstates/TitleOptionState.cpp | 6 ++ source/appstates/TitleSelectCommon.cpp | 8 +- source/appstates/TitleSelectState.cpp | 7 ++ source/appstates/UserOptionState.cpp | 6 ++ source/cmdargs.cpp | 1 + 32 files changed, 226 insertions(+), 34 deletions(-) diff --git a/include/JKSV.hpp b/include/JKSV.hpp index f7be225..24ddc45 100644 --- a/include/JKSV.hpp +++ b/include/JKSV.hpp @@ -45,6 +45,9 @@ class JKSV /// @brief Stores the build string. std::string m_buildString{}; + /// @brief Sets the system to enable boost mode. + void set_boost_mode(); + /// @brief Initializes fslib and takes care of a few other things. bool initialize_filesystem(); @@ -60,6 +63,12 @@ class JKSV /// @brief Adds the text color changing characters. void add_color_chars(); + /// @brief Retrieves the strings from the map and sets them up for printing. + void setup_translation_info_strings(); + + /// @brief Renders the base UI. + void render_base(); + /// @brief Exits all services. void exit_services(); }; diff --git a/include/appstates/BackupMenuState.hpp b/include/appstates/BackupMenuState.hpp index bb79bf3..3405d47 100644 --- a/include/appstates/BackupMenuState.hpp +++ b/include/appstates/BackupMenuState.hpp @@ -1,4 +1,5 @@ #pragma once + #include "StateManager.hpp" #include "appstates/BaseState.hpp" #include "data/data.hpp" @@ -171,6 +172,7 @@ class BackupMenuState final : public BaseState /// @brief Performs some operations and then marks the state for purging. void deactivate_state(); + /// @brief Inline. Returns if the user is "system" type. inline bool user_is_system() { const uint8_t saveType = m_user->get_account_save_type(); diff --git a/include/appstates/BaseState.hpp b/include/appstates/BaseState.hpp index 264f013..d00b3a2 100644 --- a/include/appstates/BaseState.hpp +++ b/include/appstates/BaseState.hpp @@ -1,4 +1,5 @@ #pragma once + #include "sdl.hpp" #include diff --git a/include/appstates/MainMenuState.hpp b/include/appstates/MainMenuState.hpp index b2d9364..a5c5084 100644 --- a/include/appstates/MainMenuState.hpp +++ b/include/appstates/MainMenuState.hpp @@ -113,5 +113,6 @@ class MainMenuState final : public BaseState /// @brief Backups up all save data for all users. void backup_all_for_all(); + /// @brief Pushes the update notice and allows the user to select whether or not they want to update JKSV. void confirm_update(); }; diff --git a/romfs/Sound/ConfirmPop.wav b/romfs/Sound/ConfirmPop.wav index 26eae172c9e80d749ec00e106fbe5851ceca94ac..abbcddfff4e18e586f944a591ff04dc113a7cfee 100644 GIT binary patch literal 21920 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 literal 21920 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 diff --git a/romfs/Sound/MenuCursor.wav b/romfs/Sound/MenuCursor.wav index 028d732c2e79abe65afce7c651b0274b129c4636..2ccb1ebc576323d7e0fb6a9817c5153107008967 100644 GIT binary patch literal 2528 zcmai0TW=gS7@Z=JKmrM#c#Zl5sv7ko1PBSJ1d$?DAd#x{H7Jb~sa)D7dzsmp@!ezZ z?96Vm2~7~C5Bw;84(GFHHe0A*Cf@b&`M%@N$M!1UZEtP;^;VL6f9L+!`#&CTyqhG+ zmE^VLy=zHw^?riho5|kp;qK>%sqDP zrs?71Nw#=)yu5g!%E{>Hmu%dgot$30&^#Xvo}|Nexj4RfZd5)V4#uO|vN=BeP04IL z8lTJj?!U0Zx$!#*5+xJjfc}k-7L+`Fwe$EzL_oB6IW-$90gcEoz< z3s#maXQgdSWm^G~m4vY8GszGK*3`xTiLzh}Xljh9r7R21Spm+Pse+|Ixvn*kR7J*k zInf@-gG)IpQ|)k+Fv4=2mmKHOnTP~0z}CkLnISg`+ztQk4QPJfa45F<#0qRAR2&C(kKTF$>}J1X#*0RBeIGd z13)C93RMC?#^R`3(*Fm-{1W#94LzzGJtd7)0fCc1Pzjs>C$v!52@Y3reel9x#!C2s z>!hWQd33QT7Dbb;q%7hhT5+%&H!^b2WM!xXGh#Q16LEg@I8r5UqEZISSs{6eD)K3E z!8P(JItrf@d?E)SOCC}rG^kb}>=JfbkgJ`e!L`mqxQz+XI!9GRa8#pFBzf2)@~L;U zb1kl+cLqq48=a%n2U>F!KSV1>JJ(2a%~4doat&Qlf+jqs1>p~c3!ILKXo+-IXtj7E zLS^xZT=aq*CJ%_g)xyreKcJFsC7s)_QtGb|N8J<|9YPOz1!|x-=B*H2X588EpqC@I zL#xP0_Idw-XjXbqSyARehw31NUxjeQaeCs5LSiJ%7tRqP=|Me#3VEoGs-a~U)F(uX ziJBcpc^!wyh%nOWAu;3zaSZ1WqE(X0WgblupYZz?Ao)uuQelQJCTe1Z6ahdzym4jS zXt&PDtZ^?#1{73!rB3Trc~KvQ#w>Db&5JNf=244fuYHHn!2S={CHFd=S_gai)eNCS zB&O=;>}R3jNOfPU%KjBi18dqH#0adR79U#eCF)0C^&KN)>{`EbyHn|13_en!>#Z;7 za=7R3ZtvXN#D7=Y-)w!my|Z=iD*AVK2m2p=x_Rs4&6_uFY<%$O;D@I_?d=~tdU*Zj z=B>?JA12Ac-tCP~DC?`+uP0xka~bZ73z%-SYs zNwFyi3WA6~&EMgjSz|2B4CkJE?wvbl_gT4A`n{;s^N01v@lH~>s+3w#i|X34QcHCu z=#pwRlV(LUM1-=C36PQ4K*k!;xNMM)In8L`M!n(KrWy9^$Y@78vjcFN$9kBdW-@N1 z`)t8sUj%>$lmU=s0D~E6Y3?9pCVzokgv^MN7YHQK58w|;dk7xRS^OV|L47WOAe*6_ z%c;CZbpKW;n3si~d1dG(aNaENe`)kHAzCsrm}Pd!@R%kiFS;)IF^#G7?)woP$Gb;^ zFQ;3u+ddn+Nw+i7pQjs1vi0jspS*lEh0~v}chWcCz77vNZzqS@r@i+d((%U>VURg= z>49VGv>~vT7~~=r=PZ&n2u3I;ju>VU7$>wbGOGm$J`zCw%@D*@i6qC8@*amsPO-ti zA-pK}_#8KTc&PF=co3Wu9E_SNW<7k`bH1b31nxIsx1kwG<)%_ zyHW9Ww6?lhxUt>d*zdIB_V(t=T2zdRHVbe2*_Rgz7q2YetKY9R U8V!lB%dU3gq~F}zJl|9O0UmTk3jhEB diff --git a/romfs/Sound/PopMessage.wav b/romfs/Sound/PopMessage.wav index 1adfc1699ec37b0277f4646ab73af3dc410c082b..fd183c81eaa5de5776917f668644450828c45353 100644 GIT binary patch literal 13450 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 literal 13450 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 D954K4 diff --git a/romfs/Sound/TitleInfo.wav b/romfs/Sound/TitleInfo.wav index 56db9de31a999b075cbd0a69a7f13c580771753f..aaa84ee121d9d763326d5a1d3e609b2581c69eec 100644 GIT binary patch literal 44262 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

FJP?!o?MYt6yOAj}U#>2^oD9A*ZM% z&GGS$> zFy76CD-$PjGg)b&rRolK1)fm3fsrerF=)wc6T(pgSrWIw#$l&aRT_;G_(viBL1*bI z30EP~Xe)s#mq+*s&oyF&xu`pp0r)n0 zHPUuE;F-zeIiB5eRhpk8|0Fq&JM7{4J>yfu1 zJ2!~VlKbHAW=Gf;FxoEShtZShQFO^d6D8f`G`*kPOAh06c6?HQ>0OT=dr$la!IqKd zr>*>m_V4Bg**TMa7OsLD{|Oh`QSPP9>@d5N-Jy-MXn=24-p%OA=xy(ze-TdOAnoKQ z#r@(QzG)DiW{lWt^ndK%1gkJ7oz_SWlDo;>_$X?z6*tARkG!Y;lkg^9rb*EqA5ZQ~ z-h|*BrJX1amfnNmI}nVg-gPj;H_hyR_D1%4b|*QB`bgh^e%F6DcoJQtW7d`P$^FS& zEySWOOlnG+F6E+#LL>)CcS==wF!T7p7l${1}$~ zg9oGQaFb4pcsd|id^S6soM-K5? zACOV*hr^NIi#p&t6KXKeX4xc~`SamS$_H$E2b>82Kb#QfPqJc?&e&6&4aWn}gVCrL zwBvTxDS8voW`8hTc#Gkb)NjlVCRy;b4_opmC8Z!+>ar0JA49g+g8{bFE;$g7R8x`7 zl0~#+AaI0%^~etfQIBCFsgRJZZunU|3#UweY{&Z}G9cZklXTMo6Qr;=MTZ;^V6BeW z<^>)1nC^#6x-r=sayM+t%aqJ$WTGd7!sIhzT}*U2m?sN1{3lFG5mWJi(q4=UDUX@3 zHS}q⩔Ea{;X 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 diff --git a/source/JKSV.cpp b/source/JKSV.cpp index e976e54..d1e81a3 100644 --- a/source/JKSV.cpp +++ b/source/JKSV.cpp @@ -43,6 +43,7 @@ namespace } // namespace +// This function allows any service init to be logged with its name without repeating the code. template static bool initialize_service(Result (*function)(Args...), const char *serviceName, Args... args) { @@ -55,41 +56,53 @@ static bool initialize_service(Result (*function)(Args...), const char *serviceN return true; } -// Definition at bottom. -static void finish_initialization(); +// ---- Construction ---- -// This can't really have an initializer list since it sets everything up. JKSV::JKSV() { - appletSetCpuBoostMode(ApmCpuBoostMode_FastLoad); + // Set boost mode first. + JKSV::set_boost_mode(); + + // Nothing in JKSV can really continue without these. ABORT_ON_FAILURE(JKSV::initialize_services()); ABORT_ON_FAILURE(JKSV::initialize_filesystem()); + + // Create the log file if it hasn't been already. logger::initialize(); + + // SDL2 ABORT_ON_FAILURE(JKSV::initialize_sdl()); + // Curl. ABORT_ON_FAILURE(curl::initialize()); + + // Config and input. input::initialize(); config::initialize(); + // These are the strings used in the UI. ABORT_ON_FAILURE(strings::initialize()); // This is fatal now. - const char *translationFormat = strings::get_by_name(strings::names::TRANSLATION, 0); - const char *author = strings::get_by_name(strings::names::TRANSLATION, 1); - m_showTranslationInfo = std::char_traits::compare(author, "NULL", 4) != 0; // This is whether or not to show. - m_translationInfo = stringutil::get_formatted_string(translationFormat, author); - m_buildString = stringutil::get_formatted_string("v. %02d.%02d.%04d", builddate::MONTH, builddate::DAY, builddate::YEAR); - // This needs the config init'd or read to work. JKSV::create_directories(); - sys::threadpool::initialize(); + sys::threadpool::initialize(); // This is the thread pool so JKSV isn't constantly creating and destroying threads. + // Push the remote init. sys::threadpool::push_job(remote::initialize, nullptr); - data::launch_initialization(false, finish_initialization); + + // Launch the loading init. Finish init is called afterwards. + auto init_finish = []() { MainMenuState::create_and_push(); }; // Lambda that's exec'd after state is finished. + data::launch_initialization(false, init_finish); + + // This isn't required, but why not? FadeState::create_and_push(colors::BLACK, 0xFF, 0x00, nullptr); + // JKSV is now running. sm_isRunning = true; } +// ---- Destruction ---- + JKSV::~JKSV() { sys::threadpool::exit(); @@ -103,6 +116,8 @@ JKSV::~JKSV() appletUnlockExit(); } +// ---- Public functions ---- + bool JKSV::is_running() const noexcept { return sm_isRunning && appletMainLoop(); } void JKSV::update() @@ -121,22 +136,7 @@ void JKSV::render() { sdl::frame_begin(colors::CLEAR_COLOR); - // Top and bottom divider lines. - sdl::render_line(sdl::Texture::Null, 30, 88, 1250, 88, colors::WHITE); - sdl::render_line(sdl::Texture::Null, 30, 648, 1250, 648, colors::WHITE); - // Icon - m_headerIcon->render(sdl::Texture::Null, 66, 27); - // "JKSV" - sdl::text::render(sdl::Texture::Null, 130, 32, 34, sdl::text::NO_WRAP, colors::WHITE, "JKSV"); - - // Translation info in bottom left. - if (m_showTranslationInfo) - { - sdl::text::render(sdl::Texture::Null, 8, 680, 14, sdl::text::NO_WRAP, colors::WHITE, m_translationInfo); - } - // Build date - sdl::text::render(sdl::Texture::Null, 8, 700, 14, sdl::text::NO_WRAP, colors::WHITE, m_buildString); - + JKSV::render_base(); StateManager::render(); ui::PopMessageManager::render(); @@ -145,6 +145,14 @@ void JKSV::render() void JKSV::request_quit() noexcept { sm_isRunning = false; } +// ---- Private functions ---- + +void JKSV::set_boost_mode() +{ + // Log for errors, but not fatal. + error::libnx(appletSetCpuBoostMode(ApmCpuBoostMode_FastLoad)); +} + bool JKSV::initialize_filesystem() { // This needs to be in this specific order @@ -174,10 +182,16 @@ bool JKSV::initialize_services() bool JKSV::initialize_sdl() { + // Initialize SDL, freetype and the system font. bool sdlInit = sdl::initialize("JKSV", 1280, 720); sdlInit = sdlInit && sdl::text::initialize(); + + // Load the icon in the top left. m_headerIcon = sdl::TextureManager::load("headerIcon", "romfs:/Textures/HeaderIcon.png"); + + // Push the color changing characters. JKSV::add_color_chars(); + return sdlInit && m_headerIcon; } @@ -209,6 +223,39 @@ void JKSV::add_color_chars() sdl::text::add_color_character(L'$', colors::GOLD); } +void JKSV::setup_translation_info_strings() +{ + const char *translationFormat = strings::get_by_name(strings::names::TRANSLATION, 0); + const char *author = strings::get_by_name(strings::names::TRANSLATION, 1); + m_showTranslationInfo = std::char_traits::compare(author, "NULL", 4) != 0; // This is whether or not to show. + m_translationInfo = stringutil::get_formatted_string(translationFormat, author); + m_buildString = stringutil::get_formatted_string("v. %02d.%02d.%04d", builddate::MONTH, builddate::DAY, builddate::YEAR); +} + +void JKSV::render_base() +{ + static constexpr std::string_view TITLE_TEXT = "JKSV"; + + // Top and bottom framing lines. + sdl::render_line(sdl::Texture::Null, 30, 88, 1250, 88, colors::WHITE); + sdl::render_line(sdl::Texture::Null, 30, 648, 1250, 648, colors::WHITE); + + // Icon + m_headerIcon->render(sdl::Texture::Null, 66, 27); + + // "JKSV" + sdl::text::render(sdl::Texture::Null, 130, 32, 34, sdl::text::NO_WRAP, colors::WHITE, TITLE_TEXT); + + // Translation info in bottom left. + if (m_showTranslationInfo) + { + sdl::text::render(sdl::Texture::Null, 8, 680, 14, sdl::text::NO_WRAP, colors::WHITE, m_translationInfo); + } + + // Build date + sdl::text::render(sdl::Texture::Null, 8, 700, 14, sdl::text::NO_WRAP, colors::WHITE, m_buildString); +} + void JKSV::exit_services() { nifmExit(); @@ -221,5 +268,3 @@ void JKSV::exit_services() nsExit(); accountExit(); } - -static void finish_initialization() { MainMenuState::create_and_push(); } diff --git a/source/appstates/BackupMenuState.cpp b/source/appstates/BackupMenuState.cpp index 009759d..69ff816 100644 --- a/source/appstates/BackupMenuState.cpp +++ b/source/appstates/BackupMenuState.cpp @@ -21,6 +21,8 @@ #include +// ---- Construction ---- + BackupMenuState::BackupMenuState(data::User *user, data::TitleInfo *titleInfo, const FsSaveDataInfo *saveInfo) : m_user(user) , m_titleInfo(titleInfo) @@ -39,6 +41,8 @@ BackupMenuState::BackupMenuState(data::User *user, data::TitleInfo *titleInfo, c BackupMenuState::refresh(); } +// ---- Public functions ---- + void BackupMenuState::update() { const bool hasFocus = BaseState::has_focus(); @@ -140,6 +144,9 @@ void BackupMenuState::save_data_written() if (!m_saveHasData) { m_saveHasData = true; } } + +// ---- Private functions ---- + void BackupMenuState::initialize_static_members() { if (sm_backupMenu && sm_slidePanel && sm_menuRenderTarget && sm_panelWidth) { return; } diff --git a/source/appstates/BaseState.cpp b/source/appstates/BaseState.cpp index d307432..05e6b0c 100644 --- a/source/appstates/BaseState.cpp +++ b/source/appstates/BaseState.cpp @@ -4,6 +4,7 @@ #include +// ---- Construction ---- BaseState::BaseState(bool isClosable) : m_isClosable(isClosable) { @@ -17,6 +18,8 @@ BaseState::~BaseState() error::libnx(appletEndBlockingHomeButtonShortAndLongPressed()); } +// ---- Public functions ---- + void BaseState::deactivate() { m_isActive = false; } void BaseState::reactivate() { m_isActive = true; } diff --git a/source/appstates/BaseTask.cpp b/source/appstates/BaseTask.cpp index c790fa8..6a1ea1c 100644 --- a/source/appstates/BaseTask.cpp +++ b/source/appstates/BaseTask.cpp @@ -11,11 +11,14 @@ namespace constexpr uint64_t TICKS_GLYPH_TRIGGER = 50; } // namespace +// ---- Construction ---- BaseTask::BaseTask() : BaseState(false) , m_frameTimer(TICKS_GLYPH_TRIGGER) , m_popUnableExit(strings::get_by_name(strings::names::GENERAL_POPS, 0)) {}; +// ---- Public functions ---- + void BaseTask::update_loading_glyph() { m_colorMod.update(); diff --git a/source/appstates/BlacklistEditState.cpp b/source/appstates/BlacklistEditState.cpp index 1b66b59..0cc1fab 100644 --- a/source/appstates/BlacklistEditState.cpp +++ b/source/appstates/BlacklistEditState.cpp @@ -7,6 +7,8 @@ #include "error.hpp" #include "input.hpp" +// ---- Construction ---- + BlacklistEditState::BlacklistEditState() : BaseState() { @@ -16,6 +18,8 @@ BlacklistEditState::BlacklistEditState() BlacklistEditState::refresh_menu(); } +// ---- Public functions ---- + void BlacklistEditState::update() { const bool hasFocus = BaseState::has_focus(); @@ -36,6 +40,8 @@ void BlacklistEditState::render() sm_slidePanel->render(sdl::Texture::Null, hasFocus); } +// ---- Private functions ---- + void BlacklistEditState::initialize_static_members() { if (sm_slidePanel) { return; } diff --git a/source/appstates/DataLoadingState.cpp b/source/appstates/DataLoadingState.cpp index dbfadff..7255d5c 100644 --- a/source/appstates/DataLoadingState.cpp +++ b/source/appstates/DataLoadingState.cpp @@ -8,6 +8,8 @@ namespace constexpr int SCREEN_CENTER = 640; } +// ---- Construction ---- + DataLoadingState::DataLoadingState(data::DataContext &context, DestructFunction destructFunction, sys::threadpool::JobFunction function, @@ -20,6 +22,8 @@ DataLoadingState::DataLoadingState(data::DataContext &context, m_task = std::make_unique(function, taskData); } +// ---- Public functions ---- + void DataLoadingState::update() { BaseTask::update_loading_glyph(); @@ -44,6 +48,8 @@ void DataLoadingState::render() BaseTask::render_loading_glyph(); } +// ---- Private functions ---- + void DataLoadingState::initialize_static_members() { if (sm_jksvIcon) { return; } diff --git a/source/appstates/ExtrasMenuState.cpp b/source/appstates/ExtrasMenuState.cpp index 3972f8d..ad04f34 100644 --- a/source/appstates/ExtrasMenuState.cpp +++ b/source/appstates/ExtrasMenuState.cpp @@ -33,6 +33,8 @@ namespace // Definition at bottom. static void finish_reinitialization(); +// ---- Construction ---- + ExtrasMenuState::ExtrasMenuState() : m_renderTarget(sdl::TextureManager::load(SECONDARY_TARGET, 1080, 555, SDL_TEXTUREACCESS_TARGET)) , m_controlGuide(ui::ControlGuide::create(strings::get_by_name(strings::names::CONTROL_GUIDES, 5))) @@ -40,6 +42,8 @@ ExtrasMenuState::ExtrasMenuState() ExtrasMenuState::initialize_menu(); } +// ---- Public functions ---- + void ExtrasMenuState::update() { const bool hasFocus = BaseState::has_focus(); @@ -77,6 +81,8 @@ void ExtrasMenuState::render() m_controlGuide->render(sdl::Texture::Null, hasFocus); } +// ---- Private functions ---- + void ExtrasMenuState::initialize_menu() { if (!m_extrasMenu) { m_extrasMenu = ui::Menu::create(32, 10, 1000, 23, 555); } diff --git a/source/appstates/FadeState.cpp b/source/appstates/FadeState.cpp index 9d54232..f8e242a 100644 --- a/source/appstates/FadeState.cpp +++ b/source/appstates/FadeState.cpp @@ -10,6 +10,7 @@ namespace constexpr uint64_t TICKS_TIMER_TRIGGER = 1; } +// ---- Construction ---- FadeState::FadeState(sdl::Color baseColor, uint8_t startAlpha, uint8_t endAlpha, std::shared_ptr nextState) : m_baseColor(baseColor) , m_alpha(startAlpha) @@ -44,6 +45,8 @@ void FadeState::render() sdl::render_rect_fill(sdl::Texture::Null, 0, 0, 1280, 720, fadeColor); } +// ---- Private functions ---- + void FadeState::find_divisor() { m_divisor = math::Util::absolute_distance(m_alpha, m_endAlpha); diff --git a/source/appstates/FileModeState.cpp b/source/appstates/FileModeState.cpp index 5d0606b..34fa3af 100644 --- a/source/appstates/FileModeState.cpp +++ b/source/appstates/FileModeState.cpp @@ -11,6 +11,8 @@ #include +// ---- Construction ---- + FileModeState::FileModeState(std::string_view mountA, std::string_view mountB, int64_t journalSize, bool isSystem) : m_mountA(mountA) , m_mountB(mountB) @@ -24,6 +26,8 @@ FileModeState::FileModeState(std::string_view mountA, std::string_view mountB, i FileModeState::initialize_menus(); } +// ---- Public functions ---- + void FileModeState::update() { m_transition.update(); @@ -78,6 +82,8 @@ void FileModeState::render() sm_renderTarget->render(sdl::Texture::Null, 23, y + 12); } +// ---- Private functions ---- + void FileModeState::initialize_static_members() { static constexpr std::string_view RENDER_TARGET_NAME = "FMRenderTarget"; diff --git a/source/appstates/FileOptionState.cpp b/source/appstates/FileOptionState.cpp index f1cd0dc..de4d661 100644 --- a/source/appstates/FileOptionState.cpp +++ b/source/appstates/FileOptionState.cpp @@ -39,6 +39,8 @@ namespace // Defined at bottom. static std::string get_size_string(int64_t totalSize); +// ---- Construction ---- + FileOptionState::FileOptionState(FileModeState *spawningState) : m_spawningState(spawningState) , m_target(spawningState->m_target) @@ -57,6 +59,8 @@ FileOptionState::FileOptionState(FileModeState *spawningState) FileOptionState::initialize_data_struct(); } +// ---- Public functions ---- + void FileOptionState::update() { m_transition.update(); @@ -117,6 +121,8 @@ void FileOptionState::update_source() { m_updateSource = true; } void FileOptionState::update_destination() { m_updateDest = true; } +// ---- Private functions ---- + void FileOptionState::initialize_static_members() { if (sm_copyMenu && sm_dialog) @@ -430,6 +436,8 @@ void FileOptionState::deactivate_state() BaseState::deactivate(); } +// ---- Static definitions ---- + static std::string get_size_string(int64_t totalSize) { static constexpr int64_t THRESHOLD_BYTES = 0x400; diff --git a/source/appstates/MainMenuState.cpp b/source/appstates/MainMenuState.cpp index a0c077c..6338d07 100644 --- a/source/appstates/MainMenuState.cpp +++ b/source/appstates/MainMenuState.cpp @@ -21,6 +21,8 @@ #include "tasks/update.hpp" #include "ui/PopMessageManager.hpp" +// ---- Construction ---- + MainMenuState::MainMenuState() : m_renderTarget(sdl::TextureManager::load("mainMenuTarget", 200, 555, SDL_TEXTUREACCESS_TARGET)) , m_background(sdl::TextureManager::load("mainBackground", "romfs:/Textures/MenuBackground.png")) @@ -37,6 +39,8 @@ MainMenuState::MainMenuState() MainMenuState::check_for_update(); } +// ---- Public functions ---- + void MainMenuState::update() { const int selected = m_mainMenu->get_selected(); @@ -110,6 +114,8 @@ void MainMenuState::refresh_view_states() } } +// ---- Private functions ---- + void MainMenuState::initialize_settings_extras() { if (!sm_settingsState || !sm_extrasState) diff --git a/source/appstates/MessageState.cpp b/source/appstates/MessageState.cpp index 509b1e1..ca646db 100644 --- a/source/appstates/MessageState.cpp +++ b/source/appstates/MessageState.cpp @@ -6,6 +6,8 @@ #include "input.hpp" #include "strings/strings.hpp" +// ---- Construction ---- + MessageState::MessageState(std::string_view message) : m_message(message) , m_transition(0, 0, 32, 32, 0, 0, 720, 256, ui::Transition::DEFAULT_THRESHOLD) @@ -14,6 +16,8 @@ MessageState::MessageState(std::string_view message) sm_dialogPop->play(); } +// ---- Public functions ---- + void MessageState::update() { m_transition.update(); @@ -43,6 +47,8 @@ void MessageState::render() sdl::text::render(sdl::Texture::Null, sm_okX, y + 214, 22, sdl::text::NO_WRAP, colors::WHITE, sm_okText); } +// ---- Private functions ---- + void MessageState::initialize_static_members() { static constexpr int HALF_WIDTH = 640; diff --git a/source/appstates/ProgressState.cpp b/source/appstates/ProgressState.cpp index 2c6bfd6..2bdc5d4 100644 --- a/source/appstates/ProgressState.cpp +++ b/source/appstates/ProgressState.cpp @@ -21,6 +21,8 @@ namespace constexpr double SIZE_BAR_WIDTH = 688.0f; } +// ---- Construction ---- + ProgressState::ProgressState(sys::threadpool::JobFunction function, sys::Task::TaskData taskData) : m_transition(0, 0, 32, 32, 0, 0, 720, 256, ui::Transition::DEFAULT_THRESHOLD) { @@ -28,6 +30,8 @@ ProgressState::ProgressState(sys::threadpool::JobFunction function, sys::Task::T m_task = std::make_unique(function, taskData); } +// ---- Public functions ---- + void ProgressState::update() { BaseTask::update_loading_glyph(); @@ -80,6 +84,8 @@ void ProgressState::render() m_percentageString); } +// ---- Private functions ---- + void ProgressState::initialize_static_members() { static constexpr std::string_view BAR_EDGE_NAME = "BarEdges"; diff --git a/source/appstates/SaveCreateState.cpp b/source/appstates/SaveCreateState.cpp index ab3cebe..0471084 100644 --- a/source/appstates/SaveCreateState.cpp +++ b/source/appstates/SaveCreateState.cpp @@ -22,6 +22,8 @@ // This is the sorting function. static bool compare_info(data::TitleInfo *infoA, data::TitleInfo *infoB); +// ---- Construction ---- + SaveCreateState::SaveCreateState(data::User *user, TitleSelectCommon *titleSelect) : m_user(user) , m_titleSelect(titleSelect) @@ -34,6 +36,8 @@ SaveCreateState::SaveCreateState(data::User *user, TitleSelectCommon *titleSelec SaveCreateState::initialize_data_struct(); } +// ---- Public functions ---- + void SaveCreateState::update() { const bool hasFocus = BaseState::has_focus(); @@ -67,6 +71,8 @@ void SaveCreateState::render() void SaveCreateState::refresh_required() { m_refreshRequired.store(true); } +// ---- Private functions ---- + void SaveCreateState::initialize_static_members() { if (!sm_slidePanel) { sm_slidePanel = std::make_unique(640, ui::SlideOutPanel::Side::Right); } @@ -130,6 +136,8 @@ void SaveCreateState::deactivate_state() BaseState::deactivate(); } +// ---- Static functions ---- + static bool compare_info(data::TitleInfo *infoA, data::TitleInfo *infoB) { // Get pointers to both titles. diff --git a/source/appstates/SaveImportState.cpp b/source/appstates/SaveImportState.cpp index 5d009de..60c8e29 100644 --- a/source/appstates/SaveImportState.cpp +++ b/source/appstates/SaveImportState.cpp @@ -8,6 +8,8 @@ #include "stringutil.hpp" #include "tasks/saveimport.hpp" +// ---- Construction ---- + SaveImportState::SaveImportState(data::User *user) : m_user(user) , m_saveDir() @@ -16,6 +18,8 @@ SaveImportState::SaveImportState(data::User *user) SaveImportState::initialize_directory_menu(); } +// ---- Public functions ---- + void SaveImportState::update() { const bool hasFocus = BaseState::has_focus(); @@ -39,6 +43,8 @@ void SaveImportState::render() sm_slidePanel->render(sdl::Texture::Null, hasFocus); } +// ---- Private functions ---- + void SaveImportState::initialize_static_members() { static constexpr int SIZE_PANEL_WIDTH = 512; diff --git a/source/appstates/SettingsState.cpp b/source/appstates/SettingsState.cpp index c29daf7..d62c269 100644 --- a/source/appstates/SettingsState.cpp +++ b/source/appstates/SettingsState.cpp @@ -63,6 +63,8 @@ namespace CONFIG_KEY_NULL}; } // namespace +// ---- Construction ---- + SettingsState::SettingsState() : m_settingsMenu(ui::Menu::create(32, 10, 1000, 23, 555)) , m_controlGuide(ui::ControlGuide::create(strings::get_by_name(strings::names::CONTROL_GUIDES, 3))) @@ -73,6 +75,8 @@ SettingsState::SettingsState() SettingsState::update_menu_options(); } +// ---- Public functions ---- + void SettingsState::update() { const bool hasFocus = BaseState::has_focus(); @@ -102,6 +106,8 @@ void SettingsState::render() m_controlGuide->render(sdl::Texture::Null, hasFocus); } +// ---- Private functions ---- + void SettingsState::load_settings_menu() { for (int i = 0; const char *option = strings::get_by_name(strings::names::SETTINGS_MENU, i); i++) @@ -184,7 +190,9 @@ void SettingsState::change_working_directory() moved = fs::move_directory_recursively(oldPath, newPath); error::fslib(fslib::delete_directory_recursively(oldPath)); } - else { moved = fslib::rename_directory(oldPath, newPath); } + else { + moved = fslib::rename_directory(oldPath, newPath); + } if (!moved) { @@ -282,7 +290,9 @@ void SettingsState::toggle_trash_folder() config::toggle_by_key(config::keys::ENABLE_TRASH_BIN); if (trashEnabled) { error::fslib(fslib::delete_directory_recursively(trashPath)); } - else { error::fslib(fslib::create_directory(trashPath)); } + else { + error::fslib(fslib::create_directory(trashPath)); + } } void SettingsState::cycle_anim_scaling() diff --git a/source/appstates/TaskState.cpp b/source/appstates/TaskState.cpp index 9eb16ab..4906ea9 100644 --- a/source/appstates/TaskState.cpp +++ b/source/appstates/TaskState.cpp @@ -7,11 +7,15 @@ #include "strings/strings.hpp" #include "ui/PopMessageManager.hpp" +// ---- Construction ---- + TaskState::TaskState(sys::threadpool::JobFunction function, sys::Task::TaskData taskData) { m_task = std::make_unique(function, taskData); } +// ---- Public functions ---- + void TaskState::update() { BaseTask::pop_on_plus(); diff --git a/source/appstates/TextTitleSelectState.cpp b/source/appstates/TextTitleSelectState.cpp index 5bee565..0516854 100644 --- a/source/appstates/TextTitleSelectState.cpp +++ b/source/appstates/TextTitleSelectState.cpp @@ -20,6 +20,8 @@ namespace constexpr std::string_view SECONDARY_TARGET = "SecondaryTarget"; } // namespace +// ---- Construction ---- + TextTitleSelectState::TextTitleSelectState(data::User *user) : TitleSelectCommon() , m_user(user) @@ -29,6 +31,8 @@ TextTitleSelectState::TextTitleSelectState(data::User *user) TextTitleSelectState::refresh(); } +// ---- Public functions ---- + void TextTitleSelectState::update() { const bool hasFocus = BaseState::has_focus(); @@ -79,6 +83,8 @@ void TextTitleSelectState::refresh() } } +// ---- Private functions ---- + void TextTitleSelectState::create_backup_menu() { const int selected = m_titleSelectMenu->get_selected(); diff --git a/source/appstates/TitleInfoState.cpp b/source/appstates/TitleInfoState.cpp index 0f25607..4be4eb4 100644 --- a/source/appstates/TitleInfoState.cpp +++ b/source/appstates/TitleInfoState.cpp @@ -40,6 +40,8 @@ static inline std::shared_ptr create_new_field(std::string_view static inline std::shared_ptr create_new_field(std::string &text, int x, int y, sdl::Color clear); static bool is_a_best_game(uint64_t applicationID) noexcept; +// ---- Construction ---- + TitleInfoState::TitleInfoState(data::User *user, data::TitleInfo *titleInfo, const FsSaveDataInfo *saveInfo) : m_user(user) , m_titleInfo(titleInfo) @@ -60,6 +62,8 @@ TitleInfoState::TitleInfoState(data::User *user, data::TitleInfo *titleInfo, con sm_openChime->play(); } +// ---- Public functions ---- + void TitleInfoState::update() { // Grab this instead of calling the function over and over. @@ -94,6 +98,8 @@ void TitleInfoState::render() } } +// ---- Private functions ---- + void TitleInfoState::initialize_static_members() { static constexpr std::string_view CHIME_NAME = "TitleInfoChime"; @@ -395,6 +401,8 @@ void TitleInfoState::close() noexcept void TitleInfoState::deactivate_state() { BaseState::deactivate(); } +// ---- Static functions ---- + static inline std::shared_ptr create_new_field(std::string_view text, int x, int y, sdl::Color clear) { return ui::TextScroll::create(text, x, y, SIZE_FIELD_WIDTH, SIZE_FIELD_HEIGHT, SIZE_FONT, colors::WHITE, clear, false); @@ -425,4 +433,4 @@ static bool is_a_best_game(uint64_t applicationID) noexcept 0x0100AC20128AC000}; return std::find(BESTEST_GAMES.begin(), BESTEST_GAMES.end(), applicationID) != BESTEST_GAMES.end(); -} \ No newline at end of file +} diff --git a/source/appstates/TitleOptionState.cpp b/source/appstates/TitleOptionState.cpp index 19cb5f0..a0d2af0 100644 --- a/source/appstates/TitleOptionState.cpp +++ b/source/appstates/TitleOptionState.cpp @@ -40,6 +40,8 @@ namespace }; } // namespace +// ---- Construction ---- + TitleOptionState::TitleOptionState(data::User *user, data::TitleInfo *titleInfo, const FsSaveDataInfo *saveInfo, @@ -54,6 +56,8 @@ TitleOptionState::TitleOptionState(data::User *user, TitleOptionState::initialize_data_struct(); } +// ---- Public functions ---- + void TitleOptionState::update() { const bool hasFocus = BaseState::has_focus(); @@ -110,6 +114,8 @@ void TitleOptionState::close_on_update() { m_exitRequired = true; } void TitleOptionState::refresh_required() { m_refreshRequired = true; } +// ---- Private functions ---- + void TitleOptionState::initialize_static_members() { if (sm_slidePanel && sm_titleOptionMenu) { return; } diff --git a/source/appstates/TitleSelectCommon.cpp b/source/appstates/TitleSelectCommon.cpp index 2c3f752..18808f8 100644 --- a/source/appstates/TitleSelectCommon.cpp +++ b/source/appstates/TitleSelectCommon.cpp @@ -4,13 +4,19 @@ #include "sdl.hpp" #include "strings/strings.hpp" +// ---- Construction ---- + TitleSelectCommon::TitleSelectCommon() { TitleSelectCommon::initialize_control_guide(); } +// ---- Public functions ---- + void TitleSelectCommon::sub_update() { sm_controlGuide->sub_update(); } +// ---- Private functions ---- + void TitleSelectCommon::initialize_control_guide() { if (sm_controlGuide) { return; } sm_controlGuide = ui::ControlGuide::create(strings::get_by_name(strings::names::CONTROL_GUIDES, 1)); -} \ No newline at end of file +} diff --git a/source/appstates/TitleSelectState.cpp b/source/appstates/TitleSelectState.cpp index 54489d9..be7c8f5 100644 --- a/source/appstates/TitleSelectState.cpp +++ b/source/appstates/TitleSelectState.cpp @@ -19,12 +19,17 @@ namespace constexpr std::string_view SECONDARY_TARGET = "SecondaryTarget"; } // namespace +// ---- Construction ---- + TitleSelectState::TitleSelectState(data::User *user) : TitleSelectCommon() , m_user(user) , m_renderTarget(sdl::TextureManager::load(SECONDARY_TARGET, 1080, 555, SDL_TEXTUREACCESS_TARGET)) , m_titleView(ui::TitleView::create(m_user)) {}; + +// ---- Public functions ---- + void TitleSelectState::update() { if (!TitleSelectState::title_count_check()) { return; } @@ -60,6 +65,8 @@ void TitleSelectState::render() void TitleSelectState::refresh() { m_titleView->refresh(); } +// ---- Private functions ---- + bool TitleSelectState::title_count_check() { const int titleCount = m_user->get_total_data_entries(); diff --git a/source/appstates/UserOptionState.cpp b/source/appstates/UserOptionState.cpp index 666a122..1b46a3c 100644 --- a/source/appstates/UserOptionState.cpp +++ b/source/appstates/UserOptionState.cpp @@ -34,6 +34,8 @@ namespace }; } // namespace +// ---- Construction ---- + UserOptionState::UserOptionState(data::User *user, TitleSelectCommon *titleSelect) : m_user(user) , m_titleSelect(titleSelect) @@ -45,6 +47,8 @@ UserOptionState::UserOptionState(data::User *user, TitleSelectCommon *titleSelec UserOptionState::initialize_data_struct(); } +// ---- Public functions ---- + void UserOptionState::update() { const bool hasFocus = BaseState::has_focus(); @@ -91,6 +95,8 @@ void UserOptionState::render() void UserOptionState::refresh_required() { m_refreshRequired = true; } +// ---- Private functions ---- + void UserOptionState::create_menu_panel() { static constexpr int SIZE_PANEL_WIDTH = 480; diff --git a/source/cmdargs.cpp b/source/cmdargs.cpp index 0b306f0..417743f 100644 --- a/source/cmdargs.cpp +++ b/source/cmdargs.cpp @@ -4,6 +4,7 @@ namespace { + /// @brief Stores pointers to the arguments passed to JKSV. std::vector s_args{}; }