diff --git a/assets/badge.png b/assets/badge.png new file mode 100644 index 0000000..b71185a Binary files /dev/null and b/assets/badge.png differ diff --git a/assets/sprites.t3s b/assets/sprites.t3s index ce0db62..ec9e253 100644 --- a/assets/sprites.t3s +++ b/assets/sprites.t3s @@ -26,3 +26,4 @@ qr.png bgm_only.png back.png dump.png +badge.png diff --git a/include/common.h b/include/common.h index 609242b..b77c375 100644 --- a/include/common.h +++ b/include/common.h @@ -71,6 +71,14 @@ typedef enum { DRAW_MODE_AMOUNT, } DrawMode; +typedef enum { + REMOTE_MODE_THEMES = 0, + REMOTE_MODE_SPLASHES, + REMOTE_MODE_BADGES, + + REMOTE_MODE_AMOUNT, +} RemoteMode; + extern const char * main_paths[MODE_AMOUNT]; extern const int entries_per_screen_v[MODE_AMOUNT]; extern const int entries_per_screen_h[MODE_AMOUNT]; diff --git a/include/draw.h b/include/draw.h index 2f88d4f..0fe5f0e 100644 --- a/include/draw.h +++ b/include/draw.h @@ -52,6 +52,7 @@ typedef enum InstallType_e { INSTALL_LOADING_REMOTE_THEMES, INSTALL_LOADING_REMOTE_SPLASHES, + INSTALL_LOADING_REMOTE_BADGES, INSTALL_LOADING_REMOTE_PREVIEW, INSTALL_LOADING_REMOTE_BGM, @@ -82,6 +83,7 @@ typedef enum { TEXT_INSTALL_LOADING_REMOTE_THEMES, TEXT_INSTALL_LOADING_REMOTE_SPLASHES, + TEXT_INSTALL_LOADING_REMOTE_BADGES, TEXT_INSTALL_LOADING_REMOTE_PREVIEW, TEXT_INSTALL_LOADING_REMOTE_BGM, @@ -111,6 +113,7 @@ typedef enum { TEXT_THEMEPLAZA_THEME_MODE, TEXT_THEMEPLAZA_SPLASH_MODE, + TEXT_THEMEPLAZA_BADGE_MODE, TEXT_SEARCH, TEXT_PAGE, @@ -167,7 +170,7 @@ void set_screen(C3D_RenderTarget * screen); void throw_error(const char * error, ErrorLevel level); bool draw_confirm(const char * conf_msg, Entry_List_s * list, DrawMode draw_mode); -void draw_preview(C2D_Image preview, int preview_offset); +void draw_preview(C2D_Image preview, int preview_offset, float preview_scale); void draw_install(InstallType type); void draw_loading_bar(u32 current, u32 max, InstallType type); diff --git a/include/fs.h b/include/fs.h index 6ed9a55..1dcb285 100644 --- a/include/fs.h +++ b/include/fs.h @@ -66,6 +66,6 @@ u32 compress_lz_file_fast(FS_Path path, FS_Archive archive, char * in_buf, u32 s Result buf_to_file(u32 size, FS_Path path, FS_Archive archive, char * buf); void remake_file(FS_Path path, FS_Archive archive, u32 size); -void save_zip_to_sd(char * filename, u32 size, char * buf, EntryMode mode); +void save_zip_to_sd(char * filename, u32 size, char * buf, RemoteMode mode); #endif diff --git a/include/remote.h b/include/remote.h index 3269969..4a8b1bd 100644 --- a/include/remote.h +++ b/include/remote.h @@ -39,6 +39,12 @@ #define THEMEPLAZA_JSON_PAGE_COUNT "pages" #define THEMEPLAZA_JSON_PAGE_IDS "items" +#define THEMEPLAZA_QUERY_ENTRY_INFO THEMEPLAZA_BASE_API_URL "/query?item_id=%" JSON_INTEGER_FORMAT +#define THEMEPLAZA_JSON_TITLE "title" +#define THEMEPLAZA_JSON_AUTHOR "author" +#define THEMEPLAZA_JSON_DESC "description" +#define THEMEPLAZA_JSON_SUCCESS "success" + #define THEMEPLAZA_JSON_ERROR_MESSAGE "message" #define THEMEPLAZA_JSON_ERROR_MESSAGE_NOT_FOUND "No items found" @@ -62,7 +68,7 @@ typedef struct { char *mime_type; } curl_header; -bool themeplaza_browser(EntryMode mode); +bool themeplaza_browser(RemoteMode mode); Result http_get(const char * url, char ** filename, char ** buf, u32 * size, InstallType install_type, const char * acceptable_mime_types); #endif diff --git a/include/ui_strings.h b/include/ui_strings.h index 204a96b..fdc8f16 100644 --- a/include/ui_strings.h +++ b/include/ui_strings.h @@ -31,9 +31,6 @@ #include "draw.h" #include "common.h" -#define SPLASHES_STRINGS 2 -#define THEMES_STRINGS 6 - typedef struct { const char *quit; const char *thread_error; @@ -56,6 +53,7 @@ typedef struct { const char *sel; const char *tp_theme_mode; const char *tp_splash_mode; + const char *tp_badge_mode; const char *search; const char *page; const char *err_quit; @@ -75,6 +73,7 @@ typedef struct { const char *delete_sd; const char *download_themes; const char *download_splashes; + const char *download_badges; const char *download_preview; const char *download_bgm; const char *dump_single; @@ -176,7 +175,7 @@ typedef struct { Loading_Strings_s loading; Main_Strings_s main; Remote_Strings_s remote; - Instructions_s remote_instructions[MODE_AMOUNT]; + Instructions_s remote_instructions[REMOTE_MODE_AMOUNT]; Instructions_s remote_extra_instructions; Splashes_Strings_s splashes; Themes_Strings_s themes; diff --git a/source/badges.c b/source/badges.c index bf14536..5036e71 100644 --- a/source/badges.c +++ b/source/badges.c @@ -249,7 +249,7 @@ Result install_badges(void) Handle folder = 0; Result res = 0; - res = actInit(); + res = actInit(); if (R_FAILED(res)) { DEBUG("actInit() failed!\n"); @@ -271,9 +271,6 @@ Result install_badges(void) return res; } - u64 badgeDataSize = 0xF4DF80; - u64 badgeMngSize = 0xD4A8; - badgeMngBuffer = NULL; badgeDataBuffer = NULL; rgb_buf_64x64 = NULL; @@ -296,8 +293,8 @@ Result install_badges(void) alpha_buf_64x64 = malloc(12*6*64*64/2); //Same thing, but 2 pixels of alpha data per byte rgb_buf_32x32 = malloc(12*6*32*32*2); //Same thing, but 32x32 alpha_buf_32x32 = malloc(12*6*32*32/2); - badgeDataBuffer = calloc(1, badgeDataSize); - badgeMngBuffer = calloc(1, badgeMngSize); + badgeDataBuffer = calloc(1, BADGE_DATA_SIZE); + badgeMngBuffer = calloc(1, BADGE_MNG_SIZE); int badge_count = 0; int set_count = 0; int default_set = 0; @@ -366,7 +363,7 @@ Result install_badges(void) memcpy(badgeDataBuffer + 0x250F80 + default_index * 0x2000, rgb_buf_64x64, 64 * 64 * 2); } - res = buf_to_file(badgeDataSize, fsMakePath(PATH_ASCII, "/BadgeData.dat"), ArchiveBadgeExt, badgeDataBuffer); + res = buf_to_file(BADGE_DATA_SIZE, fsMakePath(PATH_ASCII, "/BadgeData.dat"), ArchiveBadgeExt, badgeDataBuffer); if (res) { DEBUG("Error writing badge data! %lx\n", res); @@ -405,15 +402,17 @@ Result install_badges(void) FSFILE_Close(handle); } - res = buf_to_file(badgeMngSize, fsMakePath(PATH_ASCII, "/BadgeMngFile.dat"), ArchiveBadgeExt, badgeMngBuffer); + res = buf_to_file(BADGE_MNG_SIZE, fsMakePath(PATH_ASCII, "/BadgeMngFile.dat"), ArchiveBadgeExt, badgeMngBuffer); if (res) { DEBUG("Error writing badge manage data! %lx\n", res); throw_error(language.badges.extdata_locked, ERROR_LEVEL_WARNING); goto end; } + end: + actExit(); if (rgb_buf_64x64) free(rgb_buf_64x64); if (alpha_buf_64x64) free(alpha_buf_64x64); if (rgb_buf_32x32) free(rgb_buf_32x32); diff --git a/source/draw.c b/source/draw.c index 88e7e17..2b4cf13 100644 --- a/source/draw.c +++ b/source/draw.c @@ -97,6 +97,7 @@ void init_screens(void) C2D_TextParse(&text[TEXT_THEMEPLAZA_THEME_MODE], staticBuf, language.draw.tp_theme_mode); C2D_TextParse(&text[TEXT_THEMEPLAZA_SPLASH_MODE], staticBuf, language.draw.tp_splash_mode); + C2D_TextParse(&text[TEXT_THEMEPLAZA_BADGE_MODE], staticBuf, language.draw.tp_badge_mode); C2D_TextParse(&text[TEXT_SEARCH], staticBuf, language.draw.search); C2D_TextParse(&text[TEXT_PAGE], staticBuf, language.draw.page); @@ -124,6 +125,7 @@ void init_screens(void) C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_THEMES], staticBuf, language.draw.download_themes); C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_SPLASHES], staticBuf, language.draw.download_splashes); + C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_BADGES], staticBuf, language.draw.download_badges); C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_PREVIEW], staticBuf, language.draw.download_preview); C2D_TextParse(&text[TEXT_INSTALL_LOADING_REMOTE_BGM], staticBuf, language.draw.download_bgm); C2D_TextParse(&text[TEXT_INSTALL_DUMPING_THEME], staticBuf, language.draw.dump_single); @@ -340,13 +342,13 @@ bool draw_confirm(const char * conf_msg, Entry_List_s * list, DrawMode draw_mode return false; } -void draw_preview(C2D_Image preview, int preview_offset) +void draw_preview(C2D_Image preview, int preview_offset, float preview_scale) { start_frame(); set_screen(top); - C2D_DrawImageAt(preview, -preview_offset, 0, 0.5f, NULL, 1.0f, 1.0f); + C2D_DrawImageAt(preview, -preview_offset, 0, 0.5f, NULL, preview_scale, preview_scale); set_screen(bottom); - C2D_DrawImageAt(preview, -(preview_offset+40), -240, 0.5f, NULL, 1.0f, 1.0f); + C2D_DrawImageAt(preview, -(preview_offset+40), -240, 0.5f, NULL, preview_scale, preview_scale); } static void draw_install_handler(InstallType type) @@ -520,9 +522,10 @@ void draw_grid_interface(Entry_List_s * list, Instructions_s instructions, int e draw_base_interface(); EntryMode current_mode = list->mode; - C2D_Text * mode_string[MODE_AMOUNT] = { + C2D_Text * mode_string[REMOTE_MODE_AMOUNT] = { &text[TEXT_THEMEPLAZA_THEME_MODE], &text[TEXT_THEMEPLAZA_SPLASH_MODE], + &text[TEXT_THEMEPLAZA_BADGE_MODE], }; draw_c2d_text_center(GFX_TOP, 4, 0.5f, 0.5f, 0.5f, colors[COLOR_WHITE], mode_string[current_mode]); @@ -699,16 +702,17 @@ void draw_interface(Entry_List_s * list, Instructions_s instructions, DrawMode d draw_image(sprites_browse_idx, 320-24, 0); draw_image(sprites_dump_idx, 320-48, 0); draw_image(sprites_sort_idx, 320-72, 0); - draw_image(sprites_back_idx, 320-96, 0); + draw_image(sprites_badge_idx, 320-96, 0); + draw_image(sprites_back_idx, 320-120, 0); } } // Show arrows if there are themes out of bounds //---------------------------------------------------------------- if(list->scroll > 0) - draw_image(sprites_arrow_up_idx, 136, 220); + draw_image(sprites_arrow_up_idx, 141, 220); if(list->scroll + list->entries_loaded < list->entries_count) - draw_image(sprites_arrow_down_idx, 152, 220); + draw_image(sprites_arrow_down_idx, 157, 220); for(int i = list->scroll; i < (list->entries_loaded + list->scroll); i++) { diff --git a/source/fs.c b/source/fs.c index 81622a2..1000683 100644 --- a/source/fs.c +++ b/source/fs.c @@ -30,6 +30,7 @@ #include "draw.h" #include "unicode.h" #include "ui_strings.h" +#include "remote.h" #include #include @@ -108,6 +109,7 @@ Result open_archives(void) FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Themes"), FS_ATTRIBUTE_DIRECTORY); FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Splashes"), FS_ATTRIBUTE_DIRECTORY); FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Badges"), FS_ATTRIBUTE_DIRECTORY); + FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges"), FS_ATTRIBUTE_DIRECTORY); FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds"), FS_ATTRIBUTE_DIRECTORY); FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE), FS_ATTRIBUTE_DIRECTORY); FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE "/cache"), FS_ATTRIBUTE_DIRECTORY); @@ -145,6 +147,20 @@ Result open_archives(void) Handle test_handle; if(R_FAILED(res = FSUSER_OpenFile(&test_handle, ArchiveThemeExt, fsMakePath(PATH_ASCII, "/ThemeManage.bin"), FS_OPEN_READ, 0))) return res; FSFILE_Close(test_handle); + if(R_FAILED(res = FSUSER_OpenFile(&test_handle, ArchiveSD, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), FS_OPEN_READ, 0))) + { + FILE *fp = fopen("romfs:/tp_set.png", "rb"); + fseek(fp, 0L, SEEK_END); + ssize_t size = ftell(fp); + char *icon_buf = malloc(size); + fseek(fp, 0L, SEEK_SET); + fread(icon_buf, 1, size, fp); + fclose(fp); + remake_file(fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), ArchiveSD, size); + buf_to_file(size, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), ArchiveSD, icon_buf); + DEBUG("res: 0x%08lx\n", res); + free(icon_buf); + } return 0; } @@ -156,6 +172,7 @@ Result close_archives(void) if(R_FAILED(res = FSUSER_CloseArchive(ArchiveSD))) return res; if(R_FAILED(res = FSUSER_CloseArchive(ArchiveHomeExt))) return res; if(R_FAILED(res = FSUSER_CloseArchive(ArchiveThemeExt))) return res; + if(R_FAILED(res = FSUSER_CloseArchive(ArchiveBadgeExt))) return res; return 0; } @@ -433,16 +450,26 @@ static SwkbdCallbackResult fat32filter(void * user, const char ** ppMessage, con } // assumes the input buffer is a ZIP. if it isn't, why are you calling this? -void save_zip_to_sd(char * filename, u32 size, char * buf, EntryMode mode) +void save_zip_to_sd(char * filename, u32 size, char * buf, RemoteMode mode) { static char path_to_file[32761]; // FAT32 paths can be quite long. const int max_chars = 250; char new_filename[max_chars + 5]; // .zip + \0 renamed: - sprintf(path_to_file, "%s%s", main_paths[mode], filename); + char * curr_filename; + if (mode == REMOTE_MODE_BADGES) + { + DEBUG("Remote mode badges! Saving to /Badges/ThemePlaza Badges/\n"); + sprintf(path_to_file, "%s%s", "/Badges/ThemePlaza Badges/", filename); + curr_filename = path_to_file + strlen("/Badges/ThemePlaza Badges/"); + } else + { + sprintf(path_to_file, "%s%s", main_paths[mode], filename); + curr_filename = path_to_file + strlen(main_paths[mode]); + } + DEBUG("Filtering out illegal chars...\n"); // filter out characters illegal in FAT32 filenames - char * curr_filename = path_to_file + strlen(main_paths[mode]); char * illegal_char = curr_filename; while ((illegal_char = strpbrk(illegal_char, ILLEGAL_CHARS))) { @@ -462,6 +489,7 @@ renamed: *illegal_char = '-'; } + DEBUG("Checking extension\n"); // ensure the extension is .zip char * extension = strrchr(path_to_file, '.'); if (extension == NULL || strcmp(extension, ".zip")) diff --git a/source/main.c b/source/main.c index cc8d136..ef050d7 100644 --- a/source/main.c +++ b/source/main.c @@ -454,7 +454,7 @@ int main(void) if(preview_mode) { - draw_preview(preview, preview_offset); + draw_preview(preview, preview_offset, 1.0f); } else { if(!iconLoadingThread_arg.run_thread) @@ -574,7 +574,7 @@ int main(void) if(preview_mode) { end_frame(); - draw_preview(preview, preview_offset); + draw_preview(preview, preview_offset, 1.0f); end_frame(); if(current_mode == MODE_THEMES && dspfirm) { @@ -606,11 +606,12 @@ int main(void) } } + int selected_entry = current_list->selected_entry; + Entry_s * current_entry = ¤t_list->entries[selected_entry]; + if(preview_mode || current_list->entries == NULL) goto touch; - int selected_entry = current_list->selected_entry; - Entry_s * current_entry = ¤t_list->entries[selected_entry]; if(install_mode) { @@ -786,6 +787,9 @@ int main(void) break; } } else if (BETWEEN(320-96, x, 320-72)) + { + goto badge_install; + } else if (BETWEEN(320-120, x, 320-96)) { extra_mode = false; extra_index = 1; @@ -804,7 +808,7 @@ int main(void) else if(kDown & KEY_DLEFT) { browse_themeplaza: - if(themeplaza_browser(current_mode)) + if(themeplaza_browser((RemoteMode) current_mode)) { current_mode = MODE_THEMES; load_lists(lists); @@ -831,6 +835,10 @@ int main(void) } else if (kDown & KEY_DRIGHT) { + badge_install: + extra_mode = false; + extra_index = 1; + draw_mode = DRAW_MODE_LIST; draw_install(INSTALL_BADGES); install_badges(); } diff --git a/source/remote.c b/source/remote.c index 8ad9808..ccfea89 100644 --- a/source/remote.c +++ b/source/remote.c @@ -50,6 +50,41 @@ static void free_icons(Entry_List_s * list) } } +static void load_remote_metadata(Entry_s * entry) +{ + char *page_json = NULL; + char *api_url = NULL; + asprintf(&api_url, THEMEPLAZA_QUERY_ENTRY_INFO, entry->tp_download_id); + u32 json_len; + Result res = http_get(api_url, NULL, &page_json, &json_len, INSTALL_NONE, "application/json"); + free(api_url); + if (R_FAILED(res)) + { + free(page_json); + return; + } + + if (json_len) + { + json_error_t error; + json_t *root = json_loadb(page_json, json_len, 0, &error); + if (root) + { + const char *key; + json_t *value; + json_object_foreach(root, key, value) + { + if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_TITLE)) + utf8_to_utf16(entry->name, (u8 *) json_string_value(value), min(json_string_length(value), 0x41)); + else if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_AUTHOR)) + utf8_to_utf16(entry->author, (u8 *) json_string_value(value), min(json_string_length(value), 0x41)); + else if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_DESC)) + utf8_to_utf16(entry->desc, (u8 *) json_string_value(value), min(json_string_length(value), 0x81)); + } + } + } +} + static void load_remote_smdh(Entry_s * entry, C3D_Tex * into_tex, const Entry_Icon_s * icon_info, bool ignore_cache) { bool not_cached = true; @@ -102,7 +137,7 @@ static void load_remote_smdh(Entry_s * entry, C3D_Tex * into_tex, const Entry_Ic } } -static void load_remote_entries(Entry_List_s * list, json_t * ids_array, bool ignore_cache, InstallType type) +static void load_remote_entries(Entry_List_s * list, json_t * ids_array, bool ignore_cache, InstallType type, RemoteMode mode) { free(list->entries); list->entries_count = json_array_size(ids_array); @@ -122,11 +157,17 @@ static void load_remote_entries(Entry_List_s * list, json_t * ids_array, bool ig utf8_to_utf16(current_entry->path, (u8 *)entry_path, 0x106); free(entry_path); - load_remote_smdh(current_entry, &list->icons_texture, &list->icons_info[i], ignore_cache); + if (mode != REMOTE_MODE_BADGES) + load_remote_smdh(current_entry, &list->icons_texture, &list->icons_info[i], ignore_cache); + else + { + list->entries[i].placeholder_color = C2D_Color32(rand() * 255, rand() * 255, rand() * 255, 255); + load_remote_metadata(current_entry); + } } } -static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mode, bool ignore_cache) +static void load_remote_list(Entry_List_s * list, json_int_t page, RemoteMode mode, bool ignore_cache) { if (page > list->tp_page_count) page = 1; @@ -136,10 +177,12 @@ static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mod list->selected_entry = 0; InstallType loading_screen = INSTALL_NONE; - if (mode == MODE_THEMES) + if (mode == REMOTE_MODE_THEMES) loading_screen = INSTALL_LOADING_REMOTE_THEMES; - else if (mode == MODE_SPLASHES) + else if (mode == REMOTE_MODE_SPLASHES) loading_screen = INSTALL_LOADING_REMOTE_SPLASHES; + else if (mode == REMOTE_MODE_BADGES) + loading_screen = INSTALL_LOADING_REMOTE_BADGES; draw_install(loading_screen); char * page_json = NULL; @@ -170,7 +213,7 @@ static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mod if (json_is_integer(value) && !strcmp(key, THEMEPLAZA_JSON_PAGE_COUNT)) list->tp_page_count = json_integer_value(value); else if (json_is_array(value) && !strcmp(key, THEMEPLAZA_JSON_PAGE_IDS)) - load_remote_entries(list, value, ignore_cache, loading_screen); + load_remote_entries(list, value, ignore_cache, loading_screen, mode); else if (json_is_string(value) && !strcmp(key, THEMEPLAZA_JSON_ERROR_MESSAGE) && !strcmp(json_string_value(value), THEMEPLAZA_JSON_ERROR_MESSAGE_NOT_FOUND)) throw_error(language.remote.no_results, ERROR_LEVEL_WARNING); @@ -189,7 +232,7 @@ static void load_remote_list(Entry_List_s * list, json_int_t page, EntryMode mod static u16 previous_path_preview[0x106]; -static bool load_remote_preview(const Entry_s * entry, C2D_Image * preview_image, int * preview_offset) +static bool load_remote_preview(const Entry_s * entry, C2D_Image * preview_image, int * preview_offset, u32 height) { bool not_cached = true; @@ -224,7 +267,6 @@ static bool load_remote_preview(const Entry_s * entry, C2D_Image * preview_image char * preview_buf = malloc(preview_size); u32 preview_buf_size = preview_size; memcpy(preview_buf, preview_png, preview_size); - u32 height = 480; if (!(preview_buf_size = png_to_abgr(&preview_buf, preview_buf_size, &height))) { @@ -288,7 +330,7 @@ static void load_remote_bgm(const Entry_s * entry) free(bgm_ogg); } -static void download_remote_entry(Entry_s * entry, EntryMode mode) +static void download_remote_entry(Entry_s * entry, RemoteMode mode) { char * download_url = NULL; asprintf(&download_url, THEMEPLAZA_DOWNLOAD_FORMAT, entry->tp_download_id); @@ -411,7 +453,7 @@ static void change_selected(Entry_List_s * list, int change_value) list->selected_entry = newval; } -bool themeplaza_browser(EntryMode mode) +bool themeplaza_browser(RemoteMode mode) { bool downloaded = false; @@ -489,7 +531,9 @@ bool themeplaza_browser(EntryMode mode) if (preview_mode) { - draw_preview(preview, preview_offset); + if (mode == REMOTE_MODE_BADGES) draw_preview(preview, -40, 0.625f); + else draw_preview(preview, preview_offset, 1.0f); + } else { @@ -531,7 +575,7 @@ bool themeplaza_browser(EntryMode mode) extra_mode = false; change_mode: mode++; - mode %= MODE_AMOUNT; + mode %= REMOTE_MODE_AMOUNT; free(current_list->tp_search); current_list->tp_search = strdup(""); @@ -564,8 +608,9 @@ bool themeplaza_browser(EntryMode mode) toggle_preview: if (!preview_mode) { - preview_mode = load_remote_preview(current_entry, &preview, &preview_offset); - if (mode == MODE_THEMES && dspfirm) + u32 height = mode == REMOTE_MODE_BADGES ? 1024 : 480; + preview_mode = load_remote_preview(current_entry, &preview, &preview_offset, height); + if (mode == REMOTE_MODE_THEMES && dspfirm) { load_remote_bgm(current_entry); audio = calloc(1, sizeof(audio_s)); @@ -576,7 +621,7 @@ bool themeplaza_browser(EntryMode mode) else { preview_mode = false; - if (mode == MODE_THEMES && audio != NULL) + if (mode == REMOTE_MODE_THEMES && audio != NULL) { stop_audio(&audio); } @@ -588,7 +633,7 @@ bool themeplaza_browser(EntryMode mode) if (preview_mode) { preview_mode = false; - if (mode == MODE_THEMES && audio != NULL) + if (mode == REMOTE_MODE_THEMES && audio != NULL) { stop_audio(&audio); } @@ -654,7 +699,7 @@ bool themeplaza_browser(EntryMode mode) if (preview_mode) { preview_mode = false; - if (mode == MODE_THEMES && audio) + if (mode == REMOTE_MODE_THEMES && audio) { stop_audio(&audio); } diff --git a/source/ui_strings.c b/source/ui_strings.c index 6f8f425..8ca9b95 100644 --- a/source/ui_strings.c +++ b/source/ui_strings.c @@ -187,6 +187,7 @@ const Language_s language_english = { .sel = "Sel.:", .tp_theme_mode = "ThemePlaza Theme mode", .tp_splash_mode = "ThemePlaza Splash mode", + .tp_badge_mode = "ThemePlaza Badge mode", .search = "Search...", .page = "Page:", .err_quit = "Press \uE000 to quit.", @@ -206,6 +207,7 @@ const Language_s language_english = { .delete_sd = "Deleting from SD...", .download_themes = "Downloading theme list, please wait...", .download_splashes = "Downloading splash list, please wait...", + .download_badges = "Downloading badge list, please wait...", .download_preview = "Downloading preview, please wait...", .download_bgm = "Downloading BGM, please wait...", .dump_single = "Dumping theme, please wait...", @@ -320,6 +322,27 @@ const Language_s language_english = { NULL } } + }, + { + .info_line = NULL, + .instructions = { + { + "\uE000 Download badges", + "\uE001 Go back" + }, + { + "\uE002 More options", + "\uE003 Preview badges" + }, + { + "\uE004 Previous page", + "\uE005 Next page" + }, + { + "Exit", + NULL + } + } } }, .remote_extra_instructions = @@ -360,7 +383,7 @@ const Language_s language_english = { }, .badges = { - .extdata_locked = "Ext Data Locked\nTry restarting Anemone3DS, or using\nthe CIA version instead." + .extdata_locked = "Ext Data Locked\nTry pressing the Home Button and then returning\nto Anemone3DS, or using the CIA version instead." } }; @@ -524,6 +547,7 @@ const Language_s language_french = { .sel = "Sél.:", .tp_theme_mode = "Thèmes de ThemePlaza", .tp_splash_mode = "Splashs de ThemePlaza", + .tp_badge_mode = "ThemePlaza Badge mode", .search = "Rechercher...", .page = "Page:", .err_quit = "Appuyez sur \uE000 pour quitter.", @@ -543,6 +567,7 @@ const Language_s language_french = { .delete_sd = "Effacement...", .download_themes = "Téléchargement de la liste des thèmes,\nveuillez patienter...", .download_splashes = "Téléchargement de la liste des splashs,\nveuillez patienter...", + .download_badges = "Downloading badge list, please wait...", .download_preview = "Téléchargement de l'aperçu,\nveuillez patienter...", .download_bgm = "Téléchargement de la musique,\nveuillez patienter...", .dump_single = "Extraction du thème installé,\nveuillez patienter...", @@ -657,6 +682,27 @@ const Language_s language_french = { NULL } } + }, + { + .info_line = NULL, + .instructions = { + { + "\uE000 Download badges", + "\uE001 Go back" + }, + { + "\uE002 More options", + "\uE003 Preview badges" + }, + { + "\uE004 Previous page", + "\uE005 Next page" + }, + { + "Exit", + NULL + } + } } }, .remote_extra_instructions = @@ -697,7 +743,7 @@ const Language_s language_french = { }, .badges = { - .extdata_locked = "Ext Data Locked\nTry restarting Anemone3DS, or using\nthe CIA version instead." + .extdata_locked = "Ext Data Locked\nTry pressing the Home Button and then returning\nto Anemone3DS, or using the CIA version instead." } }; @@ -861,6 +907,7 @@ const Language_s language_portuguese = { .sel = "Sel.:", .tp_theme_mode = "Modo de tema ThemePlaza", .tp_splash_mode = "Modo de splash ThemePlaza", + .tp_badge_mode = "ThemePlaza Badge mode", .search = "Pesquisar...", .page = "Página:", .err_quit = "Aperte \uE000 para sair.", @@ -880,6 +927,7 @@ const Language_s language_portuguese = { .delete_sd = "Deletando do SD...", .download_themes = "Baixando a lista de temas, aguarde...", .download_splashes = "Baixando a lista de splashes, aguarde...", + .download_badges = "Downloading badge list, please wait...", .download_preview = "Baixando prévia, aguarde...", .download_bgm = "Baixando BGM, aguarde...", .dump_single = "Exportando tema, aguarde...", @@ -994,6 +1042,27 @@ const Language_s language_portuguese = { NULL } } + }, + { + .info_line = NULL, + .instructions = { + { + "\uE000 Download badges", + "\uE001 Go back" + }, + { + "\uE002 More options", + "\uE003 Preview badges" + }, + { + "\uE004 Previous page", + "\uE005 Next page" + }, + { + "Exit", + NULL + } + } } }, .remote_extra_instructions = @@ -1034,7 +1103,7 @@ const Language_s language_portuguese = { }, .badges = { - .extdata_locked = "Ext Data Locked\nTry restarting Anemone3DS, or using\nthe CIA version instead." + .extdata_locked = "Ext Data Locked\nTry pressing the Home Button and then returning\nto Anemone3DS, or using the CIA version instead." } };