Skip to content

Commit

Permalink
Made system UI a little more robust. Ditched most hard coded correcti…
Browse files Browse the repository at this point in the history
…ons. Text will now display centered regardless of language or font size
  • Loading branch information
maodus committed Jun 25, 2024
1 parent d7ca908 commit 937e660
Showing 1 changed file with 55 additions and 46 deletions.
101 changes: 55 additions & 46 deletions extras/menus/arkMenu/src/system_mgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ static int optionsAnimState; // state of the animation
static int optionsTextAnim; // -1 for no animation, other for animation
static int screensaver = 0;
static int fullscreen = 0;
static int last_size; // Used to see if the user swicthed menu sizes

// options menu entries position of the entries
static int pEntryIndex;
Expand All @@ -39,6 +40,20 @@ static int menu_draw_state = 0;
static int MAX_ENTRIES = 0;
static SystemEntry** entries = NULL;

struct EntryScale {
float font_size;
int font_y_offset;
int icon_scale;
int icon_y_offset;
int x_step;
};

static struct EntryScale entry_scaling[3] = {
{SIZE_BIG, 130, 0, 15, 160},
{SIZE_LITTLE, 75, 52, 7, 100},
{SIZE_MEDIUM, 95, 72, 15, 120}
};

static bool stillLoading(){
for (int i=0; i<MAX_ENTRIES; i++){
if (entries[i]->isStillLoading())
Expand All @@ -47,10 +62,21 @@ static bool stillLoading(){
return false;
}

static int getNumPageItems(){
int menuSize = common::getConf()->menusize % 3;
return 5 - (int)(menuSize == 0); // 5 for medium and small, 4 for large
}

static void changeMenuState(){
if (optionsDrawState == 1 || optionsDrawState == 3)
return;

int menu_size = common::getConf()->menusize % 3;
if (menu_size != last_size) {
page_start = max(0, cur_entry - getNumPageItems() + 2);
last_size = menu_size;
}

common::playMenuSound();

if (system_menu){
Expand All @@ -67,11 +93,6 @@ static void changeMenuState(){

}

static int getNumPageItems(){
int menuSize = common::getConf()->menusize % 3;
return 5 - (int)(menuSize == 0); // 5 for medium and small, 4 for large
}


static void systemController(Controller* pad){
if (optionsDrawState != 2)
Expand Down Expand Up @@ -107,8 +128,7 @@ static void systemController(Controller* pad){

pEntryIndex++;

int n_items = getNumPageItems();
if (pEntryIndex-page_start >= n_items-1){
if (pEntryIndex-page_start >= getNumPageItems() - 1){
page_start++;
menu_draw_state = -1;
}
Expand All @@ -120,6 +140,7 @@ static void systemController(Controller* pad){
static void drawOptionsMenuCommon(){
int loop_setup = 0;
int menuSize = common::getConf()->menusize % 3;
struct EntryScale scale_info = entry_scaling[menuSize];

if(menuSize != 1) {
// Handle MEDIUM and LARGE
Expand Down Expand Up @@ -148,67 +169,54 @@ static void drawOptionsMenuCommon(){
x += 160;
continue;
}

SystemEntry *curr_entry = entries[i];
int icon_width = curr_entry->getIcon()->getWidth();

// Possibly consolidate this branch into a single statement by enforcing strict dimension scaling for LARGE icons
if(menuSize == 0) {
//sceKernelDelayThread(8000);
entries[i]->getIcon()->draw(x, optionsAnimState+15); // LARGE
//entries[i]->getIcon()->draw(x+menu_anim_state, optionsAnimState+15); // LARGE
}
else if(menuSize == 2) {
//entries[i]->getIcon()->draw_scale(x+menu_anim_state, optionsAnimState+15, 72, 72); // MEDIUM
entries[i]->getIcon()->draw_scale(x, optionsAnimState+15, 72, 72); // MEDIUM
curr_entry->getIcon()->draw(x, optionsAnimState + scale_info.icon_y_offset); // LARGE
}
else {
//entries[i]->getIcon()->draw_scale(x+menu_anim_state, optionsAnimState+7, 52, 52); // SMALL
entries[i]->getIcon()->draw_scale(x, optionsAnimState+7, 52, 52); // SMALL
}
curr_entry->getIcon()->draw_scale(x, optionsAnimState + scale_info.icon_y_offset, scale_info.icon_scale, scale_info.icon_scale); // MEDIUM & SMALL
icon_width = (int)(((float)icon_width) * (scale_info.icon_scale / (float)icon_width)); // Ugly, refractor
}

// TODO: Height scaling?
//int icon_height = entries[i]->getIcon()->getHeight();

if (i == pEntryIndex && optionsDrawState == 2){
const char* entname = entries[i]->getName().c_str();
if(menuSize == 0) {
int tmp_x = x + 25;
scroll.w = 475 - tmp_x;
if(strcasecmp(entname, "CFW Settings") == 0) tmp_x -= 25;
if(strcasecmp(entname, "Exit") == 0) tmp_x += 10;
common::printText(tmp_x, 130, entname, LITEGRAY, SIZE_BIG, 1, &scroll); // LARGE
}
else if(menuSize == 2) {
int tmp_x = x + 16;
scroll.w = 475 - tmp_x;
if(strcasecmp(entname, "CFW Settings") == 0) tmp_x-=20;
if(strcasecmp(entname, "Exit") == 0) tmp_x + 15;
common::printText(tmp_x, 95, entname, LITEGRAY, SIZE_MEDIUM, 1, &scroll); // MEDIUM
}
else {
int tmp_x = x + 12;
scroll.w = 475 - tmp_x;
if(strcasecmp(entname, "CFW Settings") == 0) tmp_x -= 20;
if(strcasecmp(entname, "Settings") == 0) tmp_x -= 5;
if(strcasecmp(entname, "Exit") == 0) tmp_x + 8;
common::printText(tmp_x, 75, entname, LITEGRAY, SIZE_LITTLE, 1, &scroll); // SMALL
}
const char* entname = curr_entry->getName().c_str();

// Center text under icon
int text_x = (x + icon_width / 2) - common::calcTextWidth(entname, scale_info.font_size, 1) / 2;
scroll.w = 480 - text_x;

common::printText(text_x, scale_info.font_y_offset, entname, LITEGRAY, scale_info.font_size, 1, &scroll);
}

if(menuSize == 0)
x += 160;
else if(menuSize == 2)
x += 120;
else
x += 100;
x += scale_info.x_step;
}

switch (menu_draw_state){
case -1:
menu_anim_state -= 20;

if (menu_anim_state <= -160){
menu_draw_state = 0;
}

break;
case 0:
menu_anim_state = 0;
break;
case 1:
menu_anim_state += 20;

if (menu_anim_state >= 160){
menu_draw_state = 0;
}

break;
}
}
Expand Down Expand Up @@ -375,6 +383,7 @@ void SystemMgr::initMenu(SystemEntry** e, int ne){
draw_sema = sceKernelCreateSema("draw_sema", 0, 1, 1, NULL);
entries = e;
MAX_ENTRIES = ne;
last_size = common::getConf()->menusize % 3;

// get ARK version
u32 ver = sctrlHENGetVersion(); // ARK's full version number
Expand Down

0 comments on commit 937e660

Please sign in to comment.