diff --git a/.gitignore b/.gitignore index e811257..a0a1943 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ build *.pfs0 *.nacp *.nro +test.* +*_bin.h +switch diff --git a/Makefile.pc b/Makefile.pc index 5c6c373..89360c4 100644 --- a/Makefile.pc +++ b/Makefile.pc @@ -25,6 +25,7 @@ test : pc_main/main.cpp pc_main/pc_launch.c \ common/netloader.c \ build_pc/invalid_icon.bin.o build_pc/folder_icon.bin.o \ build_pc/hbmenu_logo_light.bin.o build_pc/hbmenu_logo_dark.bin.o \ + build_pc/theme_icon_dark.bin.o build_pc/theme_icon_light.bin.o \ #build_pc/tahoma24.o build_pc/tahoma12.o build_pc/interuimedium20.o build_pc/interuimedium30.o build_pc/interuiregular14.o build_pc/interuiregular18.o gcc -Wall -O2 -g -DVERSION=\"v$(APP_VERSION)\" $(EXTRA_CFLAGS) `pkg-config freetype2 --cflags` $^ -lsfml-graphics -lsfml-window -lsfml-system -lstdc++ `pkg-config freetype2 --libs` -lm -lz -lconfig $(EXTRA_LDFLAGS) -I. -iquote $(DEVKITPRO)/libnx/include -Ibuild_pc -g -o $@ @@ -78,16 +79,16 @@ build_pc/hbmenu_logo_dark.bin.o : data/hbmenu_logo_dark.bin @echo $(notdir $<) @$(bin2o) -build_pc/hbmenu_logo_light.bin.o : data/theme_icon_light.bin +build_pc/theme_icon_light.bin.o : data/theme_icon_light.bin mkdir -p $(dir $@) @echo $(notdir $<) @$(bin2o) -build_pc/hbmenu_logo_dark.bin.o : data/theme_icon_dark.bin +build_pc/theme_icon_dark.bin.o : data/theme_icon_dark.bin mkdir -p $(dir $@) @echo $(notdir $<) @$(bin2o) clean: - rm -rf build_pc/ test + rm -rf build_pc/ test *_bin.h test.* diff --git a/common/common.h b/common/common.h index 0536dc6..0207f37 100644 --- a/common/common.h +++ b/common/common.h @@ -153,8 +153,8 @@ void DrawPixel(uint32_t x, uint32_t y, color_t clr); void DrawText(u32 font, uint32_t x, uint32_t y, color_t clr, const char* text); void DrawTextTruncate(u32 font, uint32_t x, uint32_t y, color_t clr, const char* text, uint32_t max_width, const char* end_text); void GetTextDimensions(u32 font, const char* text, uint32_t* width_out, uint32_t* height_out); -uint32_t getXCoordinate(u32 font,uint32_t rX, const char* text,const char align); -uint32_t getYCoordinate(u32 font,uint32_t rY, const char* text,const char align); +uint32_t GetTextXCoordinate(u32 font, uint32_t rX, const char* text, const char align); +uint32_t GetTextYCoordinate(u32 font, uint32_t rY, const char* text, const char align); bool fontInitialize(void); void fontExit(); diff --git a/common/font.c b/common/font.c index 3c5a2c2..9f96627 100644 --- a/common/font.c +++ b/common/font.c @@ -377,46 +377,48 @@ void fontExit() } /*Automatically gives you the desired x-coordinate - *based on the string length and desired alignmenr + *based on the string length and desired alignment *rY=reference point... where to align around - *align='t','b','c' translates too (top,bottom,center) + *align='t','b','c' translates to (top,bottom,center) *'t' aligned, top of text aligns with rY, *you get the rest.... */ -uint32_t getYCoordinate(u32 font,uint32_t rY,const char* text, const char align){ +uint32_t GetTextYCoordinate(u32 font, uint32_t rY, const char* text, const char align) { uint32_t height_o,width; GetTextDimensions(font,text,&width,&height_o); uint32_t height = (uint32_t)height_o; uint32_t fC = (rY-height); + switch(align){ case 't': default: return rY; case 'c': - return (rY+(height/2U)); + return (rY+(height>>1));//>>1 is a bitwise shift for dividing by 2 case 'b': - if(fC<=0U) return 0U; + if(fC<=0) return 0; else return fC; } } /*Automatically gives you the desired x-coordinate - *based on the string length and desired alignmenr + *based on the string length and desired alignment *rX=reference point... where to align around *text=string you want to display - *align='r','l','c' translates too (right,left,center) + *align='r','l','c' translates to (right,left,center) *'r' aligned, rX location = end of string, you get the rest... */ -uint32_t getXCoordinate(u32 font,uint32_t rX, const char* text ,const char align){ +uint32_t GetTextXCoordinate(u32 font, uint32_t rX, const char* text, const char align) { uint32_t height,width_o; GetTextDimensions(font,text,&width_o,&height); uint32_t fC = (rX-width_o); + switch(align){ case 'r': - if(fC<0U) return 0U; + if(fC<0) return 0; else return fC; case 'c': - return (rX+(width_o/2U)); + return (rX+(width_o>>1));//>>1 is a bitwise shift for dividing by 2 case 'l': default: return rX; diff --git a/common/language.c b/common/language.c index c315fcd..2d61e0e 100644 --- a/common/language.c +++ b/common/language.c @@ -322,11 +322,11 @@ const char* const g_strings[StrId_Max][16] = [StrId_Actions_Theme_Menu] = { - STR_EN("Theme Switcher V1.0"), - STR_ES("Versión 1,0 del cambiador de tema"), - STR_JP("テーマスイッチャー版1.0"), - STR_KO("테마 스위처 에디션 1.0"), - STR_TW("主题切换器版本1。0"), + STR_EN("Theme Menu"), + STR_ES("Menú temático"), + STR_JP("テーマメニュー"), + STR_KO("테마 메뉴"), + STR_TW("主题菜单"), }, /*[StrId_Reboot] = { diff --git a/common/menu-entry.c b/common/menu-entry.c index a5a7635..f783807 100644 --- a/common/menu-entry.c +++ b/common/menu-entry.c @@ -294,6 +294,7 @@ bool menuEntryLoad(menuEntry_s* me, const char* name, bool shortcut) { /*if (shortcut) shortcutFree(&sc);*/ } + if (me->type == ENTRY_TYPE_THEME) { config_t cfg = {0}; config_init(&cfg); @@ -307,10 +308,8 @@ bool menuEntryLoad(menuEntry_s* me, const char* name, bool shortcut) { if (themeInfo != NULL) { if(config_setting_lookup_string(themeInfo, "name", &name)) strncpy(me->name, name, sizeof(me->name)-1); - if(!config_setting_lookup_string(themeInfo, "author", &author)) - author = textGetString(StrId_DefaultPublisher); - if(!config_setting_lookup_string(themeInfo, "version", &version))\ - version = "1.0.0"; + config_setting_lookup_string(themeInfo, "author", &author); + config_setting_lookup_string(themeInfo, "version", &version); } } diff --git a/common/menu-list.c b/common/menu-list.c index 9cc2c53..2b89099 100644 --- a/common/menu-list.c +++ b/common/menu-list.c @@ -181,7 +181,7 @@ int themeMenuScan(const char* target) { strncpy(me->path, tmp_path, sizeof(me->path)-1); me->path[sizeof(me->path)-1] = 0; - if (menuEntryLoad(me,dp->d_name, shortcut)) + if (menuEntryLoad(me, dp->d_name, shortcut)) menuAddEntry(me); else menuDeleteEntry(me); diff --git a/common/menu.c b/common/menu.c index 6e24854..cd3d8ed 100644 --- a/common/menu.c +++ b/common/menu.c @@ -14,8 +14,7 @@ char *menuGetRootPath() { return rootPath; } -void launchMenuEntryTask(menuEntry_s* arg) -{ +void launchMenuEntryTask(menuEntry_s* arg) { menuEntry_s* me = arg; if (me->type == ENTRY_TYPE_FOLDER) menuScan(me->path); @@ -40,39 +39,42 @@ void launchMenuNetloaderTask() { if(netloader_activate() == 0) hbmenu_state = HBMENU_NETLOADER_ACTIVE; } -void launchMenuBackTask() -{ +void launchMenuBackTask() { if(hbmenu_state == HBMENU_NETLOADER_ACTIVE) { netloader_deactivate(); hbmenu_state = HBMENU_DEFAULT; - }else if(hbmenu_state == HBMENU_THEME_MENU){ + } + else if(hbmenu_state == HBMENU_THEME_MENU) { hbmenu_state = HBMENU_DEFAULT; menuScan(rootPath); } - else { + else { menuScan(".."); } } -void launchApplyThemeTask(menuEntry_s* arg){ + +void launchApplyThemeTask(menuEntry_s* arg) { config_t cfg = {0}; config_init(&cfg); - if(!config_read_file(&cfg, arg->path)){ + + if(!config_read_file(&cfg, arg->path)) { menuCreateMsgBox(780, 300, "Something went wrong, and the theme could not be loaded!"); return; } - char tmp_path[PATH_MAX] = {0}; + + char tmp_path[PATH_MAX] = {0}; #ifdef __SWITCH__ tmp_path[0] = '/'; #endif strncat(tmp_path, "config/nx-hbmenu/theme.cfg", sizeof(tmp_path)-2); - if(!config_write_file(&cfg, tmp_path)){ + if(!config_write_file(&cfg, tmp_path)) { menuCreateMsgBox(780, 300, "Something went wrong, and the theme could not be applied!"); return; } config_destroy(&cfg); - themeStartup(globalPreset); + themeStartup(themeGlobalPreset); computeFrontGradient(themeCurrent.frontWaveColor, 280); } @@ -212,7 +214,7 @@ static void drawEntry(menuEntry_s* me, int off_x, int is_active) { } else if (me->type == ENTRY_TYPE_THEME){ smallimg = theme_icon_small; - if(globalPreset == THEME_PRESET_DARK) + if(themeGlobalPreset == THEME_PRESET_DARK) largeimg = theme_icon_dark_bin; else largeimg = theme_icon_light_bin; } @@ -305,6 +307,10 @@ void menuStartup() { folder_icon_small = downscaleImg(folder_icon_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); invalid_icon_small = downscaleImg(invalid_icon_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); + if(themeGlobalPreset == THEME_PRESET_DARK) + theme_icon_small = downscaleImg(theme_icon_dark_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); + else + theme_icon_small = downscaleImg(theme_icon_light_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); computeFrontGradient(themeCurrent.frontWaveColor, 280); //menuCreateMsgBox(780, 300, "This is a test"); } @@ -317,13 +323,6 @@ void themeMenuStartup() { snprintf(tmp_path, sizeof(tmp_path)-1, "%s%s%s%s%s%s",DIRECTORY_SEPARATOR, "config", DIRECTORY_SEPARATOR, "nx-hbmenu" , DIRECTORY_SEPARATOR, "themes"); themeMenuScan(tmp_path); - if(globalPreset == THEME_PRESET_DARK) - theme_icon_small = downscaleImg(theme_icon_dark_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); - else - theme_icon_small = downscaleImg(theme_icon_light_bin, 256, 256, 140, 140, IMAGE_MODE_RGB24); - - computeFrontGradient(themeCurrent.frontWaveColor, 280); - //menuCreateMsgBox(780, 300, "This is a test"); } color_t waveBlendAdd(color_t a, color_t b, float alpha) { @@ -497,7 +496,7 @@ void menuLoop() { if(active_entry != NULL) { if (active_entry->type == ENTRY_TYPE_THEME) { - int getX = getXCoordinate(interuiregular18, 1180, textGetString(StrId_Actions_Theme_Menu), 'r'); + int getX = GetTextXCoordinate(interuiregular18, 1180, textGetString(StrId_Actions_Theme_Menu), 'r'); DrawText(interuiregular18, getX, 0 + 47, themeCurrent.textColor, textGetString(StrId_Actions_Theme_Menu)); DrawText(fontscale7, 1280 - 126 - 30 - 32, 720 - 47 + 24, themeCurrent.textColor, themeCurrent.buttonAText); DrawText(interuiregular18, 1280 - 90 - 30 - 32, 720 - 47 + 24, themeCurrent.textColor, textGetString(StrId_Actions_Apply)); diff --git a/common/theme.c b/common/theme.c index 7d9564d..a932fb5 100644 --- a/common/theme.c +++ b/common/theme.c @@ -6,6 +6,9 @@ #include "hbmenu_logo_light_bin.h" #include "hbmenu_logo_dark_bin.h" +theme_t themeCurrent; +ThemePreset themeGlobalPreset; + bool colorFromSetting(config_setting_t *rgba, color_t *col) { if(rgba == NULL) return false; @@ -14,7 +17,7 @@ bool colorFromSetting(config_setting_t *rgba, color_t *col) { } void themeStartup(ThemePreset preset) { - globalPreset = preset; + themeGlobalPreset = preset; theme_t themeLight = (theme_t) { .textColor = MakeColor(0, 0, 0, 255), .frontWaveColor = MakeColor(100, 212, 250, 255), @@ -70,6 +73,7 @@ void themeStartup(ThemePreset preset) { int waveBlending; const char *AText, *BText; bool good_cfg = config_read_file(&cfg, tmp_path); + switch (preset) { case THEME_PRESET_LIGHT: default: @@ -84,6 +88,7 @@ void themeStartup(ThemePreset preset) { theme = config_lookup(&cfg, "darkTheme"); break; } + if (good_cfg) { if (theme != NULL) { if (!colorFromSetting(config_setting_lookup(theme, "textColor"), &text)) diff --git a/common/theme.h b/common/theme.h index 3931508..abdcfd4 100644 --- a/common/theme.h +++ b/common/theme.h @@ -32,6 +32,6 @@ bool colorFromSetting(config_setting_t *rgba, color_t *col); void themeStartup(ThemePreset preset); -theme_t themeCurrent; +extern theme_t themeCurrent; -ThemePreset globalPreset; +extern ThemePreset themeGlobalPreset; diff --git a/nx_main/main.c b/nx_main/main.c index 7748579..40a9600 100644 --- a/nx_main/main.c +++ b/nx_main/main.c @@ -32,7 +32,7 @@ int main(int argc, char **argv) appletSetScreenShotPermission(1); - ColorSetId theme; + ColorSetId theme; rc = setsysInitialize(); if (R_FAILED(rc)) fatalSimple(-5); @@ -40,6 +40,7 @@ int main(int argc, char **argv) rc = plInitialize(); if (R_FAILED(rc)) fatalSimple(-6); + themeStartup((ThemePreset)theme); textInit(); menuStartup();