From 937e6609f38a8ba35afabf10108b3394591bec09 Mon Sep 17 00:00:00 2001 From: maodus Date: Mon, 24 Jun 2024 19:18:04 -0600 Subject: [PATCH] Made system UI a little more robust. Ditched most hard coded corrections. Text will now display centered regardless of language or font size --- extras/menus/arkMenu/src/system_mgr.cpp | 101 +++++++++++++----------- 1 file changed, 55 insertions(+), 46 deletions(-) diff --git a/extras/menus/arkMenu/src/system_mgr.cpp b/extras/menus/arkMenu/src/system_mgr.cpp index 5f147c8e..f0f196aa 100644 --- a/extras/menus/arkMenu/src/system_mgr.cpp +++ b/extras/menus/arkMenu/src/system_mgr.cpp @@ -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; @@ -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; iisStillLoading()) @@ -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){ @@ -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) @@ -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; } @@ -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 @@ -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; } } @@ -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