mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-11-27 21:54:15 +01:00
2873de8f91
-added sourceflow -added new source menu config menu access it via startup settings menu. Use it to enable source menu, sourceflow, source menu/flow on startup, multisource (source menu only), smallbox for sourceflow, and clear sourceflow cache. To use sourceflow you will need to add title= to each source btn in source_menu.ini. Give each btn a title for coverflow to use. sourceflow will use the normal source menu icons or you can add the following folders to your source menu folder - full_covers, front_covers, and small_covers. the first 2 are obvious, the last one is for smallbox if you don't want to use the source menu btn images. the clear sourceflow cache function is similar to reload cache. use it if you make changes to your covers or your covers aren't displaying correctly. any questions just ask on gba or irc.
864 lines
28 KiB
C++
864 lines
28 KiB
C++
#include <dirent.h>
|
|
#include <unistd.h>
|
|
|
|
#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;
|
|
|
|
u8 sourceBtn;
|
|
u8 selectedBtns;
|
|
int source_curPage;
|
|
int source_Pages;
|
|
string themeName;
|
|
vector<string> 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<bool> &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);
|
|
}
|
|
|
|
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();
|
|
m_cfg.setString("SOURCEFLOW", "current_item", strrchr(hdr->path, '/') + 1);
|
|
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<string>::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<char>(category + 32);
|
|
string newSelCats(1, cCh);
|
|
m_cat.setString("GENERAL", "selected_categories", newSelCats);
|
|
m_clearCats = false;
|
|
}
|
|
}
|
|
m_sourceflow = 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;
|
|
bool 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<char>(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<bool> plugin_list = m_plugin.GetEnabledPlugins(m_cfg, &enabledPluginsCount);
|
|
if(enabledPluginsCount == 1)
|
|
{
|
|
u8 i = 0;
|
|
for(i = 0; i < enabledPluginsCount; ++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<string>::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<char>(category + 32);
|
|
string newSelCats(1, cCh);
|
|
m_cat.setString("GENERAL", "selected_categories", newSelCats);
|
|
m_clearCats = 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<string>::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"", 20, 20, 600, 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"", 62, 400, 98, 56, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC);
|
|
m_sourceBtnPageM = _addPicButton("SOURCE/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 10, 400, 52, 56);
|
|
m_sourceBtnPageP = _addPicButton("SOURCE/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 160, 400, 52, 56);
|
|
m_sourceBtnBack = _addButton("SOURCE/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 56, 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, (30 + 150 * col), (90 + 100 * row), 120, 90);
|
|
_setHideAnim(m_sourceBtnSource[i], fmt("SOURCE/SOURCE_BTN_%i", i), 0, 0, 1.f, 1.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, -2.f, 0.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"));
|
|
}
|