From 88c4eed3c3db882174873cc564cddf1ede49efad Mon Sep 17 00:00:00 2001 From: "fix94.1" Date: Sat, 5 May 2012 20:07:54 +0000 Subject: [PATCH] -added plugin selection menu in global settings, if in plugin coverflow it will replace the nand emu button, in this memu you can select which plugin should be displayed, it will work no matter which sort is set, you can select more than one emulator at the time of course KNOWN ISSUE: -background music is missing --- source/menu/menu.cpp | 62 ++++++---- source/menu/menu.hpp | 27 ++++- source/menu/menu_config.cpp | 38 ++++-- source/menu/menu_plugin.cpp | 227 ++++++++++++++++++++++++++++++++++++ source/plugin/plugin.cpp | 57 +++++++++ source/plugin/plugin.hpp | 5 + 6 files changed, 379 insertions(+), 37 deletions(-) create mode 100644 source/menu/menu_plugin.cpp diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index b16373ad..43823a2f 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -434,6 +434,8 @@ void CMenu::init(void) m_favorites = m_cfg.getBool(domain, "favorites", false); m_max_categories = m_cat.getInt("GENERAL", "numcategories", 21); + m_plugins = 0; + m_cfg.setString("GAMERCARD", "gamercards", "wiinnertag|dutag"); m_cfg.getString("GAMERCARD", "wiinnertag_url", WIINNERTAG_URL); m_cfg.getString("GAMERCARD", "wiinnertag_key", ""); @@ -1025,11 +1027,12 @@ void CMenu::_buildMenus(void) _initCFThemeMenu(theme); _initGameSettingsMenu(theme); _initCheatSettingsMenu(theme); + _initPluginSettingsMenu(theme); _initCategorySettingsMenu(theme); _initSystemMenu(theme); _initGameInfoMenu(theme); _initNandEmuMenu(theme); - + _loadCFCfg(theme); } @@ -1454,6 +1457,9 @@ void CMenu::_initCF(void) m_cf.clear(); m_cf.reserve(m_gameList.size()); + safe_vector EnabledPlugins; + if(m_current_view == COVERFLOW_EMU) + EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg); m_gamelistdump = m_cfg.getBool(domain, "dump_list", true); if(m_gamelistdump) m_dump.load(fmt("%s/titlesdump.ini", m_settingsDir.c_str())); @@ -1463,31 +1469,33 @@ void CMenu::_initCF(void) for (u32 i = 0; i < m_gameList.size(); ++i) { u64 chantitle = m_gameList[i].hdr.chantitle; - if (m_current_view == COVERFLOW_CHANNEL && chantitle == HBC_108) strncpy((char *) m_gameList[i].hdr.id, "JODI", 6); - + if (m_current_view == COVERFLOW_CHANNEL && chantitle == HBC_108) + strncpy((char *) m_gameList[i].hdr.id, "JODI", 6); if (m_current_view == COVERFLOW_EMU) - { - string tempname(m_gameList[i].path); - tempname.erase(0, tempname.find_first_of('/')+1); - string dirName = tempname.substr(0, tempname.find_first_of('/')+1); - tempname.assign(&tempname[tempname.find_last_of('/') + 1]); - if(tempname.find_last_of('.') != string::npos) - tempname.erase(tempname.find_last_of('.'), tempname.size() - tempname.find_last_of('.')); - id = dirName+tempname; - } - else id = string((const char *)m_gameList[i].hdr.id, m_current_view == COVERFLOW_CHANNEL ? 4 : 6); - string idcats = m_cat.getString("CATEGORIES", id, "").c_str(); - if (idcats.length() < 21 && idcats.length() > 0) - { - idcats.append((21-idcats.length()), '0'); - m_cat.setString("CATEGORIES", id, idcats); - } + { + string tempname(m_gameList[i].path); + tempname.erase(0, tempname.find_first_of('/')+1); + string dirName = tempname.substr(0, tempname.find_first_of('/')+1); + tempname.assign(&tempname[tempname.find_last_of('/') + 1]); + if(tempname.find_last_of('.') != string::npos) + tempname.erase(tempname.find_last_of('.'), tempname.size() - tempname.find_last_of('.')); + id = dirName+tempname; + } + else + id = string((const char *)m_gameList[i].hdr.id, m_current_view == COVERFLOW_CHANNEL ? 4 : 6); + string idcats = m_cat.getString("CATEGORIES", id, "").c_str(); + if (idcats.length() < 21 && idcats.length() > 0) + { + idcats.append((21-idcats.length()), '0'); + m_cat.setString("CATEGORIES", id, idcats); + } if ((!m_favorites || m_gcfg1.getBool("FAVORITES", id, false)) && (!m_locked || !m_gcfg1.getBool("ADULTONLY", id, false))) { if (catviews[0] == '0') { const char *idcats = m_cat.getString("CATEGORIES", id, "").c_str(); - if (strlen(idcats) == 0) continue; + if (strlen(idcats) == 0) + continue; else { bool idinacat=0; @@ -1508,7 +1516,19 @@ void CMenu::_initCF(void) string coverFolder(m_plugin.GetCoverFolderName(m_gameList[i].hdr.magic)); //if(tempname.find_last_of('.') != string::npos) // tempname.erase(tempname.find_last_of('.'), tempname.size() - tempname.find_last_of('.')); - m_cf.addItem(&m_gameList[i], fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), playcount, lastPlayed); + if(EnabledPlugins.size() == 0) //all plugins + m_cf.addItem(&m_gameList[i], fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), playcount, lastPlayed); + else + { + for(u8 j = 0; j < EnabledPlugins.size(); j++) + { + if(EnabledPlugins[j] == true && m_gameList[i].hdr.magic == m_plugin.getPluginMagic(j)) + { + m_cf.addItem(&m_gameList[i], fmt("%s/%s/%s.png", m_picDir.c_str(), coverFolder.c_str(), tempname.c_str()), fmt("%s/%s/%s.png", m_boxPicDir.c_str(), coverFolder.c_str(), tempname.c_str()), playcount, lastPlayed); + break; + } + } + } } else if (m_current_view != COVERFLOW_HOMEBREW) m_cf.addItem(&m_gameList[i], fmt("%s/%s.png", m_picDir.c_str(), id.c_str()), fmt("%s/%s.png", m_boxPicDir.c_str(), id.c_str()), playcount, lastPlayed); diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index ae070df8..b47ef5ca 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -141,6 +141,7 @@ private: STexture m_gameSettingsBg; STexture m_gameBgLQ; STexture m_mainBgLQ; + STexture m_pluginBg; STexture m_categoryBg; // u32 m_errorLblMessage; @@ -193,8 +194,8 @@ private: u32 m_configLblPartition; u32 m_configBtnPartitionP; u32 m_configBtnPartitionM; - u32 m_configLblNandEmu; - u32 m_configBtnNandEmu; + u32 m_configLblCfg4; + u32 m_configBtnCfg4; u32 m_configLblUser[4]; u32 m_configAdvLblTheme; u32 m_configAdvLblCurTheme; @@ -553,14 +554,26 @@ private: u32 m_categoryBtnCats[21]; u32 m_categoryLblUser[4]; u8 m_max_categories; - // NandEmulation menu +// Plugin menu + u32 m_pluginLblPage; + u32 m_pluginBtnPageM; + u32 m_pluginBtnPageP; + u32 m_pluginBtnBack; + u32 m_pluginLblTitle; + u32 m_pluginLblCat[21]; + u32 m_pluginBtn[21]; + u32 m_pluginBtnCat[21]; + u32 m_pluginBtnCats[21]; + u32 m_pluginLblUser[4]; + u8 m_plugins; +// NandEmulation menu std::string m_saveExtGameId; bool m_nandext; bool m_fulldump; bool m_sgdump; bool m_saveall; bool m_forceext; - //int m_saveExtMode; +//int m_saveExtMode; u32 m_nandemuLblTitle; u32 m_nandemuBtnBack; u32 m_nandemuLblEmulationVal; @@ -832,11 +845,13 @@ private: void _initGameSettingsMenu(SThemeData &theme); void _initCheatSettingsMenu(SThemeData &theme); void _initCheatButtons(); + void _initPluginSettingsMenu(SThemeData &theme); void _initCategorySettingsMenu(SThemeData &theme); void _initSystemMenu(SThemeData &theme); void _initGameInfoMenu(SThemeData &theme); void _initNandEmuMenu(CMenu::SThemeData &theme); // + void _textPluginSettings(void); void _textCategorySettings(void); void _textCheatSettings(void); void _textSystem(void); @@ -876,6 +891,7 @@ private: void _hideWBFS(bool instant = false); void _hideCFTheme(bool instant = false); void _hideGameSettings(bool instant = false); + void _hidePluginSettings(bool instant = false); void _hideCategorySettings(bool instant = false); void _hideSystem(bool instant = false); void _hideGameInfo(bool instant = false); @@ -897,6 +913,7 @@ private: void _showSettings(); void _showCode(void); void _showAbout(void); + void _showPluginSettings(void); void _showCategorySettings(void); void _showCheatSettings(void); void _showSystem(void); @@ -905,6 +922,7 @@ private: void _showCFTheme(u32 curParam, int version, bool wide); void _showGameSettings(void); void _showCheatDownload(void); + void _updatePluginCheckboxes(void); void _updateCheckboxes(void); void _setBg(const STexture &tex, const STexture &lqTex); void _updateBg(void); @@ -941,6 +959,7 @@ private: void _gameinfo(void); void _gameSettings(void); void _CheatSettings(); + void _PluginSettings(); void _CategorySettings(bool fromGameSet=false); // void _mainLoopCommon(bool withCF = false, bool blockReboot = false, bool adjusting = false); diff --git a/source/menu/menu_config.cpp b/source/menu/menu_config.cpp index a1c6e55d..655213fa 100644 --- a/source/menu/menu_config.cpp +++ b/source/menu/menu_config.cpp @@ -33,8 +33,8 @@ void CMenu::_hideConfig(bool instant) m_btnMgr.hide(m_configLblParental, instant); m_btnMgr.hide(m_configBtnUnlock, instant); m_btnMgr.hide(m_configBtnSetCode, instant); - m_btnMgr.hide(m_configLblNandEmu, instant); - m_btnMgr.hide(m_configBtnNandEmu, instant); + m_btnMgr.hide(m_configLblCfg4, instant); + m_btnMgr.hide(m_configBtnCfg4, instant); for (u32 i = 0; i < ARRAY_SIZE(m_configLblUser); ++i) if (m_configLblUser[i] != -1u) m_btnMgr.hide(m_configLblUser[i], instant); @@ -79,8 +79,8 @@ void CMenu::_showConfig(void) m_btnMgr.setText(m_configLblPartition, (string)partitionname); - m_btnMgr.show(m_configLblNandEmu); - m_btnMgr.show(m_configBtnNandEmu); + m_btnMgr.show(m_configLblCfg4); + m_btnMgr.show(m_configBtnCfg4); } m_btnMgr.show(m_configLblParental); m_btnMgr.show(m_locked ? m_configBtnUnlock : m_configBtnSetCode); @@ -172,6 +172,8 @@ int CMenu::_config1(void) gprintf("Current Partition: %d\n", currentPartition); _showConfig(); + _textConfig(); + while (true) { change = _configCommon(); @@ -224,12 +226,15 @@ int CMenu::_config1(void) _enableNandEmu(true); _showConfig(); } - else if (m_btnMgr.selected(m_configBtnNandEmu)) + else if (m_btnMgr.selected(m_configBtnCfg4)) { _cfNeedsUpdate(); m_cf.stopCoverLoader(true); _hideConfig(); - _NandEmuCfg(); + if(m_current_view != COVERFLOW_EMU) + _NandEmuCfg(); + else + _PluginSettings(); _showConfig(); m_cf.startCoverLoader(); } @@ -274,8 +279,9 @@ void CMenu::_initConfigMenu(CMenu::SThemeData &theme) m_configLblPartition = _addLabel(theme, "CONFIG/PARTITION_BTN", theme.btnFont, L"", 456, 250, 88, 56, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); m_configBtnPartitionM = _addPicButton(theme, "CONFIG/PARTITION_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 400, 250, 56, 56); m_configBtnPartitionP = _addPicButton(theme, "CONFIG/PARTITION_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 544, 250, 56, 56); - m_configLblNandEmu = _addLabel(theme, "CONFIG/NANDEMU", theme.lblFont, L"", 40, 310, 340, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); - m_configBtnNandEmu = _addButton(theme, "CONFIG/NANDEMU_BTN", theme.btnFont, L"", 400, 310, 200, 56, theme.btnFontColor);m_configLblPage = _addLabel(theme, "CONFIG/PAGE_BTN", theme.btnFont, L"", 76, 400, 80, 56, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); + m_configLblCfg4 = _addLabel(theme, "CONFIG/CFG4", theme.lblFont, L"", 40, 310, 340, 56, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_configBtnCfg4 = _addButton(theme, "CONFIG/CFG4_BTN", theme.btnFont, L"", 400, 310, 200, 56, theme.btnFontColor); + m_configLblPage = _addLabel(theme, "CONFIG/PAGE_BTN", theme.btnFont, L"", 76, 400, 80, 56, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); m_configBtnPageM = _addPicButton(theme, "CONFIG/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 20, 400, 56, 56); m_configBtnPageP = _addPicButton(theme, "CONFIG/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 156, 400, 56, 56); m_configBtnBack = _addButton(theme, "CONFIG/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 56, theme.btnFontColor); @@ -291,8 +297,8 @@ void CMenu::_initConfigMenu(CMenu::SThemeData &theme) _setHideAnim(m_configLblPartition, "CONFIG/PARTITION_BTN", 0, 0, 1.f, -1.f); _setHideAnim(m_configBtnPartitionM, "CONFIG/PARTITION_MINUS", 0, 0, 1.f, -1.f); _setHideAnim(m_configBtnPartitionP, "CONFIG/PARTITION_PLUS", 0, 0, 1.f, -1.f); - _setHideAnim(m_configLblNandEmu, "CONFIG/NANDEMU", 100, 0, -2.f, 0.f); - _setHideAnim(m_configBtnNandEmu, "CONFIG/NANDEMU_BTN", 0, 0, 1.f, -1.f); + _setHideAnim(m_configLblCfg4, "CONFIG/CFG4", 100, 0, -2.f, 0.f); + _setHideAnim(m_configBtnCfg4, "CONFIG/CFG4_BTN", 0, 0, 1.f, -1.f); _setHideAnim(m_configBtnBack, "CONFIG/BACK_BTN", 0, 0, -2.f, 0.f); _setHideAnim(m_configLblPage, "CONFIG/PAGE_BTN", 0, 0, 1.f, -1.f); _setHideAnim(m_configBtnPageM, "CONFIG/PAGE_MINUS", 0, 0, 1.f, -1.f); @@ -311,6 +317,14 @@ void CMenu::_textConfig(void) m_btnMgr.setText(m_configBtnSetCode, _t("cfg7", L"Set code")); m_btnMgr.setText(m_configLblPartitionName, _t("cfgp1", L"Game Partition")); m_btnMgr.setText(m_configBtnBack, _t("cfg10", L"Back")); - m_btnMgr.setText(m_configLblNandEmu, _t("cfg13", L"Nand emulation settings")); - m_btnMgr.setText(m_configBtnNandEmu, _t("cfg14", L"Set")); + if(m_current_view != COVERFLOW_EMU) + { + m_btnMgr.setText(m_configLblCfg4, _t("cfg13", L"Nand emulation settings")); + m_btnMgr.setText(m_configBtnCfg4, _t("cfg14", L"Set")); + } + else + { + m_btnMgr.setText(m_configLblCfg4, _t("cfg15", L"Plugins")); + m_btnMgr.setText(m_configBtnCfg4, _t("cfg16", L"Select")); + } } diff --git a/source/menu/menu_plugin.cpp b/source/menu/menu_plugin.cpp new file mode 100644 index 00000000..1880b087 --- /dev/null +++ b/source/menu/menu_plugin.cpp @@ -0,0 +1,227 @@ +#include "menu.hpp" + +#include +#include + +u8 m_Plugins[21]; +u32 Plugin_curPage; +u8 Plugin_lastBtn; + +void CMenu::_hidePluginSettings(bool instant) +{ + m_btnMgr.hide(m_pluginLblTitle, instant); + m_btnMgr.hide(m_pluginBtnBack, instant); + m_btnMgr.hide(m_pluginLblPage, instant); + m_btnMgr.hide(m_pluginBtnPageM, instant); + m_btnMgr.hide(m_pluginBtnPageP, instant); + for(u32 i = 0; i < ARRAY_SIZE(m_pluginLblUser); ++i) + { + if(m_pluginLblUser[i] != -1u) + m_btnMgr.hide(m_pluginLblUser[i], instant); + } + + for(int i = 0; i < 21; ++i) + { + m_btnMgr.hide(m_pluginLblCat[i]); + m_btnMgr.hide(m_pluginBtn[i]); + } +} + +void CMenu::_showPluginSettings(void) +{ + _setBg(m_pluginBg, m_pluginBg); + for(u32 i = 0; i < ARRAY_SIZE(m_pluginLblUser); ++i) + { + if(m_pluginLblUser[i] != -1u) + m_btnMgr.show(m_pluginLblUser[i]); + } + m_btnMgr.show(m_pluginLblTitle); + m_btnMgr.show(m_pluginBtnBack); + _updatePluginCheckboxes(); +} + +void CMenu::_updatePluginCheckboxes(void) +{ + if(m_plugins > 10) + { + m_btnMgr.setText(m_pluginLblPage, wfmt(L"%i / 2", Plugin_curPage)); + m_btnMgr.show(m_pluginLblPage); + m_btnMgr.show(m_pluginBtnPageM); + m_btnMgr.show(m_pluginBtnPageP); + } + for(int i = 0; i < 21; ++i) + { + m_btnMgr.hide(m_pluginBtn[i]); + m_btnMgr.hide(m_pluginLblCat[i]); + } + + safe_vector EnabledPlugins = m_plugin.GetEnabledPlugins(m_cfg); + if(Plugin_curPage == 1) + { + int j = 11; + if(m_plugins < 11) + j = m_plugins; + for(u8 i = 0; i < j; ++i) + { + m_btnMgr.show(m_pluginLblCat[i]); + if((EnabledPlugins.size() == 0) || (i != 0 && EnabledPlugins.size() >= i && EnabledPlugins[i - 1] == true)) + m_pluginBtn[i] = m_pluginBtnCats[i]; + else + m_pluginBtn[i] = m_pluginBtnCat[i]; + m_btnMgr.show(m_pluginBtn[i]); + } + } + else + { + for(int i = 11; i < m_plugins; ++i) + { + m_btnMgr.show(m_pluginLblCat[i]); + m_pluginBtn[i] = m_pluginBtnCat[i]; + m_btnMgr.show(m_pluginBtn[i]); + } + } +} + +void CMenu::_PluginSettings() +{ + SetupInput(); + Plugin_curPage = 1; + _textPluginSettings(); + _showPluginSettings(); + while(true) + { + _mainLoopCommon(); + if(!m_btnMgr.selected(Plugin_lastBtn)) + m_btnMgr.noHover(false); + if(BTN_HOME_PRESSED || BTN_B_PRESSED) + { + m_cfg.save(); + break; + } + else if(BTN_UP_PRESSED) + m_btnMgr.up(); + else if(BTN_DOWN_PRESSED) + m_btnMgr.down(); + if((BTN_MINUS_PRESSED || BTN_LEFT_PRESSED) || (BTN_A_PRESSED && m_btnMgr.selected(m_pluginBtnPageM))) + { + Plugin_lastBtn = m_pluginBtnPageM; + m_btnMgr.noHover(true); + Plugin_curPage = Plugin_curPage == 1 ? 2 : 1; + if(BTN_LEFT_PRESSED || BTN_MINUS_PRESSED) + m_btnMgr.click(m_pluginBtnPageM); + _updatePluginCheckboxes(); + } + else if(((BTN_PLUS_PRESSED || BTN_RIGHT_PRESSED)) || (BTN_A_PRESSED && m_btnMgr.selected(m_pluginBtnPageP))) + { + Plugin_lastBtn = m_pluginBtnPageP; + m_btnMgr.noHover(true); + Plugin_curPage = Plugin_curPage == 1 ? 2 : 1; + if(BTN_RIGHT_PRESSED || BTN_PLUS_PRESSED) + m_btnMgr.click(m_pluginBtnPageP); + _updatePluginCheckboxes(); + } + if(BTN_A_PRESSED) + { + if(m_btnMgr.selected(m_pluginBtnBack)) + { + m_cfg.save(); + break; + } + for(int i = 0; i < 21; ++i) + { + if(m_btnMgr.selected(m_pluginBtn[i])) + { + Plugin_lastBtn = m_pluginBtn[i]; + m_btnMgr.noHover(true); + if(i == 0) + { + int j = 0; + bool EnableAll = (m_plugin.GetEnabledPlugins(m_cfg).size()); + while(true) + { + if(m_plugin.PluginExist(j)) + m_plugin.SetEnablePlugin(m_cfg, j, EnableAll ? 2 : 1); + else + break; + j++; + } + } + else + m_plugin.SetEnablePlugin(m_cfg, i - 1); + _updatePluginCheckboxes(); + break; + } + } + } + } + _hidePluginSettings(); +} + +void CMenu::_initPluginSettingsMenu(CMenu::SThemeData &theme) +{ + _addUserLabels(theme, m_pluginLblUser, ARRAY_SIZE(m_pluginLblUser), "PLUGIN"); + m_pluginBg = _texture(theme.texSet, "PLUGIN/BG", "texture", theme.bg); + m_pluginLblTitle = _addTitle(theme, "PLUGIN/TITLE", theme.titleFont, L"", 20, 30, 600, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE); + m_pluginBtnBack = _addButton(theme, "PLUGIN/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 56, theme.btnFontColor); + m_pluginLblPage = _addLabel(theme, "PLUGIN/PAGE_BTN", theme.btnFont, L"", 256, 400, 100, 56, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); + m_pluginBtnPageM = _addPicButton(theme, "PLUGIN/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 200, 400, 56, 56); + m_pluginBtnPageP = _addPicButton(theme, "PLUGIN/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 356, 400, 56, 56); + m_pluginLblCat[0] = _addLabel(theme, "PLUGIN/PLUGIN_0", theme.lblFont, L"", 85, 390, 100, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_pluginBtnCat[0] = _addPicButton(theme, "PLUGIN/PLUGIN_0_BTN", theme.checkboxoff, theme.checkboxoffs, 30, 390, 44, 48); + m_pluginBtnCats[0] = _addPicButton(theme, "PLUGIN/PLUGIN_0_BTNS", theme.checkboxon, theme.checkboxons, 30, 390, 44, 48); + for(int i = 1; i < 6; ++i) + { // Page 1 + m_pluginLblCat[i] = _addLabel(theme, fmt("PLUGIN/PLUGIN_%i", i), theme.lblFont, L"", 85, (42+i*58), 230, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_pluginBtnCat[i] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTN", i), theme.checkboxoff, theme.checkboxoffs, 30, (42+i*58), 44, 48); + m_pluginBtnCats[i] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTNS", i), theme.checkboxon, theme.checkboxons, 30, (42+i*58), 44, 48); + // right half + m_pluginLblCat[i+5] = _addLabel(theme, fmt("PLUGIN/PLUGIN_%i", i+5), theme.txtFont, L"", 380, (42+i*58), 230, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_pluginBtnCat[i+5] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTN", i+5), theme.checkboxoff, theme.checkboxoffs, 325, (42+i*58), 44, 48); + m_pluginBtnCats[i+5] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTNS", i+5), theme.checkboxon, theme.checkboxons, 325, (42+i*58), 44, 48); + // Page 2 + m_pluginLblCat[i+10] = _addLabel(theme, fmt("PLUGIN/PLUGIN_%i", i+10), theme.lblFont, L"", 85, (42+i*58), 230, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_pluginBtnCat[i+10] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTN", i+10), theme.checkboxoff, theme.checkboxoffs, 30, (42+i*58), 44, 48); + m_pluginBtnCats[i+10] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTNS", i+10), theme.checkboxon, theme.checkboxons, 30, (42+i*58), 44, 48); + // right half + m_pluginLblCat[i+15] = _addLabel(theme, fmt("PLUGIN/PLUGIN_%i", i+15), theme.txtFont, L"", 380, (42+i*58), 230, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + m_pluginBtnCat[i+15] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTN", i+15), theme.checkboxoff, theme.checkboxoffs, 325, (42+i*58), 44, 48); + m_pluginBtnCats[i+15] = _addPicButton(theme, fmt("PLUGIN/PLUGIN_%i_BTNS", i+15), theme.checkboxon, theme.checkboxons, 325, (42+i*58), 44, 48); + } + _setHideAnim(m_pluginLblTitle, "PLUGIN/TITLE", 0, -200, 0.f, 1.f); + _setHideAnim(m_pluginLblPage, "PLUGIN/PAGE_BTN", 0, 200, 1.f, 0.f); + _setHideAnim(m_pluginBtnPageM, "PLUGIN/PAGE_MINUS", 0, 200, 1.f, 0.f); + _setHideAnim(m_pluginBtnPageP, "PLUGIN/PAGE_PLUS", 0, 200, 1.f, 0.f); + _setHideAnim(m_pluginBtnBack, "PLUGIN/BACK_BTN", 0, 200, 1.f, 0.f); + for(int i = 0; i < 21; ++i) + { + _setHideAnim(m_pluginBtnCat[i], fmt("PLUGIN/PLUGIN_%i_BTN", i), 0, 0, 1.f, 0.f); + _setHideAnim(m_pluginBtnCats[i], fmt("PLUGIN/PLUGIN_%i_BTNS", i), 0, 0, 1.f, 0.f); + _setHideAnim(m_pluginLblCat[i], fmt("PLUGIN/PLUGIN_%i", i), 0, 0, 1.f, 0.f); + m_pluginBtn[i] = m_pluginBtnCat[i]; + } + _hidePluginSettings(true); + _textPluginSettings(); +} + +void CMenu::_textPluginSettings(void) +{ + m_btnMgr.setText(m_pluginLblTitle, _t("", L"Select Plugins")); + m_btnMgr.setText(m_pluginBtnBack, _t("plugin_cd1", L"Back")); + u8 i = 0; + while(true) + { + if(i == 0) + m_btnMgr.setText(m_pluginLblCat[i], _t("plugin_dl3", L"All")); + else + { + if(m_plugin.PluginExist(i - 1)) + m_btnMgr.setText(m_pluginLblCat[i], m_plugin.GetPluginName(i - 1)); + else + { + m_plugins = i; + break; + } + } + i++; + } +} diff --git a/source/plugin/plugin.cpp b/source/plugin/plugin.cpp index a4e396bf..72c21974 100644 --- a/source/plugin/plugin.cpp +++ b/source/plugin/plugin.cpp @@ -121,6 +121,63 @@ char* Plugin::GetCoverFolderName(u32 magic) return emptyChar; } +bool Plugin::PluginExist(u8 pos) +{ + if(pos < Plugins.size()) + return true; + return false; +} + +wstringEx Plugin::GetPluginName(u8 pos) +{ + wstringEx tmpString; + string PluginName(Plugins[pos].DolName); + PluginName.erase(PluginName.end() - 4, PluginName.end()); + tmpString.fromUTF8(PluginName.c_str()); + return tmpString; +} + +void Plugin::SetEnablePlugin(Config &cfg, u8 pos, u8 ForceMode) +{ + if(pos < Plugins.size()) + { + char PluginMagicWord[8]; + snprintf(PluginMagicWord, sizeof(PluginMagicWord), "%08x", Plugins[pos].magicWord); + if(ForceMode == 1) + cfg.setBool("PLUGIN", PluginMagicWord, false); + else if(ForceMode == 2) + cfg.setBool("PLUGIN", PluginMagicWord, true); + else + cfg.setBool("PLUGIN", PluginMagicWord, cfg.getBool("PLUGIN", PluginMagicWord) ? false : true); + } +} + +safe_vector Plugin::GetEnabledPlugins(Config &cfg) +{ + safe_vector enabledPlugins; + char PluginMagicWord[8]; + u8 enabledPluginsNumber = 0; + for(u8 i = 0; i < Plugins.size(); i++) + { + snprintf(PluginMagicWord, sizeof(PluginMagicWord), "%08x", Plugins[i].magicWord); + if(cfg.getBool("PLUGIN", PluginMagicWord, true)) + { + enabledPluginsNumber++; + enabledPlugins.push_back(true); + } + else + enabledPlugins.push_back(false); + } + if(enabledPluginsNumber == Plugins.size()) + enabledPlugins.clear(); + return enabledPlugins; +} + +u32 Plugin::getPluginMagic(u8 pos) +{ + return Plugins[pos].magicWord; +} + safe_vector Plugin::ParseScummvmINI(Config &ini, string Device) { gprintf("Parsing scummvm.ini\n"); diff --git a/source/plugin/plugin.hpp b/source/plugin/plugin.hpp index 9de01ec8..500a2865 100644 --- a/source/plugin/plugin.hpp +++ b/source/plugin/plugin.hpp @@ -36,6 +36,11 @@ public: u32 GetBannerSoundSize(); char* GetDolName(u32 magic); char* GetCoverFolderName(u32 magic); + wstringEx GetPluginName(u8 pos); + u32 getPluginMagic(u8 pos); + bool PluginExist(u8 pos); + void SetEnablePlugin(Config &cfg, u8 pos, u8 ForceMode = 0); + safe_vector GetEnabledPlugins(Config &cfg); bool UseReturnLoader(u32 magic); void init(string); void Cleanup();