TP Badge Browser. Incomplete - see notes
TODO: - Load icons for browser - Fix previews (max tex size 512x512 and preview image 512x1024?
This commit is contained in:
BIN
assets/badge.png
Normal file
BIN
assets/badge.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.7 KiB |
@@ -26,3 +26,4 @@ qr.png
|
||||
bgm_only.png
|
||||
back.png
|
||||
dump.png
|
||||
badge.png
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,7 +402,7 @@ 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);
|
||||
@@ -413,7 +410,9 @@ Result install_badges(void)
|
||||
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);
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
32
source/fs.c
32
source/fs.c
@@ -30,6 +30,7 @@
|
||||
#include "draw.h"
|
||||
#include "unicode.h"
|
||||
#include "ui_strings.h"
|
||||
#include "remote.h"
|
||||
|
||||
#include <archive.h>
|
||||
#include <archive_entry.h>
|
||||
@@ -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:
|
||||
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"))
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user