#include #include #include "menu.hpp" #include "defines.h" extern const u8 btnchannel_png[]; extern const u8 btnchannels_png[]; extern const u8 btnusb_png[]; extern const u8 btnusbs_png[]; extern const u8 btndml_png[]; extern const u8 btndmls_png[]; extern const u8 btnemu_png[]; extern const u8 btnemus_png[]; extern const u8 btnhomebrew_png[]; extern const u8 btnhomebrews_png[]; extern const u8 favoriteson_png[]; extern const u8 favoritesons_png[]; // Source menu s16 m_sourceLblNotice; s16 m_sourceLblPage; s16 m_sourceBtnPageM; s16 m_sourceBtnPageP; s16 m_sourceBtnBack; s16 m_sourceLblTitle; s16 m_sourceBtnSource[12]; s16 m_sourceLblUser[4]; s16 m_sourceBtnDML; s16 m_sourceBtnEmu; s16 m_sourceBtnUsb; s16 m_sourceBtnChannel; s16 m_sourceBtnHomebrew; TexData m_sourceBg; bool exitSource = false; u8 sourceBtn; u8 selectedBtns; int source_curPage; int source_Pages; string themeName; vector magicNums; char btn_selected[256]; void CMenu::_hideSource(bool instant) { m_btnMgr.hide(m_sourceLblTitle, instant); m_btnMgr.hide(m_sourceLblNotice, instant); m_btnMgr.hide(m_sourceLblPage, instant); m_btnMgr.hide(m_sourceBtnPageM, instant); m_btnMgr.hide(m_sourceBtnPageP, instant); m_btnMgr.hide(m_sourceBtnBack, instant); m_btnMgr.hide(m_sourceBtnHomebrew, instant); m_btnMgr.hide(m_sourceBtnChannel, instant); m_btnMgr.hide(m_sourceBtnUsb, instant); m_btnMgr.hide(m_sourceBtnDML, instant); m_btnMgr.hide(m_sourceBtnEmu, instant); u8 i; for(i = 0; i < ARRAY_SIZE(m_sourceLblUser); ++i) { if(m_sourceLblUser[i] != -1) m_btnMgr.hide(m_sourceLblUser[i], instant); } for(i = 0; i < 12; ++i) { m_btnMgr.hide(m_sourceBtnSource[i], instant); m_btnMgr.freeBtnTexture(m_sourceBtnSource[i]); } } void CMenu::_showSource(void) { _setBg(m_sourceBg, m_sourceBg); for(u8 i = 0; i < ARRAY_SIZE(m_sourceLblUser); ++i) { if(m_sourceLblUser[i] != -1) m_btnMgr.show(m_sourceLblUser[i]); } m_btnMgr.show(m_sourceLblTitle); m_btnMgr.show(m_sourceBtnBack); } void CMenu::_updateSourceBtns(void) { if (source_Pages > 1) { m_btnMgr.setText(m_sourceLblPage, wfmt(L"%i / %i", source_curPage, source_Pages)); m_btnMgr.show(m_sourceLblPage); m_btnMgr.show(m_sourceBtnPageM); m_btnMgr.show(m_sourceBtnPageP); } const char *ImgName = NULL; const char *ImgSelName = NULL; u8 j = (source_curPage - 1) * 12; sourceBtn = 0; selectedBtns = 0; for(u8 i = 0; i < ((source_Pages - 1) * 12 + 12); ++i) { if(i < 12) m_btnMgr.hide(m_sourceBtnSource[i], true); string btnSource = m_source.getString(fmt("BUTTON_%i", i), "source", ""); if(btnSource == "") continue; else if(m_multisource == false) ImgName = m_source.getString(fmt("BUTTON_%i", i),"image", "").c_str(); else if(btnSource == "allplugins") { const vector &EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount); if(EnabledPlugins.size() == 0) { sourceBtn = i; selectedBtns++; ImgName = m_source.getString(fmt("BUTTON_%i", i),"image_s", "").c_str(); } else ImgName = m_source.getString(fmt("BUTTON_%i", i),"image", "").c_str(); } else if(btnSource == "plugin") { magicNums.clear(); magicNums = m_source.getStrings(fmt("BUTTON_%i", i), "magic", ','); if(m_cfg.getBool(PLUGIN_DOMAIN, "source", false) && m_cfg.getBool("PLUGIN", magicNums.at(0), false)) { sourceBtn = i; selectedBtns++; ImgName = m_source.getString(fmt("BUTTON_%i", i),"image_s", "").c_str(); } else ImgName = m_source.getString(fmt("BUTTON_%i", i),"image", "").c_str(); } else if(btnSource == "realnand" || btnSource == "emunand") { ImgName = m_source.getString(fmt("BUTTON_%i", i),"image", "").c_str(); if(m_cfg.getBool(CHANNEL_DOMAIN, "source", false) && m_cfg.getBool(CHANNEL_DOMAIN, "disable") && btnSource == "realnand") { sourceBtn = i; selectedBtns++; ImgName = m_source.getString(fmt("BUTTON_%i", i),"image_s", "").c_str(); } else if(m_cfg.getBool(CHANNEL_DOMAIN, "source", false) && !m_cfg.getBool(CHANNEL_DOMAIN, "disable") && btnSource == "emunand") { sourceBtn = i; selectedBtns++; ImgName = m_source.getString(fmt("BUTTON_%i", i),"image_s", "").c_str(); } } else if(btnSource != "realnand" && btnSource != "emunand" && btnSource != "plugin" && btnSource != "allplugins") { string domain = (btnSource == "dml" ? GC_DOMAIN : (btnSource == "homebrew" ? HOMEBREW_DOMAIN : WII_DOMAIN)); if(m_cfg.getBool(domain, "source", false)) { sourceBtn = i; selectedBtns++; ImgName = m_source.getString(fmt("BUTTON_%i", i),"image_s", "").c_str(); } else ImgName = m_source.getString(fmt("BUTTON_%i", i),"image", "").c_str(); } ImgSelName = m_source.getString(fmt("BUTTON_%i", i),"image_s", "").c_str(); if(i >= j && i < (j + 12)) { TexData texConsoleImg; TexData texConsoleImgs; if(TexHandle.fromImageFile(texConsoleImg, fmt("%s/%s/%s", m_sourceDir.c_str(), themeName.c_str(), ImgName)) != TE_OK) { if(TexHandle.fromImageFile(texConsoleImg, fmt("%s/%s", m_sourceDir.c_str(), ImgName)) != TE_OK) TexHandle.fromPNG(texConsoleImg, favoriteson_png); } if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s/%s", m_sourceDir.c_str(), themeName.c_str(), ImgSelName)) != TE_OK) { if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s", m_sourceDir.c_str(), ImgSelName)) != TE_OK) TexHandle.fromPNG(texConsoleImgs, favoritesons_png); } m_btnMgr.setBtnTexture(m_sourceBtnSource[i - j], texConsoleImg, texConsoleImgs); m_btnMgr.show(m_sourceBtnSource[i - j]); } } } void CMenu::_showSourceNotice(void) { m_showtimer = 90; m_btnMgr.show(m_sourceLblNotice); exitSource = false; } dir_discHdr sourceList; void CMenu::_createSFList() { bool show_homebrew = !m_cfg.getBool(HOMEBREW_DOMAIN, "disable", false); bool show_channel = !m_cfg.getBool("GENERAL", "hidechannel", false); bool show_emu = !m_cfg.getBool(PLUGIN_DOMAIN, "disable", false); bool parental_homebrew = m_cfg.getBool(HOMEBREW_DOMAIN, "parental", false); m_gameList.clear(); for(u8 i = 0; i < m_cfg.getInt("GENERAL", "max_source_buttons", 71); i++) { memset(btn_selected, 0, 256); strncpy(btn_selected, fmt("BUTTON_%i", i), 255); string source = m_source.getString(btn_selected, "source",""); if(source == "") continue; if(source == "dml" && !m_show_dml && !m_devo_installed) continue; else if(source == "emunand" && !show_channel) continue; else if(source == "homebrew" && (!show_homebrew || (!parental_homebrew && m_locked))) continue; else if((source == "plugin" || source == "allplugins") && !show_emu) continue; const char *path = fmt("%s/%s", m_sourceDir.c_str(), m_source.getString(btn_selected, "image", "").c_str()); memset((void*)&sourceList, 0, sizeof(dir_discHdr)); sourceList.index = m_gameList.size(); strncpy(sourceList.id, "SOURCE", 6); strncpy(sourceList.path, path, sizeof(sourceList.path) - 1); sourceList.casecolor = 0xFFFFFF; sourceList.type = TYPE_SOURCE; sourceList.settings[0] = i; const char *title = m_source.getString(btn_selected, "title", fmt("title_%i", i)).c_str(); mbstowcs(sourceList.title, title, 63); Asciify(sourceList.title); m_gameList.push_back(sourceList); } } void CMenu::_sourceFlow() { u8 numPlugins = 0, k; if(!m_cfg.getBool(PLUGIN_DOMAIN, "disable", false)) { Config m_plugin_cfg; DIR *pdir; struct dirent *pent; pdir = opendir(m_pluginsDir.c_str()); while((pent = readdir(pdir)) != NULL) { if(pent->d_name[0] == '.'|| strcasecmp(pent->d_name, "scummvm.ini") == 0) continue; if(strcasestr(pent->d_name, ".ini") != NULL) { m_plugin_cfg.load(fmt("%s/%s", m_pluginsDir.c_str(), pent->d_name)); if (m_plugin_cfg.loaded()) { numPlugins++; m_plugin.AddPlugin(m_plugin_cfg); } m_plugin_cfg.unload(); } } closedir(pdir); m_plugin.EndAdd(); } const dir_discHdr *hdr = CoverFlow.getHdr(); if(m_cfg.getBool("SOURCEFLOW", "remember_last_item", true)) m_cfg.setString("SOURCEFLOW", "current_item", strrchr(hdr->path, '/') + 1); else m_cfg.remove("SOURCEFLOW", "current_item"); memset(btn_selected, 0, 256); strncpy(btn_selected, fmt("BUTTON_%i", hdr->settings[0]), 255); string source = m_source.getString(btn_selected, "source", ""); _clearSources(); if(source == "wii") { m_current_view = COVERFLOW_USB; m_cfg.setBool(WII_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } else if(source == "dml") { m_current_view = COVERFLOW_DML; m_cfg.setBool(GC_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } else if(source == "emunand") { m_current_view = COVERFLOW_CHANNEL; m_cfg.setBool(CHANNEL_DOMAIN, "disable", false); m_cfg.setBool(CHANNEL_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } else if(source == "realnand") { m_current_view = COVERFLOW_CHANNEL; m_cfg.setBool(CHANNEL_DOMAIN, "disable", true); m_cfg.setBool(CHANNEL_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } else if(source == "homebrew") { m_current_view = COVERFLOW_HOMEBREW; m_cfg.setBool(HOMEBREW_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } else if(source == "allplugins") { m_current_view = COVERFLOW_PLUGIN; m_cfg.setBool(PLUGIN_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); for(k = 0; k < numPlugins; ++k) m_plugin.SetEnablePlugin(m_cfg, k, 2); /* force enable */ } else if(source == "plugin") { magicNums.clear(); magicNums = m_source.getStrings(btn_selected, "magic", ','); u32 plugin_magic_nums = magicNums.size(); if(plugin_magic_nums != 0) { m_current_view = COVERFLOW_PLUGIN; m_cfg.setBool(PLUGIN_DOMAIN, "source", true); for(k = 0; k < numPlugins; ++k) m_plugin.SetEnablePlugin(m_cfg, k, 1); /* force disable */ for(vector::iterator itr = magicNums.begin(); itr != magicNums.end(); itr++) { s8 exist = m_plugin.GetPluginPosition(strtoul(itr->c_str(), NULL, 16)); if(exist >= 0) m_plugin.SetEnablePlugin(m_cfg, exist, 2); if(plugin_magic_nums == 1) { currentPartition = m_cfg.getInt("PLUGINS/PARTITION", itr->c_str(), 1); m_cfg.setInt(PLUGIN_DOMAIN, "partition", currentPartition); } } } m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); int layout = m_source.getInt(btn_selected, "emuflow", 0); if(layout > 0) m_cfg.setInt(PLUGIN_DOMAIN, "last_cf_mode", layout); int category = m_source.getInt(btn_selected, "category", 0); if(category > 0) { m_cat.remove("GENERAL", "selected_categories"); m_cat.remove("GENERAL", "required_categories"); char cCh = static_cast(category + 32); string newSelCats(1, cCh); m_cat.setString("GENERAL", "selected_categories", newSelCats); m_clearCats = false; } } m_sourceflow = false; /* autoboot */ const char *autoboot = m_source.getString(btn_selected, "autoboot", "").c_str(); if(autoboot != NULL && autoboot[0] != '\0') { m_source_autoboot = true; memset(&m_autoboot_hdr, 0, sizeof(dir_discHdr)); if(source == "emunand" || source == "realnand") { m_autoboot_hdr.type = TYPE_CHANNEL; memcpy(m_autoboot_hdr.id, autoboot, 4); } else if(source == "wii") { m_autoboot_hdr.type = TYPE_WII_GAME; memcpy(m_autoboot_hdr.id, autoboot, 6); } else if(source == "dml") { m_autoboot_hdr.type = TYPE_GC_GAME; memcpy(m_autoboot_hdr.id, autoboot, 6); } else if(source == "homebrew") { m_autoboot_hdr.type = TYPE_HOMEBREW; mbstowcs(m_autoboot_hdr.title, autoboot, 63); } else if(source == "plugin") { m_autoboot_hdr.type = TYPE_PLUGIN; mbstowcs(m_autoboot_hdr.title, autoboot, 63); } else m_source_autoboot = false; } } bool CMenu::_Source() { CoverFlow.clear(); u8 i, j, k; bool show_homebrew = !m_cfg.getBool(HOMEBREW_DOMAIN, "disable", false); bool show_channel = !m_cfg.getBool("GENERAL", "hidechannel", false); bool show_emu = !m_cfg.getBool(PLUGIN_DOMAIN, "disable", false); bool parental_homebrew = m_cfg.getBool(HOMEBREW_DOMAIN, "parental", false); bool noChanges = true; bool updateSource = false; exitSource = false; u8 numPlugins = 0; m_showtimer = 0; source_curPage = 1; source_Pages = 1; SetupInput(); _showSource(); bool sourceIniLoaded = m_source.loaded(); if(!sourceIniLoaded) { m_btnMgr.show(m_sourceBtnHomebrew); m_btnMgr.show(m_sourceBtnChannel); m_btnMgr.show(m_sourceBtnUsb); m_btnMgr.show(m_sourceBtnDML); m_btnMgr.show(m_sourceBtnEmu); } else { //set number of pages based on highest source btn number used for(i = m_cfg.getInt("GENERAL", "max_source_buttons", 71); i > 11; --i) { string source = m_source.getString(fmt("BUTTON_%i", i), "source", ""); if (!source.empty()) { source_Pages = (i / 12) + 1; break; } } if(show_emu) { Config m_plugin_cfg; DIR *pdir; struct dirent *pent; pdir = opendir(m_pluginsDir.c_str()); while((pent = readdir(pdir)) != NULL) { if(pent->d_name[0] == '.'|| strcasecmp(pent->d_name, "scummvm.ini") == 0) continue; if(strcasestr(pent->d_name, ".ini") != NULL) { m_plugin_cfg.load(fmt("%s/%s", m_pluginsDir.c_str(), pent->d_name)); if (m_plugin_cfg.loaded()) { numPlugins++; m_plugin.AddPlugin(m_plugin_cfg); } m_plugin_cfg.unload(); } } closedir(pdir); m_plugin.EndAdd(); } _updateSourceBtns(); } while(!m_exit) { updateSource = false; _mainLoopCommon(); if(BTN_HOME_PRESSED || (BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnBack)) || (BTN_B_PRESSED)) { if(selectedBtns == 1) { m_catStartPage = m_source.getInt(fmt("BUTTON_%i", sourceBtn), "cat_page", 1); if(m_source.getString(fmt("BUTTON_%i", sourceBtn), "source") == "plugin") { int layout = m_source.getInt(fmt("BUTTON_%i", sourceBtn), "emuflow", 0); if(layout > 0) m_cfg.setInt(PLUGIN_DOMAIN, "last_cf_mode", layout); int category = m_source.getInt(fmt("BUTTON_%i", sourceBtn), "category", 0); if(category > 0) { m_cat.remove("GENERAL", "selected_categories"); m_cat.remove("GENERAL", "required_categories"); char cCh = static_cast(category + 32); string newSelCats(1, cCh); m_cat.setString("GENERAL", "selected_categories", newSelCats); m_clearCats = false; } } } if(selectedBtns == 0) m_cfg.setBool(WII_DOMAIN, "source", true); vector plugin_list = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount); if(enabledPluginsCount == 1) { u8 i = 0; for(i = 0; i < plugin_list.size(); ++i) { if(plugin_list[i] == true) break; } char PluginMagicWord[9]; memset(PluginMagicWord, 0, sizeof(PluginMagicWord)); strncpy(PluginMagicWord, fmt("%08x", m_plugin.getPluginMagic(i)), 8); currentPartition = m_cfg.getInt("PLUGINS/PARTITION", PluginMagicWord, 1); m_cfg.setInt(PLUGIN_DOMAIN, "partition", currentPartition); } u8 sourceCount = 0; if(m_cfg.getBool(WII_DOMAIN, "source", false)) sourceCount++; if(m_cfg.getBool(GC_DOMAIN, "source", false)) sourceCount++; if(m_cfg.getBool(CHANNEL_DOMAIN, "source", false)) sourceCount++; if(m_cfg.getBool(HOMEBREW_DOMAIN, "source", false)) sourceCount++; if(m_cfg.getBool(PLUGIN_DOMAIN, "source", false)) sourceCount++; if(sourceCount > 1) m_combined_view = true; break; } else if(BTN_UP_PRESSED) m_btnMgr.up(); else if(BTN_DOWN_PRESSED) m_btnMgr.down(); else if(((BTN_LEFT_PRESSED || (!m_multisource && BTN_MINUS_PRESSED)) && source_Pages > 1) || (BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnPageM))) { source_curPage--; if(source_curPage < 1) source_curPage = source_Pages; if(!BTN_A_PRESSED) m_btnMgr.click(m_sourceBtnPageM); _updateSourceBtns(); } else if(((BTN_RIGHT_PRESSED || (!m_multisource && BTN_PLUS_PRESSED)) && source_Pages > 1) || (BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnPageP))) { source_curPage++; if(source_curPage > source_Pages) source_curPage = 1; if (!BTN_A_PRESSED) m_btnMgr.click(m_sourceBtnPageP); _updateSourceBtns(); } else if(BTN_A_PRESSED && !sourceIniLoaded) { // check default source buttons when no source_menu.ini if(m_btnMgr.selected(m_sourceBtnUsb)) { _clearSources(); m_cfg.setBool(WII_DOMAIN, "source", true); exitSource = true; } if(m_btnMgr.selected(m_sourceBtnDML)) { if(!m_show_dml && !m_devo_installed) _showSourceNotice(); else { _clearSources(); m_cfg.setBool(GC_DOMAIN, "source", true); exitSource = true; } } if(m_btnMgr.selected(m_sourceBtnChannel)) { if(!show_channel) _showSourceNotice(); else { _clearSources(); m_cfg.setBool(CHANNEL_DOMAIN, "source", true); exitSource = true; } } if(m_btnMgr.selected(m_sourceBtnHomebrew)) { if(!show_homebrew || (!parental_homebrew && m_locked)) _showSourceNotice(); else { _clearSources(); m_cfg.setBool(HOMEBREW_DOMAIN, "source", true); exitSource = true; } } if(m_btnMgr.selected(m_sourceBtnEmu)) { if(!show_emu) _showSourceNotice(); else { _clearSources(); m_cfg.setBool(PLUGIN_DOMAIN, "source", true); exitSource = true; } } } else if((BTN_A_PRESSED || (BTN_PLUS_PRESSED && m_multisource)) && sourceIniLoaded) { // check actual source menu buttons j = (source_curPage - 1) * 12; for(i = 0; i < 12; ++i) { if(m_btnMgr.selected(m_sourceBtnSource[i])) { memset(btn_selected, 0, 256); strncpy(btn_selected, fmt("BUTTON_%i", i + j), 255); string source = m_source.getString(btn_selected, "source", ""); if(BTN_A_PRESSED) { _clearSources(); exitSource = true; m_catStartPage = 1; if(source == "wii") { m_cfg.setBool(WII_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } else if(source == "dml") { if(!m_show_dml && !m_devo_installed) _showSourceNotice(); else { m_cfg.setBool(GC_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } } else if(source == "emunand") { if(!show_channel) _showSourceNotice(); else { m_cfg.setBool(CHANNEL_DOMAIN, "disable", false); m_cfg.setBool(CHANNEL_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } } else if(source == "realnand") { if(!show_channel) _showSourceNotice(); else { m_cfg.setBool(CHANNEL_DOMAIN, "disable", true); m_cfg.setBool(CHANNEL_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } } else if(source == "homebrew") { if(!show_homebrew || (!parental_homebrew && m_locked)) _showSourceNotice(); else { m_cfg.setBool(HOMEBREW_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); } } else if(source == "allplugins") { if(!show_emu) _showSourceNotice(); else { m_cfg.setBool(PLUGIN_DOMAIN, "source", true); m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); for(k = 0; k < numPlugins; ++k) m_plugin.SetEnablePlugin(m_cfg, k, 2); /* force enable */ } } else if(source == "plugin") { if(!show_emu) _showSourceNotice(); else { magicNums.clear(); magicNums = m_source.getStrings(btn_selected, "magic", ','); u32 plugin_magic_nums = magicNums.size(); if(plugin_magic_nums != 0) { m_cfg.setBool(PLUGIN_DOMAIN, "source", true); for(k = 0; k < numPlugins; ++k) m_plugin.SetEnablePlugin(m_cfg, k, 1); /* force disable */ for(vector::iterator itr = magicNums.begin(); itr != magicNums.end(); itr++) { s8 exist = m_plugin.GetPluginPosition(strtoul(itr->c_str(), NULL, 16)); if(exist >= 0) { m_plugin.SetEnablePlugin(m_cfg, exist, 2); if(plugin_magic_nums == 1) { currentPartition = m_cfg.getInt("PLUGINS/PARTITION", itr->c_str(), 1); m_cfg.setInt(PLUGIN_DOMAIN, "partition", currentPartition); } } } } m_catStartPage = m_source.getInt(btn_selected, "cat_page", 1); int layout = m_source.getInt(btn_selected, "emuflow", 0); if(layout > 0) m_cfg.setInt(PLUGIN_DOMAIN, "last_cf_mode", layout); int category = m_source.getInt(btn_selected, "category", 0); if(category > 0) { m_cat.remove("GENERAL", "selected_categories"); m_cat.remove("GENERAL", "required_categories"); char cCh = static_cast(category + 32); string newSelCats(1, cCh); m_cat.setString("GENERAL", "selected_categories", newSelCats); m_clearCats = false; } } } /* autoboot */ const char *autoboot = m_source.getString(btn_selected, "autoboot", "").c_str(); if(autoboot != NULL && autoboot[0] != '\0') { m_source_autoboot = true; memset(&m_autoboot_hdr, 0, sizeof(dir_discHdr)); if(source == "emunand" || source == "realnand") { m_autoboot_hdr.type = TYPE_CHANNEL; memcpy(m_autoboot_hdr.id, autoboot, 4); } else if(source == "wii") { m_autoboot_hdr.type = TYPE_WII_GAME; memcpy(m_autoboot_hdr.id, autoboot, 6); } else if(source == "dml") { m_autoboot_hdr.type = TYPE_GC_GAME; memcpy(m_autoboot_hdr.id, autoboot, 6); } else if(source == "homebrew") { m_autoboot_hdr.type = TYPE_HOMEBREW; mbstowcs(m_autoboot_hdr.title, autoboot, 63); } else if(source == "plugin") { m_autoboot_hdr.type = TYPE_PLUGIN; mbstowcs(m_autoboot_hdr.title, autoboot, 63); } else m_source_autoboot = false; } break; } else { updateSource = true; if(source == "wii") { m_cfg.setBool(WII_DOMAIN, "source", !m_cfg.getBool(WII_DOMAIN, "source")); } else if(source == "dml") { if(m_show_dml || m_devo_installed) m_cfg.setBool(GC_DOMAIN, "source", !m_cfg.getBool(GC_DOMAIN, "source")); } else if(source == "emunand") { if(show_channel) { m_cfg.setBool(CHANNEL_DOMAIN, "disable", false); m_cfg.setBool(CHANNEL_DOMAIN, "source", !m_cfg.getBool(CHANNEL_DOMAIN, "source")); } } else if(source == "realnand") { if(show_channel) { m_cfg.setBool(CHANNEL_DOMAIN, "disable", true); m_cfg.setBool(CHANNEL_DOMAIN, "source", !m_cfg.getBool(CHANNEL_DOMAIN, "source")); } } else if(source == "homebrew") { if(show_homebrew && (parental_homebrew || !m_locked)) m_cfg.setBool(HOMEBREW_DOMAIN, "source", !m_cfg.getBool(HOMEBREW_DOMAIN, "source")); } else if(source == "allplugins") { if(show_emu) { m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount); for(j = 0; m_plugin.PluginExist(j); ++j) /* opposite */ m_plugin.SetEnablePlugin(m_cfg, j, (enabledPluginsCount == 0) ? 2 : 1); m_cfg.setBool(PLUGIN_DOMAIN, "source", (enabledPluginsCount == 0) ? true : false); } } else if(source == "plugin") { if(show_emu) { magicNums.clear(); magicNums = m_source.getStrings(btn_selected, "magic", ','); if(!magicNums.empty()) { for(vector::iterator itr = magicNums.begin(); itr != magicNums.end(); itr++) { u32 cur_magic = strtoul(itr->c_str(), NULL, 16); s8 exist = m_plugin.GetPluginPosition(cur_magic); if(exist >= 0) { bool enabled = m_plugin.GetEnableStatus(m_cfg, cur_magic); m_plugin.SetEnablePlugin(m_cfg, exist, enabled ? 1 : 2); break; } } } m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount); m_cfg.setBool(PLUGIN_DOMAIN, "source", enabledPluginsCount > 0 ? true : false); } } break; } } } } if(exitSource) { m_combined_view = false; noChanges = false; break; } if(updateSource) { noChanges = false; _updateSourceBtns(); } if(m_showtimer > 0) { if(--m_showtimer == 0) m_btnMgr.hide(m_sourceLblNotice); } } _hideSource(true); return noChanges; } void CMenu::_clearSources(void) { m_cfg.setBool(WII_DOMAIN, "source", false); m_cfg.setBool(GC_DOMAIN, "source", false); m_cfg.setBool(CHANNEL_DOMAIN, "source", false); m_cfg.setBool(HOMEBREW_DOMAIN, "source", false); m_cfg.setBool(PLUGIN_DOMAIN, "source", false); } void CMenu::_initSourceMenu() { TexData texDML; TexData texDMLs; TexData texEmu; TexData texEmus; TexData texUsb; TexData texUsbs; TexData texChannel; TexData texChannels; TexData texHomebrew; TexData texHomebrews; TexHandle.fromPNG(texUsb, btnusb_png); TexHandle.fromPNG(texUsbs, btnusbs_png); TexHandle.fromPNG(texDML, btndml_png); TexHandle.fromPNG(texDMLs, btndmls_png); TexHandle.fromPNG(texEmu, btnemu_png); TexHandle.fromPNG(texEmus, btnemus_png); TexHandle.fromPNG(texChannel, btnchannel_png); TexHandle.fromPNG(texChannels, btnchannels_png); TexHandle.fromPNG(texHomebrew, btnhomebrew_png); TexHandle.fromPNG(texHomebrews, btnhomebrews_png); _addUserLabels(m_sourceLblUser, ARRAY_SIZE(m_sourceLblUser), "SOURCE"); m_sourceBg = _texture("SOURCE/BG", "texture", theme.bg, false); m_sourceLblTitle = _addTitle("SOURCE/TITLE", theme.titleFont, L"", 0, 10, 640, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE); m_sourceLblNotice = _addLabel("SOURCE/NOTICE", theme.btnFont, L"", 20, 400, 600, 56, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_TOP); m_sourceLblPage = _addLabel("SOURCE/PAGE_BTN", theme.btnFont, L"", 68, 400, 104, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); m_sourceBtnPageM = _addPicButton("SOURCE/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 20, 400, 48, 48); m_sourceBtnPageP = _addPicButton("SOURCE/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 172, 400, 48, 48); m_sourceBtnBack = _addButton("SOURCE/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 48, theme.btnFontColor); m_sourceBtnChannel = _addPicButton("SOURCE/CHANNEL_BTN", texChannel, texChannels, 265, 260, 48, 48); m_sourceBtnHomebrew = _addPicButton("SOURCE/HOMEBREW_BTN", texHomebrew, texHomebrews, 325, 260, 48, 48); m_sourceBtnUsb = _addPicButton("SOURCE/USB_BTN", texUsb, texUsbs, 235, 200, 48, 48); m_sourceBtnDML = _addPicButton("SOURCE/DML_BTN", texDML, texDMLs, 295, 200, 48, 48); m_sourceBtnEmu = _addPicButton("SOURCE/EMU_BTN", texEmu, texEmus, 355, 200, 48, 48); themeName = m_cfg.getString("GENERAL", "theme", "default"); if(!m_source.load(fmt("%s/%s/%s", m_sourceDir.c_str(), themeName.c_str(), SOURCE_FILENAME))) m_source.load(fmt("%s/%s", m_sourceDir.c_str(), SOURCE_FILENAME)); else m_sourceDir = fmt("%s/%s", m_sourceDir.c_str(), themeName.c_str()); int row; int col; string ImgName; for(u8 i = 0; i < 12; ++i) { TexData texConsoleImg; TexData texConsoleImgs; ImgName = m_source.getString(fmt("BUTTON_%i", i),"image", ""); if(TexHandle.fromImageFile(texConsoleImg, fmt("%s/%s", m_themeDataDir.c_str(), ImgName.c_str())) != TE_OK) { if(TexHandle.fromImageFile(texConsoleImg, fmt("%s/%s", m_sourceDir.c_str(), ImgName.c_str())) != TE_OK) TexHandle.fromPNG(texConsoleImg, favoriteson_png); } ImgName = m_source.getString(fmt("BUTTON_%i", i),"image_s", ""); if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s", m_themeDataDir.c_str(), ImgName.c_str())) != TE_OK) { if(TexHandle.fromImageFile(texConsoleImgs, fmt("%s/%s", m_sourceDir.c_str(), ImgName.c_str())) != TE_OK) TexHandle.fromPNG(texConsoleImgs, favoritesons_png); } row = i / 4; col = i - (row * 4); m_sourceBtnSource[i] = _addPicButton(fmt("SOURCE/SOURCE_BTN_%i", i), texConsoleImg, texConsoleImgs, (100 + 120 * col), (90 + 100 * row), 80, 80); _setHideAnim(m_sourceBtnSource[i], fmt("SOURCE/SOURCE_BTN_%i", i), 0, 0, -2.f, 0.f); } _setHideAnim(m_sourceBtnChannel, "SOURCE/CHANNEL_BTN", 0, 40, 0.f, 0.f); _setHideAnim(m_sourceBtnHomebrew, "SOURCE/HOMEBREW_BTN", 0, 40, 0.f, 0.f); _setHideAnim(m_sourceBtnUsb, "SOURCE/USB_BTN", 0, 40, 0.f, 0.f); _setHideAnim(m_sourceBtnDML, "SOURCE/DML_BTN", 0, 40, 0.f, 0.f); _setHideAnim(m_sourceBtnEmu, "SOURCE/EMU_BTN", 0, 40, 0.f, 0.f); _setHideAnim(m_sourceLblTitle, "SOURCE/TITLE", 0, 0, -2.f, 0.f); _setHideAnim(m_sourceLblNotice, "SOURCE/NOTICE", 0, 0, 1.f, 0.f); _setHideAnim(m_sourceLblPage, "SOURCE/PAGE_BTN", 0, 0, 1.f, -1.f); _setHideAnim(m_sourceBtnPageM, "SOURCE/PAGE_MINUS", 0, 0, 1.f, -1.f); _setHideAnim(m_sourceBtnPageP, "SOURCE/PAGE_PLUS", 0, 0, 1.f, -1.f); _setHideAnim(m_sourceBtnBack, "SOURCE/BACK_BTN", 0, 0, 1.f, -1.f); _textSource(); _hideSource(true); } void CMenu::_textSource(void) { m_btnMgr.setText(m_sourceLblTitle, _t("stup1", L"Select Source")); m_btnMgr.setText(m_sourceLblNotice, _t("stup2", L"** DISABLED **")); m_btnMgr.setText(m_sourceBtnBack, _t("cfg10", L"Back")); }