mirror of
https://github.com/rvtr/GodMode9i.git
synced 2025-11-02 00:11:07 -04:00
Add START menu with language selector
This commit is contained in:
parent
1602d4143e
commit
90814b2ff2
@ -18,6 +18,8 @@ public:
|
|||||||
void save(void);
|
void save(void);
|
||||||
|
|
||||||
const std::string &languageIniPath(void) { return _languageIniPath; }
|
const std::string &languageIniPath(void) { return _languageIniPath; }
|
||||||
|
void languageIniPath(const std::string &languageIniPath) { _languageIniPath = languageIniPath; }
|
||||||
|
|
||||||
const std::string &fontPath(void) { return _fontPath; }
|
const std::string &fontPath(void) { return _fontPath; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -35,6 +35,7 @@
|
|||||||
#include "fileOperations.h"
|
#include "fileOperations.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "language.h"
|
#include "language.h"
|
||||||
|
#include "startMenu.h"
|
||||||
|
|
||||||
#define ENTRIES_START_ROW 1
|
#define ENTRIES_START_ROW 1
|
||||||
#define ENTRY_PAGE_LENGTH 10
|
#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_POWERTEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
font->print(0, row--, false, STR_START_START_MENU);
|
||||||
|
|
||||||
if (sdMountedDone) {
|
if (sdMountedDone) {
|
||||||
if (isRegularDS || sdMounted) {
|
if (isRegularDS || sdMounted) {
|
||||||
font->print(0, row--, false, sdMounted ? STR_UNMOUNT_SDCARD : STR_REMOUNT_SDCARD);
|
font->print(0, row--, false, sdMounted ? STR_UNMOUNT_SDCARD : STR_REMOUNT_SDCARD);
|
||||||
@ -264,7 +267,7 @@ void driveMenu (void) {
|
|||||||
break;
|
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
|
#ifdef SCREENSWAP
|
||||||
| KEY_TOUCH
|
| KEY_TOUCH
|
||||||
#endif
|
#endif
|
||||||
@ -382,6 +385,10 @@ void driveMenu (void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pressed & KEY_START) {
|
||||||
|
startMenu();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SCREENSWAP
|
#ifdef SCREENSWAP
|
||||||
// Swap screens
|
// Swap screens
|
||||||
if (pressed & KEY_TOUCH) {
|
if (pressed & KEY_TOUCH) {
|
||||||
|
|||||||
@ -19,7 +19,7 @@ u32 copyBuf[copyBufSize];
|
|||||||
|
|
||||||
std::vector<ClipboardFile> clipboard;
|
std::vector<ClipboardFile> clipboard;
|
||||||
bool clipboardOn = false;
|
bool clipboardOn = false;
|
||||||
bool clipboardUsed = false;
|
bool clipboardUsed = true;
|
||||||
|
|
||||||
std::string getBytes(int bytes) {
|
std::string getBytes(int bytes) {
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
|
|||||||
@ -41,6 +41,7 @@
|
|||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "hexEditor.h"
|
#include "hexEditor.h"
|
||||||
#include "ndsInfo.h"
|
#include "ndsInfo.h"
|
||||||
|
#include "startMenu.h"
|
||||||
#include "nitrofs.h"
|
#include "nitrofs.h"
|
||||||
#include "inifile.h"
|
#include "inifile.h"
|
||||||
#include "nds_loader_arm9.h"
|
#include "nds_loader_arm9.h"
|
||||||
@ -577,6 +578,7 @@ void fileBrowse_drawBottomScreen(DirEntry* entry) {
|
|||||||
} else {
|
} else {
|
||||||
font->print(0, row--, false, STR_POWERTEXT);
|
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);
|
font->print(0, row--, false, clipboardOn ? STR_CLEAR_CLIPBOARD : STR_RESTORE_CLIPBOARD);
|
||||||
if (sdMounted || flashcardMounted) {
|
if (sdMounted || flashcardMounted) {
|
||||||
font->print(0, row--, false, STR_SCREENSHOTTEXT);
|
font->print(0, row--, false, STR_SCREENSHOTTEXT);
|
||||||
@ -1014,6 +1016,11 @@ std::string browseForFile (void) {
|
|||||||
clipboardOn = !clipboardOn;
|
clipboardOn = !clipboardOn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// START menu
|
||||||
|
if (pressed & KEY_START) {
|
||||||
|
startMenu();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SCREENSWAP
|
#ifdef SCREENSWAP
|
||||||
// Swap screens
|
// Swap screens
|
||||||
if (pressed & KEY_TOUCH) {
|
if (pressed & KEY_TOUCH) {
|
||||||
|
|||||||
@ -63,14 +63,15 @@ STRING(UNMOUNT_SDCARD, "\\R+\\B - Unmount SD card")
|
|||||||
STRING(REMOUNT_SDCARD, "\\R+\\B - Remount SD card")
|
STRING(REMOUNT_SDCARD, "\\R+\\B - Remount SD card")
|
||||||
STRING(UNMOUNT_FLASHCARD, "\\R+\\B - Unmount Flashcard")
|
STRING(UNMOUNT_FLASHCARD, "\\R+\\B - Unmount Flashcard")
|
||||||
STRING(REMOUNT_FLASHCARD, "\\R+\\B - Remount Flashcard")
|
STRING(REMOUNT_FLASHCARD, "\\R+\\B - Remount Flashcard")
|
||||||
|
STRING(START_START_MENU, "START - START menu")
|
||||||
STRING(POWERTEXT_DS, "POWER - Poweroff")
|
STRING(POWERTEXT_DS, "POWER - Poweroff")
|
||||||
STRING(POWERTEXT, "POWER - Reboot/[+held] Poweroff")
|
STRING(POWERTEXT, "POWER - Reboot/[+held] Poweroff")
|
||||||
STRING(POWERTEXT_3DS, "POWER - Sleep Mode screen")
|
STRING(POWERTEXT_3DS, "POWER - Sleep Mode screen")
|
||||||
STRING(HOMETEXT, "HOME - HOME Menu prompt")
|
STRING(HOMETEXT, "HOME - HOME Menu prompt")
|
||||||
STRING(IMAGETEXT, "\\R+\\X - Unmount image")
|
STRING(IMAGETEXT, "\\R+\\X - Unmount image")
|
||||||
STRING(SCREENSHOTTEXT, "\\R+\\L - Make a screenshot")
|
STRING(SCREENSHOTTEXT, "\\R+\\L - Make a screenshot")
|
||||||
STRING(CLEAR_CLIPBOARD, "SELECT - Clear Clipboard")
|
STRING(CLEAR_CLIPBOARD, "SELECT - Clear clipboard")
|
||||||
STRING(RESTORE_CLIPBOARD, "SELECT - Restore Clipboard")
|
STRING(RESTORE_CLIPBOARD, "SELECT - Restore clipboard")
|
||||||
STRING(DIRECTORY_OPTIONS, "\\R+\\A - Directory options")
|
STRING(DIRECTORY_OPTIONS, "\\R+\\A - Directory options")
|
||||||
STRING(COPY_FILES_CREATE_ENTRY, "\\Y - COPY file/[+\\R] CREATE entry")
|
STRING(COPY_FILES_CREATE_ENTRY, "\\Y - COPY file/[+\\R] CREATE entry")
|
||||||
STRING(PASTE_FILES_CREATE_ENTRY, "\\Y - PASTE 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(DESELECT_FILES, "\\L - DESELECT files (with \\D)")
|
||||||
STRING(DELETE_RENAME_FILE, "\\X - DELETE/[+\\R] RENAME file")
|
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
|
// File options
|
||||||
STRING(BOOT_FILE, "Boot file")
|
STRING(BOOT_FILE, "Boot file")
|
||||||
STRING(BOOT_FILE_DIRECT, "Boot file (Direct)")
|
STRING(BOOT_FILE_DIRECT, "Boot file (Direct)")
|
||||||
|
|||||||
130
arm9/source/startMenu.cpp
Normal file
130
arm9/source/startMenu.cpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#include "startMenu.h"
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "font.h"
|
||||||
|
#include "language.h"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
#include <nds.h>
|
||||||
|
|
||||||
|
#define ITEMS_PER_SCREEN 8
|
||||||
|
|
||||||
|
constexpr std::array<std::string *, 3> startMenuItems = {
|
||||||
|
&STR_POWER_OFF,
|
||||||
|
&STR_REBOOT,
|
||||||
|
&STR_LANGUAGE
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr std::array<std::pair<const char *, const char *>, 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
arm9/source/startMenu.h
Normal file
7
arm9/source/startMenu.h
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#ifndef START_MENU
|
||||||
|
#define START_MENU
|
||||||
|
|
||||||
|
void startMenu(void);
|
||||||
|
void languageMenu(void);
|
||||||
|
|
||||||
|
#endif // START_MENU
|
||||||
@ -60,14 +60,15 @@ UNMOUNT_SDCARD=\R+\B - Unmount SD card
|
|||||||
REMOUNT_SDCARD=\R+\B - Remount SD card
|
REMOUNT_SDCARD=\R+\B - Remount SD card
|
||||||
UNMOUNT_FLASHCARD=\R+\B - Unmount Flashcard
|
UNMOUNT_FLASHCARD=\R+\B - Unmount Flashcard
|
||||||
REMOUNT_FLASHCARD=\R+\B - Remount Flashcard
|
REMOUNT_FLASHCARD=\R+\B - Remount Flashcard
|
||||||
|
START_START_MENU=START - START menu
|
||||||
POWERTEXT_DS=POWER - Poweroff
|
POWERTEXT_DS=POWER - Poweroff
|
||||||
POWERTEXT=POWER - Reboot/[+held] Poweroff
|
POWERTEXT=POWER - Reboot/[+held] Poweroff
|
||||||
POWERTEXT_3DS=POWER - Sleep Mode screen
|
POWERTEXT_3DS=POWER - Sleep Mode screen
|
||||||
HOMETEXT=HOME - HOME Menu prompt
|
HOMETEXT=HOME - HOME Menu prompt
|
||||||
IMAGETEXT=\R+\X - Unmount image
|
IMAGETEXT=\R+\X - Unmount image
|
||||||
SCREENSHOTTEXT=\R+\L - Make a screenshot
|
SCREENSHOTTEXT=\R+\L - Make a screenshot
|
||||||
CLEAR_CLIPBOARD=SELECT - Clear Clipboard
|
CLEAR_CLIPBOARD=SELECT - Clear clipboard
|
||||||
RESTORE_CLIPBOARD=SELECT - Restore Clipboard
|
RESTORE_CLIPBOARD=SELECT - Restore clipboard
|
||||||
DIRECTORY_OPTIONS=\R+\A - Directory options
|
DIRECTORY_OPTIONS=\R+\A - Directory options
|
||||||
COPY_FILES_CREATE_ENTRY=\Y - COPY file/[+\R] CREATE entry
|
COPY_FILES_CREATE_ENTRY=\Y - COPY file/[+\R] CREATE entry
|
||||||
PASTE_FILES_CREATE_ENTRY=\Y - PASTE 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)
|
DESELECT_FILES=\L - DESELECT files (with \D)
|
||||||
DELETE_RENAME_FILE=\X - DELETE/[+\R] RENAME file
|
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=Boot file
|
||||||
BOOT_FILE_DIRECT=Boot file (Direct)
|
BOOT_FILE_DIRECT=Boot file (Direct)
|
||||||
BOOTSTRAP_FILE=Bootstrap file
|
BOOTSTRAP_FILE=Bootstrap file
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user