diff --git a/arm9/source/config.h b/arm9/source/config.h index cba8962..5164b93 100644 --- a/arm9/source/config.h +++ b/arm9/source/config.h @@ -18,6 +18,8 @@ public: void save(void); const std::string &languageIniPath(void) { return _languageIniPath; } + void languageIniPath(const std::string &languageIniPath) { _languageIniPath = languageIniPath; } + const std::string &fontPath(void) { return _fontPath; } }; diff --git a/arm9/source/driveMenu.cpp b/arm9/source/driveMenu.cpp index 4d2001c..d22cf17 100644 --- a/arm9/source/driveMenu.cpp +++ b/arm9/source/driveMenu.cpp @@ -35,6 +35,7 @@ #include "fileOperations.h" #include "font.h" #include "language.h" +#include "startMenu.h" #define ENTRIES_START_ROW 1 #define ENTRY_PAGE_LENGTH 10 @@ -147,6 +148,8 @@ void dm_drawBottomScreen(void) { font->print(0, row--, false, STR_POWERTEXT); } + font->print(0, row--, false, STR_START_START_MENU); + if (sdMountedDone) { if (isRegularDS || sdMounted) { font->print(0, row--, false, sdMounted ? STR_UNMOUNT_SDCARD : STR_REMOUNT_SDCARD); @@ -264,7 +267,7 @@ void driveMenu (void) { break; } } - } while (!(pressed & (KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT | KEY_A | KEY_R + } while (!(pressed & (KEY_UP | KEY_DOWN | KEY_LEFT | KEY_RIGHT | KEY_A | KEY_R | KEY_START #ifdef SCREENSWAP | KEY_TOUCH #endif @@ -382,6 +385,10 @@ void driveMenu (void) { } } + if (pressed & KEY_START) { + startMenu(); + } + #ifdef SCREENSWAP // Swap screens if (pressed & KEY_TOUCH) { diff --git a/arm9/source/fileOperations.cpp b/arm9/source/fileOperations.cpp index 05ab066..90590bd 100644 --- a/arm9/source/fileOperations.cpp +++ b/arm9/source/fileOperations.cpp @@ -19,7 +19,7 @@ u32 copyBuf[copyBufSize]; std::vector clipboard; bool clipboardOn = false; -bool clipboardUsed = false; +bool clipboardUsed = true; std::string getBytes(int bytes) { char buffer[32]; diff --git a/arm9/source/file_browse.cpp b/arm9/source/file_browse.cpp index 7c9cbbd..f24bf55 100644 --- a/arm9/source/file_browse.cpp +++ b/arm9/source/file_browse.cpp @@ -41,6 +41,7 @@ #include "font.h" #include "hexEditor.h" #include "ndsInfo.h" +#include "startMenu.h" #include "nitrofs.h" #include "inifile.h" #include "nds_loader_arm9.h" @@ -577,6 +578,7 @@ void fileBrowse_drawBottomScreen(DirEntry* entry) { } else { font->print(0, row--, false, STR_POWERTEXT); } + font->print(0, row--, false, STR_START_START_MENU); font->print(0, row--, false, clipboardOn ? STR_CLEAR_CLIPBOARD : STR_RESTORE_CLIPBOARD); if (sdMounted || flashcardMounted) { font->print(0, row--, false, STR_SCREENSHOTTEXT); @@ -1014,6 +1016,11 @@ std::string browseForFile (void) { clipboardOn = !clipboardOn; } + // START menu + if (pressed & KEY_START) { + startMenu(); + } + #ifdef SCREENSWAP // Swap screens if (pressed & KEY_TOUCH) { diff --git a/arm9/source/language.inl b/arm9/source/language.inl index a9c6b4a..8364c62 100644 --- a/arm9/source/language.inl +++ b/arm9/source/language.inl @@ -63,14 +63,15 @@ STRING(UNMOUNT_SDCARD, "\\R+\\B - Unmount SD card") STRING(REMOUNT_SDCARD, "\\R+\\B - Remount SD card") STRING(UNMOUNT_FLASHCARD, "\\R+\\B - Unmount Flashcard") STRING(REMOUNT_FLASHCARD, "\\R+\\B - Remount Flashcard") +STRING(START_START_MENU, "START - START menu") STRING(POWERTEXT_DS, "POWER - Poweroff") STRING(POWERTEXT, "POWER - Reboot/[+held] Poweroff") STRING(POWERTEXT_3DS, "POWER - Sleep Mode screen") STRING(HOMETEXT, "HOME - HOME Menu prompt") STRING(IMAGETEXT, "\\R+\\X - Unmount image") STRING(SCREENSHOTTEXT, "\\R+\\L - Make a screenshot") -STRING(CLEAR_CLIPBOARD, "SELECT - Clear Clipboard") -STRING(RESTORE_CLIPBOARD, "SELECT - Restore Clipboard") +STRING(CLEAR_CLIPBOARD, "SELECT - Clear clipboard") +STRING(RESTORE_CLIPBOARD, "SELECT - Restore clipboard") STRING(DIRECTORY_OPTIONS, "\\R+\\A - Directory options") STRING(COPY_FILES_CREATE_ENTRY, "\\Y - COPY file/[+\\R] CREATE entry") STRING(PASTE_FILES_CREATE_ENTRY, "\\Y - PASTE file/[+\\R] CREATE entry") @@ -78,6 +79,13 @@ STRING(SELECT_FILES, "\\L - SELECT files (with \\D)") STRING(DESELECT_FILES, "\\L - DESELECT files (with \\D)") STRING(DELETE_RENAME_FILE, "\\X - DELETE/[+\\R] RENAME file") +// START menu +STRING(START_MENU, "START Menu") +STRING(POWER_OFF, "Power off") +STRING(REBOOT, "Reboot") +STRING(LANGUAGE, "Language...") +STRING(SELECT_LANGUAGE, "Select Language") + // File options STRING(BOOT_FILE, "Boot file") STRING(BOOT_FILE_DIRECT, "Boot file (Direct)") diff --git a/arm9/source/startMenu.cpp b/arm9/source/startMenu.cpp new file mode 100644 index 0000000..23b27e1 --- /dev/null +++ b/arm9/source/startMenu.cpp @@ -0,0 +1,130 @@ +#include "startMenu.h" + +#include "config.h" +#include "font.h" +#include "language.h" + +#include +#include + +#define ITEMS_PER_SCREEN 8 + +constexpr std::array startMenuItems = { + &STR_POWER_OFF, + &STR_REBOOT, + &STR_LANGUAGE +}; + +constexpr std::array, 3> languageList = {{ + {"en-US", "English"}, + {"es-ES", "Español"}, + {"ja-JP", "日本語"} +}}; + +void startMenu() { + int cursorPosition = 0; + u16 pressed, held; + while(1) { + font->clear(false); + font->print(0, 3, false, STR_START_MENU, Alignment::center); + for(int i = 0; i < (int)startMenuItems.size(); i++) { + if(cursorPosition == i) + font->printf(0, 5 + i, false, Alignment::center, Palette::white, "> %s <", startMenuItems[i]->c_str()); + else + font->print(0, 5 + i, false, startMenuItems[i]->c_str(), Alignment::center); + } + font->print(0, 5 + startMenuItems.size() + 1, false, STR_A_SELECT_B_CANCEL, Alignment::center); + font->update(false); + + do { + swiWaitForVBlank(); + scanKeys(); + pressed = keysDown(); + held = keysDownRepeat(); + } while(!held); + + if(held & KEY_UP) { + cursorPosition--; + if(cursorPosition < 0) + cursorPosition = startMenuItems.size() - 1; + } else if(held & KEY_DOWN) { + cursorPosition++; + if(cursorPosition >= (int)startMenuItems.size()) + cursorPosition = 0; + } else if(pressed & KEY_A) { + switch(cursorPosition) { + case 0: // Power off + // TODO + break; + case 1: // Reboot + fifoSendValue32(FIFO_USER_02, 1); + while(1) swiWaitForVBlank(); + break; + case 2: // language + languageMenu(); + break; + } + } else if(pressed & KEY_B) { + return; + } + } +} + +void languageMenu() { + int cursorPosition = 0, scrollPosition = 0; + + for(int i = 0; i < (int)languageList.size(); i++) { + char iniPath[36]; + snprintf(iniPath, sizeof(iniPath), "nitro:/languages/%s/language.ini", languageList[i].first); + if(config->languageIniPath() == iniPath) { + cursorPosition = i; + break; + } + } + + u16 pressed, held; + while(1) { + if(cursorPosition - scrollPosition >= ITEMS_PER_SCREEN) { + scrollPosition = cursorPosition - ITEMS_PER_SCREEN + 1; + } else if(cursorPosition < scrollPosition) { + scrollPosition = cursorPosition; + } + + font->clear(false); + font->print(0, 3, false, STR_SELECT_LANGUAGE, Alignment::center); + for(int i = 0; i < ITEMS_PER_SCREEN && i < (int)languageList.size(); i++) { + if(cursorPosition == scrollPosition + i) + font->printf(0, 5 + i, false, Alignment::center, Palette::white, "> %s <", languageList[scrollPosition + i].second); + else + font->print(0, 5 + i, false, languageList[scrollPosition + i].second, Alignment::center); + } + font->print(0, 5 + std::min(ITEMS_PER_SCREEN, (int)languageList.size()) + 1, false, STR_A_SELECT_B_CANCEL, Alignment::center); + font->update(false); + + do { + swiWaitForVBlank(); + scanKeys(); + pressed = keysDown(); + held = keysDownRepeat(); + } while(!held); + + if(held & KEY_UP) { + cursorPosition--; + if(cursorPosition < 0) + cursorPosition = languageList.size() - 1; + } else if(held & KEY_DOWN) { + cursorPosition++; + if(cursorPosition >= (int)languageList.size()) + cursorPosition = 0; + } else if(pressed & KEY_A) { + char iniPath[36]; + snprintf(iniPath, sizeof(iniPath), "nitro:/languages/%s/language.ini", languageList[cursorPosition].first); + config->languageIniPath(iniPath); + config->save(); + langInit(true); + return; + } else if(pressed & KEY_B) { + return; + } + } +} diff --git a/arm9/source/startMenu.h b/arm9/source/startMenu.h new file mode 100644 index 0000000..9c924e7 --- /dev/null +++ b/arm9/source/startMenu.h @@ -0,0 +1,7 @@ +#ifndef START_MENU +#define START_MENU + +void startMenu(void); +void languageMenu(void); + +#endif // START_MENU diff --git a/nitrofiles/languages/en-US/language.ini b/nitrofiles/languages/en-US/language.ini index 7f6df03..786f072 100644 --- a/nitrofiles/languages/en-US/language.ini +++ b/nitrofiles/languages/en-US/language.ini @@ -60,14 +60,15 @@ UNMOUNT_SDCARD=\R+\B - Unmount SD card REMOUNT_SDCARD=\R+\B - Remount SD card UNMOUNT_FLASHCARD=\R+\B - Unmount Flashcard REMOUNT_FLASHCARD=\R+\B - Remount Flashcard +START_START_MENU=START - START menu POWERTEXT_DS=POWER - Poweroff POWERTEXT=POWER - Reboot/[+held] Poweroff POWERTEXT_3DS=POWER - Sleep Mode screen HOMETEXT=HOME - HOME Menu prompt IMAGETEXT=\R+\X - Unmount image SCREENSHOTTEXT=\R+\L - Make a screenshot -CLEAR_CLIPBOARD=SELECT - Clear Clipboard -RESTORE_CLIPBOARD=SELECT - Restore Clipboard +CLEAR_CLIPBOARD=SELECT - Clear clipboard +RESTORE_CLIPBOARD=SELECT - Restore clipboard DIRECTORY_OPTIONS=\R+\A - Directory options COPY_FILES_CREATE_ENTRY=\Y - COPY file/[+\R] CREATE entry PASTE_FILES_CREATE_ENTRY=\Y - PASTE file/[+\R] CREATE entry @@ -75,6 +76,12 @@ SELECT_FILES=\L - SELECT files (with \D) DESELECT_FILES=\L - DESELECT files (with \D) DELETE_RENAME_FILE=\X - DELETE/[+\R] RENAME file +START_MENU=START Menu +POWER_OFF=Power off +REBOOT=Reboot +LANGUAGE=Language... +SELECT_LANGUAGE=Select Language + BOOT_FILE=Boot file BOOT_FILE_DIRECT=Boot file (Direct) BOOTSTRAP_FILE=Bootstrap file