diff --git a/out/bins/ext_booter.bin b/out/bins/ext_booter.bin index fd407d5d..05b83809 100644 Binary files a/out/bins/ext_booter.bin and b/out/bins/ext_booter.bin differ diff --git a/out/boot.dol b/out/boot.dol index aed9acdf..546fc29a 100644 Binary files a/out/boot.dol and b/out/boot.dol differ diff --git a/source/defines.h b/source/defines.h index 39763a80..327d437a 100644 --- a/source/defines.h +++ b/source/defines.h @@ -1,6 +1,6 @@ #define APP_NAME "WiiFlow WFL" -#define APP_VERSION "5.4.7" +#define APP_VERSION "5.4.7 beta 1" #define APP_DATA_DIR "wiiflow" #define APPS_DIR "apps/wiiflow" diff --git a/source/menu/menu.cpp b/source/menu/menu.cpp index 5ae7ac69..95c74044 100644 --- a/source/menu/menu.cpp +++ b/source/menu/menu.cpp @@ -106,7 +106,7 @@ bool CMenu::init(bool usb_mounted) { SoundHandle.Init(); m_gameSound.SetVoice(1); - /* Clear Playlog */ + /* Clear Playlog to prevent wiiflow from being added to it */ Playlog_Delete(); /* Find the first partition with apps/wiiflow folder */ @@ -1256,6 +1256,7 @@ void CMenu::_buildMenus(void) _initExplorer(); _initBoot(); _initPathsMenu(); + _initCheckboxesMenu(); _loadCFCfg(); } @@ -1964,6 +1965,7 @@ void CMenu::_updateText(void) _textCoverBanner(); _textExplorer(); _textWad(); + _textCheckboxesMenu(); } const wstringEx CMenu::_fmt(const char *key, const wchar_t *def) @@ -2002,12 +2004,9 @@ void CMenu::_initCF(void) if(m_sourceflow) { - CoverFlow.addItem(&(*hdr), 0, 0); + if(m_source.getBool(sfmt("button_%i", hdr->settings[0]), "hidden", false) == false) + CoverFlow.addItem(&(*hdr), 0, 0); continue; - /*strcpy(tmp1, "source/"); - wcstombs(tmp2, hdr->title, 64); - strcat(tmp1, tmp2); - id = tmp1;*/ } else if(hdr->type == TYPE_HOMEBREW) { diff --git a/source/menu/menu.hpp b/source/menu/menu.hpp index adb03673..f6870a82 100644 --- a/source/menu/menu.hpp +++ b/source/menu/menu.hpp @@ -192,6 +192,7 @@ private: TexData m_config4Bg; TexData m_configAdvBg; TexData m_configSndBg; + TexData m_config7Bg; TexData m_cheatBg; TexData m_downloadBg; TexData m_gameinfoBg; @@ -330,6 +331,20 @@ private: s16 m_configScreenBtnTVYM; s16 m_configScreenBtnTVYP; s16 m_configScreenLblUser[4]; + + s16 m_config7Lbl1; + s16 m_config7Lbl2; + s16 m_config7Lbl3; + s16 m_config7Lbl4; + s16 m_config7Btn1; + s16 m_config7Btn2; + s16 m_config7Btn3; + s16 m_config7Btn4; + s16 m_config7Lbl4Val; + s16 m_config7Btn4M; + s16 m_config7Btn4P; + s16 m_config7LblUser[4]; + //Download menu s16 m_downloadPrioVal; enum CoverPrio @@ -950,6 +965,7 @@ private: void _initExplorer(); void _initWad(); void _initPathsMenu(); + void _initCheckboxesMenu(); // void _textSource(void); void _textCfgSrc(void); @@ -982,6 +998,7 @@ private: void _textExplorer(void); void _textWad(void); void _textPaths(void); + void _textCheckboxesMenu(void); // void _hideCheatSettings(bool instant = false); void _hideError(bool instant = false); @@ -1020,6 +1037,8 @@ private: void _hideExplorer(bool instant = false); void _hideWad(bool instant = false); void _hidePaths(bool instant = false); + void _hideCheckboxesMenu(bool instant = false); + void _hideSM_Editor(bool instant = false); // void _showError(void); void _showMain(void); @@ -1056,6 +1075,8 @@ private: void _showExplorer(void); void _showWad(void); void _showPaths(void); + void _showCheckboxesMenu(void); + void _showSM_Editor(void); void _showCF(bool refreshList = false); void _refreshExplorer(s8 direction = 0); @@ -1063,7 +1084,9 @@ private: void _updateSourceBtns(void); void _updatePluginText(void); void _updatePluginCheckboxes(void); + void _updateCheckboxesText(void); void _updateCheckboxes(void); + void _updateCatCheckboxes(void); void _getGameCategories(void); void _setGameCategories(void); void _setCatGenDomain(void); @@ -1119,6 +1142,8 @@ private: void _CfgSrc(); void _CfgHB(); void _PluginSettings(); + void _checkboxesMenu(u8 md); + void _SM_Editor(); void _CategorySettings(bool fromGameSet = false); bool _Home(); bool _ExitTo(); diff --git a/source/menu/menu_categories.cpp b/source/menu/menu_categories.cpp index fa386ef0..94301709 100644 --- a/source/menu/menu_categories.cpp +++ b/source/menu/menu_categories.cpp @@ -57,7 +57,7 @@ void CMenu::_showCategorySettings(void) m_btnMgr.show(m_categoryLblTitle); m_btnMgr.show(m_categoryBtnClear); m_btnMgr.show(m_categoryBtnBack); - _updateCheckboxes(); + _updateCatCheckboxes(); } void CMenu::_setCatGenDomain() @@ -98,7 +98,7 @@ void CMenu::_setCatGenDomain() } } -void CMenu::_updateCheckboxes(void) +void CMenu::_updateCatCheckboxes(void) { for(u8 i = 1; i < 11; ++i) { @@ -343,7 +343,7 @@ void CMenu::_CategorySettings(bool fromGameSet) curPage = ((m_max_categories - 2) / 10) + 1; if(BTN_LEFT_PRESSED || BTN_MINUS_PRESSED) m_btnMgr.click(m_categoryBtnPageM); - _updateCheckboxes(); + _updateCatCheckboxes(); } else if((BTN_RIGHT_PRESSED && m_max_categories>11) || (BTN_A_PRESSED && m_btnMgr.selected(m_categoryBtnPageP))) { @@ -354,7 +354,7 @@ void CMenu::_CategorySettings(bool fromGameSet) curPage = 1; if(BTN_RIGHT_PRESSED || BTN_PLUS_PRESSED) m_btnMgr.click(m_categoryBtnPageP); - _updateCheckboxes(); + _updateCatCheckboxes(); } if(BTN_A_PRESSED) { @@ -373,7 +373,7 @@ void CMenu::_CategorySettings(bool fromGameSet) } if(!hiddenCat) m_categories.at(0) = '1'; - _updateCheckboxes(); + _updateCatCheckboxes(); } for(u8 i = 1; i < 11; ++i) { diff --git a/source/menu/menu_config7.cpp b/source/menu/menu_config7.cpp index 37ffc25a..6fba24ed 100644 --- a/source/menu/menu_config7.cpp +++ b/source/menu/menu_config7.cpp @@ -3,24 +3,6 @@ using namespace std; -s16 m_config7Lbl1; -s16 m_config7Lbl2; -s16 m_config7Lbl3; -s16 m_config7Lbl4; - -s16 m_config7Btn1; -s16 m_config7Btn2; -s16 m_config7Btn3; -s16 m_config7Btn4; - -s16 m_config7Lbl4Val; -s16 m_config7Btn4M; -s16 m_config7Btn4P; - -s16 m_config7LblUser[4]; - -TexData m_config7Bg; - void CMenu::_hideConfig7(bool instant) { _hideConfigCommon(instant); @@ -118,8 +100,8 @@ void CMenu::_showConfig7(int curPage) } else if(curPage == 10) { - m_btnMgr.setText(m_config7Lbl1, _t("cfg713", L"Use HQ covers")); - m_btnMgr.setText(m_config7Btn1, m_cfg.getBool("GENERAL", "cover_use_hq") ? _t("yes", L"Yes") : _t("no", L"No")); + m_btnMgr.setText(m_config7Lbl1, _t("cfg728", L"Upsample music to 48khz")); + m_btnMgr.setText(m_config7Btn1, m_cfg.getBool("general", "resample_to_48khz", true) ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.setText(m_config7Lbl2, _t("cfg714", L"Display music title")); m_btnMgr.setText(m_config7Btn2, m_cfg.getBool("GENERAL", "display_music_info") ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.setText(m_config7Lbl3, _t("cfg715", L"Randomize music")); @@ -131,8 +113,8 @@ void CMenu::_showConfig7(int curPage) { m_btnMgr.setText(m_config7Lbl1, _t("cfg717", L"Random game boot or select")); m_btnMgr.setText(m_config7Btn1, m_cfg.getBool("GENERAL", "random_select") ? _t("select", L"Select") : _t("boot", L"Boot")); - m_btnMgr.setText(m_config7Lbl2, _t("cfg718", L"Source Menu on start")); - m_btnMgr.setText(m_config7Btn2, m_cfg.getBool("GENERAL", "source_on_start") ? _t("yes", L"Yes") : _t("no", L"No")); + m_btnMgr.setText(m_config7Lbl2, _t("cfg725", L"Shutdown to idle standby")); + m_btnMgr.setText(m_config7Btn2, m_cfg.getBool("general", "idle_standby", false) ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.setText(m_config7Lbl3, _t("cfg720", L"Play GC banner sound")); m_btnMgr.setText(m_config7Btn3, m_cfg.getBool(GC_DOMAIN, "play_banner_sound") ? _t("yes", L"Yes") : _t("no", L"No")); m_btnMgr.setText(m_config7Lbl4, _t("cfg721", L"Play GC default sound")); @@ -142,12 +124,12 @@ void CMenu::_showConfig7(int curPage) { m_btnMgr.setText(m_config7Lbl1, _t("cfg722", L"Homebrew settings")); m_btnMgr.setText(m_config7Btn1, _t("cfg14", L"Set")); - m_btnMgr.setText(m_config7Lbl2, _t("cfg723", L"Source menu settings")); + m_btnMgr.setText(m_config7Lbl2, _t("cfg723", L"Sourceflow settings")); m_btnMgr.setText(m_config7Btn2, _t("cfg14", L"Set")); - m_btnMgr.setText(m_config7Lbl3, _t("cfg724", L"Lock coverflow layouts")); - m_btnMgr.setText(m_config7Btn3, m_cfg.getBool("general", "cf_locked") ? _t("yes", L"Yes") : _t("no", L"No")); - m_btnMgr.setText(m_config7Lbl4, _t("cfg725", L"Shutdown to idle standby")); - m_btnMgr.setText(m_config7Btn4, m_cfg.getBool("general", "idle_standby", false) ? _t("yes", L"Yes") : _t("no", L"No")); + m_btnMgr.setText(m_config7Lbl3, _t("cfg718", L"Source Menu on start")); + m_btnMgr.setText(m_config7Btn3, m_cfg.getBool("GENERAL", "source_on_start") ? _t("yes", L"Yes") : _t("no", L"No")); + m_btnMgr.setText(m_config7Lbl4, _t("cfg727", L"Use Plugin Database Titles")); + m_btnMgr.setText(m_config7Btn4, m_cfg.getBool(PLUGIN_DOMAIN, "database_titles", true) ? _t("yes", L"Yes") : _t("no", L"No")); } else // page 13 { @@ -155,10 +137,10 @@ void CMenu::_showConfig7(int curPage) m_btnMgr.setText(m_config7Btn1, m_cfg.getBool(WII_DOMAIN, "fix480p", false) ? _t("on", L"On") : _t("off", L"Off")); m_btnMgr.setText(m_config7Lbl2, _t("cfg726", L"Covers Box Mode")); m_btnMgr.setText(m_config7Btn2, m_cfg.getBool("general", "box_mode", false) ? _t("on", L"On") : _t("off", L"Off")); - m_btnMgr.setText(m_config7Lbl3, _t("cfg727", L"Use Plugin Database Titles")); - m_btnMgr.setText(m_config7Btn3, m_cfg.getBool(PLUGIN_DOMAIN, "database_titles", true) ? _t("yes", L"Yes") : _t("no", L"No")); - m_btnMgr.setText(m_config7Lbl4, _t("cfg728", L"Upsample music to 48khz")); - m_btnMgr.setText(m_config7Btn4, m_cfg.getBool("general", "resample_to_48khz", true) ? _t("yes", L"Yes") : _t("no", L"No")); + m_btnMgr.setText(m_config7Lbl3, _t("cfg713", L"Use HQ covers")); + m_btnMgr.setText(m_config7Btn3, m_cfg.getBool("GENERAL", "cover_use_hq") ? _t("yes", L"Yes") : _t("no", L"No")); + m_btnMgr.setText(m_config7Lbl4, _t("cfg724", L"Lock coverflow layouts")); + m_btnMgr.setText(m_config7Btn4, m_cfg.getBool("general", "cf_locked") ? _t("yes", L"Yes") : _t("no", L"No")); } } @@ -260,8 +242,12 @@ int CMenu::_config7(int curPage) { if(m_btnMgr.selected(m_config7Btn1)) { - m_cfg.setBool("GENERAL", "cover_use_hq", !m_cfg.getBool("GENERAL", "cover_use_hq")); - m_btnMgr.setText(m_config7Btn1, m_cfg.getBool("GENERAL", "cover_use_hq") ? _t("yes", L"Yes") : _t("no", L"No")); + bool val = !m_cfg.getBool("general", "resample_to_48khz"); + m_cfg.setBool("general", "resample_to_48khz", val); + m_btnMgr.setText(m_config7Btn1, val ? _t("yes", L"Yes") : _t("no", L"No")); + MusicPlayer.SetResampleSetting(val); + MusicPlayer.Stop(); + MusicPlayer.LoadCurrentFile(); } else if(m_btnMgr.selected(m_config7Btn2)) { @@ -293,8 +279,9 @@ int CMenu::_config7(int curPage) } else if(m_btnMgr.selected(m_config7Btn2)) { - m_cfg.setBool("GENERAL", "source_on_start", !m_cfg.getBool("GENERAL", "source_on_start")); - m_btnMgr.setText(m_config7Btn2, m_cfg.getBool("GENERAL", "source_on_start") ? _t("yes", L"Yes") : _t("no", L"No")); + bool val = !m_cfg.getBool("general", "idle_standby"); + m_cfg.setBool("general", "idle_standby", val); + m_btnMgr.setText(m_config7Btn2, val ? _t("yes", L"Yes") : _t("no", L"No")); } else if(m_btnMgr.selected(m_config7Btn3)) { @@ -325,16 +312,14 @@ int CMenu::_config7(int curPage) } else if(m_btnMgr.selected(m_config7Btn3)) { - bool val = !m_cfg.getBool("general", "cf_locked"); - m_cfg.setBool("general", "cf_locked", val); - m_btnMgr.setText(m_config7Btn3, val ? _t("yes", L"Yes") : _t("no", L"No")); - CFLocked = val; + m_cfg.setBool("GENERAL", "source_on_start", !m_cfg.getBool("GENERAL", "source_on_start")); + m_btnMgr.setText(m_config7Btn3, m_cfg.getBool("GENERAL", "source_on_start") ? _t("yes", L"Yes") : _t("no", L"No")); } else if(m_btnMgr.selected(m_config7Btn4)) { - bool val = !m_cfg.getBool("general", "idle_standby"); - m_cfg.setBool("general", "idle_standby", val); - m_btnMgr.setText(m_config7Btn4, val ? _t("yes", L"Yes") : _t("no", L"No")); + bool val = !m_cfg.getBool(PLUGIN_DOMAIN, "database_titles"); + m_cfg.setBool(PLUGIN_DOMAIN, "database_titles", val); + m_btnMgr.setText(m_config7Btn4, val ? _t("yes", L"Yes") : _t("no", L"No")); } } if(curPage == 13) @@ -345,26 +330,23 @@ int CMenu::_config7(int curPage) m_cfg.setBool(WII_DOMAIN, "fix480p", val); m_btnMgr.setText(m_config7Btn1, val ? _t("on", L"On") : _t("off", L"Off")); } - if(m_btnMgr.selected(m_config7Btn2)) + else if(m_btnMgr.selected(m_config7Btn2)) { bool val = !m_cfg.getBool("general", "box_mode"); m_cfg.setBool("general", "box_mode", val); m_btnMgr.setText(m_config7Btn2, val ? _t("on", L"On") : _t("off", L"Off")); } - if(m_btnMgr.selected(m_config7Btn3)) + else if(m_btnMgr.selected(m_config7Btn3)) { - bool val = !m_cfg.getBool(PLUGIN_DOMAIN, "database_titles"); - m_cfg.setBool(PLUGIN_DOMAIN, "database_titles", val); - m_btnMgr.setText(m_config7Btn3, val ? _t("yes", L"Yes") : _t("no", L"No")); + m_cfg.setBool("GENERAL", "cover_use_hq", !m_cfg.getBool("GENERAL", "cover_use_hq")); + m_btnMgr.setText(m_config7Btn3, m_cfg.getBool("GENERAL", "cover_use_hq") ? _t("yes", L"Yes") : _t("no", L"No")); } - if(m_btnMgr.selected(m_config7Btn4)) + else if(m_btnMgr.selected(m_config7Btn4)) { - bool val = !m_cfg.getBool("general", "resample_to_48khz"); - m_cfg.setBool("general", "resample_to_48khz", val); - m_btnMgr.setText(m_config7Btn4, val ? _t("yes", L"Yes") : _t("no", L"No")); - MusicPlayer.SetResampleSetting(val); - MusicPlayer.Stop(); - MusicPlayer.LoadCurrentFile(); + bool val = !m_cfg.getBool("general", "cf_locked"); + m_cfg.setBool("general", "cf_locked", val); + m_btnMgr.setText(m_config7Btn4, val ? _t("yes", L"Yes") : _t("no", L"No")); + CFLocked = val; } } } diff --git a/source/menu/menu_config_source.cpp b/source/menu/menu_config_source.cpp index 97572d83..4f0b0f14 100644 --- a/source/menu/menu_config_source.cpp +++ b/source/menu/menu_config_source.cpp @@ -180,7 +180,7 @@ void CMenu::_initCfgSrc(void) void CMenu::_textCfgSrc(void) { - m_btnMgr.setText(m_cfgsrcLblTitle, _t("cfgsm1", L"Source Menu Settings")); + m_btnMgr.setText(m_cfgsrcLblTitle, _t("cfgsm1", L"Sourceflow Settings")); m_btnMgr.setText(m_cfgsrcLblEnableSF, _t("cfgsm3", L"Enable Sourceflow")); m_btnMgr.setText(m_cfgsrcLblSmallbox, _t("cfgsm4", L"Sourceflow Smallbox")); m_btnMgr.setText(m_cfgsrcLblBoxMode, _t("cfghb4", L"Box Mode")); diff --git a/source/menu/menu_main.cpp b/source/menu/menu_main.cpp index 28b8b3a8..7ffa8c54 100644 --- a/source/menu/menu_main.cpp +++ b/source/menu/menu_main.cpp @@ -462,14 +462,23 @@ int CMenu::main(void) { if(m_sourceflow)//back to base tier or exit sourceflow { - if(!_srcTierBack(true))// if already on base tier exit sourceflow + /*if(!_srcTierBack(true))// if already on base tier exit sourceflow { _restoreSrcTiers(); m_sourceflow = false; } _getCustomBgTex(); _setMainBg(); - _showCF(true);//refresh coverflow or sourceflow list + _showCF(true);//refresh coverflow or sourceflow list*/ + _hideMain(); + _SM_Editor(); + if(BTN_B_HELD) + { + bheld = true; + bUsed = true; + } + _setMainBg(); + _showCF(true); } else { diff --git a/source/menu/menu_sm_editor.cpp b/source/menu/menu_sm_editor.cpp new file mode 100644 index 00000000..3544ab94 --- /dev/null +++ b/source/menu/menu_sm_editor.cpp @@ -0,0 +1,499 @@ +#include "menu.hpp" +#include "gui/text.hpp" + +#include +#include +#include + +u8 CB_curPage; +u8 CB_numPages; +u8 max_checkbox; +u8 mode; +u8 curSource; + +// Checkboxes menu +TexData m_checkboxesBg; +s16 m_checkboxesLblUser[4]; +s16 m_checkboxesLblPage; +s16 m_checkboxesBtnPageM; +s16 m_checkboxesBtnPageP; +s16 m_checkboxesBtnBack; +s16 m_checkboxesLblTitle; + +s16 m_checkboxLblTxt[11]; +s16 m_checkboxBtn[11]; +s16 m_checkboxBtnOff[11]; +s16 m_checkboxBtnOn[11]; + +void CMenu::_hideCheckboxesMenu(bool instant) +{ + m_btnMgr.hide(m_checkboxesLblTitle, instant); + m_btnMgr.hide(m_checkboxesBtnBack, instant); + m_btnMgr.hide(m_checkboxesLblPage, instant); + m_btnMgr.hide(m_checkboxesBtnPageM, instant); + m_btnMgr.hide(m_checkboxesBtnPageP, instant); + for(u8 i = 0; i < ARRAY_SIZE(m_checkboxesLblUser); ++i) + if(m_checkboxesLblUser[i] != -1) + m_btnMgr.hide(m_checkboxesLblUser[i], instant); + + for(u8 i = 0; i < 11; ++i) + { + m_btnMgr.hide(m_checkboxLblTxt[i]); + m_btnMgr.hide(m_checkboxBtn[i]); + } +} + +void CMenu::_showCheckboxesMenu(void) +{ + _setBg(m_checkboxesBg, m_checkboxesBg); + for(u8 i = 0; i < ARRAY_SIZE(m_checkboxesLblUser); ++i) + if(m_checkboxesLblUser[i] != -1) + m_btnMgr.show(m_checkboxesLblUser[i]); + + if(mode == 1) + m_btnMgr.setText(m_checkboxesLblTitle, _t("smedit1", L"Hide Sources")); + else if(mode == 2) + m_btnMgr.setText(m_checkboxesLblTitle, _t("smedit2", L"Choose Source")); + else if(mode == 3) + m_btnMgr.setText(m_checkboxesLblTitle, _t("smedit3", L"Choose Plugin")); + else + m_btnMgr.setText(m_checkboxesLblTitle, _t("smedit4", L"Choose Plugins")); + + m_btnMgr.show(m_checkboxesLblTitle); + m_btnMgr.show(m_checkboxesBtnBack); + _updateCheckboxes(); +} + +void CMenu::_updateCheckboxesText(void) +{ + u32 firstCheckbox= (CB_curPage - 1) * 10; + for(u8 i = 1; i < min(firstCheckbox + 10, (u32)max_checkbox) - firstCheckbox + 1; i++) + { + if(mode == 1 || mode == 2) + { + string button = sfmt("button_%i", firstCheckbox + i - 1); + m_btnMgr.setText(m_checkboxLblTxt[i], m_source.getWString(button, "title", button)); + } + else if(mode == 3 || mode == 4) + { + m_btnMgr.setText(m_checkboxLblTxt[i], m_plugin.GetPluginName(firstCheckbox + i - 1)); + } + } +} + +void CMenu::_updateCheckboxes(void) +{ + if(max_checkbox > 10) + { + m_btnMgr.setText(m_checkboxesLblPage, wfmt(L"%i / %i", CB_curPage, CB_numPages)); + m_btnMgr.show(m_checkboxesLblPage); + m_btnMgr.show(m_checkboxesBtnPageM); + m_btnMgr.show(m_checkboxesBtnPageP); + } + for(int i = 0; i < 11; ++i) + { + m_btnMgr.hide(m_checkboxBtn[i]); + m_btnMgr.hide(m_checkboxLblTxt[i]); + } + + vector magicNums; + if(mode == 4) + { + magicNums = m_source.getStrings(sfmt("button_%i", curSource), "magic", ','); + } + u32 firstCheckbox = (CB_curPage - 1) * 10; + for(u8 i = 1; i < min(firstCheckbox + 10, (u32)max_checkbox) - firstCheckbox + 1; ++i) + { + if(mode == 1) + { + if(m_source.getBool(sfmt("button_%i", firstCheckbox + i - 1), "hidden", false)) + m_checkboxBtn[i] = m_checkboxBtnOn[i]; + else + m_checkboxBtn[i] = m_checkboxBtnOff[i]; + } + else if(mode == 2) + { + m_checkboxBtn[i] = m_checkboxBtnOff[i];// all sources off + } + else if(mode == 3) + { + m_checkboxBtn[i] = m_checkboxBtnOff[i];// all plugins off + } + else + { + bool found = false; + string pluginMagic = sfmt("%08x", m_plugin.GetPluginMagic(firstCheckbox + i - 1)); + + if(magicNums.size() > 0) + { + for(u8 j = 0; j < magicNums.size(); j++) + { + string tmp = lowerCase(magicNums[j]); + if(tmp == pluginMagic) + { + found = true; + break; + } + } + if(found) + m_checkboxBtn[i] = m_checkboxBtnOn[i]; + else + m_checkboxBtn[i] = m_checkboxBtnOff[i]; + } + } + m_btnMgr.show(m_checkboxBtn[i]); + m_btnMgr.show(m_checkboxLblTxt[i]); + } +} + +void CMenu::_checkboxesMenu(u8 md) +{ + mode = md; + if(mode == 1 || mode == 2) + max_checkbox = m_max_source_btn + 1; + else + { + max_checkbox = 0; + while(m_plugin.PluginExist(max_checkbox)) max_checkbox++; + } + + CB_curPage = 1; + CB_numPages = (max_checkbox / 10) + 1; + + SetupInput(); + _showCheckboxesMenu(); + _updateCheckboxesText(); + while(!m_exit) + { + _mainLoopCommon(); + if(BTN_HOME_PRESSED || BTN_B_PRESSED || (BTN_A_PRESSED && m_btnMgr.selected(m_checkboxesBtnBack))) + { + if(mode == 4) + { + m_btnMgr.setText(m_checkboxesLblTitle, _t("smedit2", L"Choose Source")); + mode = 2; + max_checkbox = m_max_source_btn; + CB_curPage = (curSource + 1) / 10 + 1; + CB_numPages = (max_checkbox / 10) + 1; + _updateCheckboxes(); + _updateCheckboxesText(); + } + else + 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_checkboxesBtnPageM))) + { + CB_curPage--; + if(CB_curPage == 0) + CB_curPage = CB_numPages; + if(BTN_LEFT_PRESSED || BTN_MINUS_PRESSED) + m_btnMgr.click(m_checkboxesBtnPageM); + _updateCheckboxes(); + _updateCheckboxesText(); + } + else if(((BTN_PLUS_PRESSED || BTN_RIGHT_PRESSED)) || (BTN_A_PRESSED && m_btnMgr.selected(m_checkboxesBtnPageP))) + { + CB_curPage++; + if(CB_curPage > CB_numPages) + CB_curPage = 1; + if(BTN_RIGHT_PRESSED || BTN_PLUS_PRESSED) + m_btnMgr.click(m_checkboxesBtnPageP); + _updateCheckboxes(); + _updateCheckboxesText(); + } + if(BTN_A_PRESSED) + { + u32 firstCheckbox = (CB_curPage - 1) * 10; + for(u8 i = 1; i <= min(firstCheckbox + 10, (u32)max_checkbox) - firstCheckbox + 1; ++i) + { + if(m_btnMgr.selected(m_checkboxBtn[i])) + { + if(mode == 1) + { + string button = sfmt("button_%i", firstCheckbox + i - 1); + bool val = !m_source.getBool(button, "hidden", false); + m_source.setBool(button, "hidden", val); + _updateCheckboxes(); + m_btnMgr.setSelected(m_checkboxBtn[i]); + break; + } + else if(mode == 2) + { + string source = m_source.getString(sfmt("button_%i", firstCheckbox + i - 1), "source", ""); + if(source != "plugin") + { + _hideCheckboxesMenu(); + error(_t("smediterr", L"Not allowed!")); + _showCheckboxesMenu(); + } + else + { + mode = 4; + curSource = firstCheckbox + i - 1; + max_checkbox = 0; + while(m_plugin.PluginExist(max_checkbox)) max_checkbox++; + CB_curPage = 1; + CB_numPages = (max_checkbox / 10) + 1; + _updateCheckboxes(); + _updateCheckboxesText(); + m_btnMgr.setText(m_checkboxesLblTitle, _t("smedit4", L"Choose Plugins")); + } + } + else if(mode == 4) + { + bool found = false; + string newMagics; + string pluginMagic = sfmt("%08x", m_plugin.GetPluginMagic(firstCheckbox + i - 1)); + string button = sfmt("button_%i", curSource); + vector magicNums = m_source.getStrings(button, "magic", ','); + if(magicNums.size() > 0) + { + for(u8 j = 0; j < magicNums.size(); j++) + { + string tmp = lowerCase(magicNums[j]); + if(tmp == pluginMagic) + { + found = true;// and don't add it + } + else + { + if(j == 0) + newMagics = magicNums[0]; + else + newMagics.append(',' + magicNums[j]); + } + } + } + if(!found)// add it if not found + { + if(newMagics.empty()) + newMagics = pluginMagic; + else + newMagics.append(',' + pluginMagic); + } + if(!newMagics.empty())// to make sure at least one plugin is selected + m_source.setString(button, "magic", newMagics); + _updateCheckboxes(); + } + else if(mode == 3) + { + _hideCheckboxesMenu(); + u8 pos = firstCheckbox + i - 1; + bool plugin_ok = true; + strncpy(m_plugin.PluginMagicWord, fmt("%08x", m_plugin.GetPluginMagic(pos)), 8); + if(strncasecmp(m_plugin.PluginMagicWord, "484252", 6) == 0)//HBRW + plugin_ok = false; + else if(strncasecmp(m_plugin.PluginMagicWord, "4E47434D", 8) == 0)//NGCM + plugin_ok = false; + else if(strncasecmp(m_plugin.PluginMagicWord, "4E574949", 8) == 0)//NWII + plugin_ok = false; + else if(strncasecmp(m_plugin.PluginMagicWord, "4E414E44", 8) == 0)//NAND + plugin_ok = false; + else if(strncasecmp(m_plugin.PluginMagicWord, "454E414E", 8) == 0)//ENAN + plugin_ok = false; + + if(!plugin_ok) + { + error(_t("smediterr", L"Not allowed!")); + } + else + { + int romsPartition = m_plugin.GetRomPartition(pos); + if(romsPartition < 0) + romsPartition = m_cfg.getInt(PLUGIN_DOMAIN, "partition", 0); + string romsDir(fmt("%s:/%s", DeviceName[romsPartition], m_plugin.GetRomDir(pos))); + const char *path = _FolderExplorer(romsDir.c_str()); + if(strlen(path) > 0) + { + Config m_plugin_cfg; + m_plugin_cfg.load(m_plugin.GetPluginPath(pos).c_str()); + if(m_plugin_cfg.loaded()) + { + if(strncmp(path, "sd:/", 4) == 0) + { + romsPartition = 0; + m_plugin_cfg.setInt(PLUGIN, "rompartition", 0); + m_plugin.SetRomPartition(pos, 0); + } + else + { + romsPartition = atoi(path + 3); + m_plugin_cfg.setInt(PLUGIN, "rompartition", romsPartition); + m_plugin.SetRomPartition(pos, romsPartition); + } + string rd = sfmt("%s", strchr(path, '/') + 1); + m_plugin_cfg.setString(PLUGIN, "romdir", rd); + m_plugin.SetRomDir(pos, rd); + m_plugin_cfg.save(true); + string cachedListFile(fmt("%s/%s_%s.db", m_listCacheDir.c_str(), DeviceName[romsPartition], m_plugin.PluginMagicWord)); + fsop_deleteFile(cachedListFile.c_str()); + } + } + } + _showCheckboxesMenu(); + } + } + } + } + } + m_source.save(); + _hideCheckboxesMenu(); +} + +void CMenu::_initCheckboxesMenu() +{ + _addUserLabels(m_checkboxesLblUser, ARRAY_SIZE(m_checkboxesLblUser), "CHECKBOX"); + m_checkboxesBg = _texture("CHECKBOX/BG", "texture", theme.bg, false); + m_checkboxesLblTitle = _addLabel("CHECKBOX/TITLE", theme.titleFont, L"", 0, 10, 640, 60, theme.titleFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE); + m_checkboxesBtnBack = _addButton("CHECKBOX/BACK_BTN", theme.btnFont, L"", 420, 400, 200, 48, theme.btnFontColor); + m_checkboxesLblPage = _addLabel("CHECKBOX/PAGE_BTN", theme.btnFont, L"", 68, 400, 104, 48, theme.btnFontColor, FTGX_JUSTIFY_CENTER | FTGX_ALIGN_MIDDLE, theme.btnTexC); + m_checkboxesBtnPageM = _addPicButton("CHECKBOX/PAGE_MINUS", theme.btnTexMinus, theme.btnTexMinusS, 20, 400, 48, 48); + m_checkboxesBtnPageP = _addPicButton("CHECKBOX/PAGE_PLUS", theme.btnTexPlus, theme.btnTexPlusS, 172, 400, 48, 48); + + _setHideAnim(m_checkboxesLblTitle, "CHECKBOX/TITLE", 0, 0, -2.f, 0.f); + _setHideAnim(m_checkboxesLblPage, "CHECKBOX/PAGE_BTN", 0, 0, 1.f, -1.f); + _setHideAnim(m_checkboxesBtnPageM, "CHECKBOX/PAGE_MINUS", 0, 0, 1.f, -1.f); + _setHideAnim(m_checkboxesBtnPageP, "CHECKBOX/PAGE_PLUS", 0, 0, 1.f, -1.f); + _setHideAnim(m_checkboxesBtnBack, "CHECKBOX/BACK_BTN", 0, 0, 1.f, -1.f); + + /* init checkboxes only here to be used in all menu's */ + m_checkboxBtnOff[0] = _addPicButton("CHECKBOX/CHECKBOX_0_OFF", theme.checkboxoff, theme.checkboxoffs, 270, 394, 44, 48); + m_checkboxBtnOn[0] = _addPicButton("CHECKBOX/CHECKBOX_0_ON", theme.checkboxon, theme.checkboxons, 270, 394, 44, 48); + m_checkboxLblTxt[0] = _addLabel("CHECKBOX/CHECKBOX_0_TXT", theme.lblFont, L"", 325, 397, 100, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + for(int i = 1; i < 6; ++i) + { // Page 1 + m_checkboxBtnOff[i] = _addPicButton(fmt("CHECKBOX/CHECKBOX_%i_OFF", i), theme.checkboxoff, theme.checkboxoffs, 30, (39+i*58), 44, 48); + m_checkboxBtnOn[i] = _addPicButton(fmt("CHECKBOX/CHECKBOX_%i_ON", i), theme.checkboxon, theme.checkboxons, 30, (39+i*58), 44, 48); + m_checkboxLblTxt[i] = _addLabel(fmt("CHECKBOX/CHECKBOX_%i_TXT", i), theme.lblFont, L"", 85, (42+i*58), 230, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + // right half + m_checkboxBtnOff[i+5] = _addPicButton(fmt("CHECKBOX/CHECKBOX_%i_OFF", i+5), theme.checkboxoff, theme.checkboxoffs, 325, (39+i*58), 44, 48); + m_checkboxBtnOn[i+5] = _addPicButton(fmt("CHECKBOX/CHECKBOX_%i_ON", i+5), theme.checkboxon, theme.checkboxons, 325, (39+i*58), 44, 48); + m_checkboxLblTxt[i+5] = _addLabel(fmt("CHECKBOX/CHECKBOX_%i_TXT", i+5), theme.lblFont, L"", 380, (42+i*58), 230, 48, theme.lblFontColor, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_MIDDLE); + } + for(u8 i = 0; i < 11; ++i) + { + _setHideAnim(m_checkboxBtnOff[i], fmt("CHECKBOX/CHECKBOX_%i_OFF", i), 0, 0, 1.f, 0.f); + _setHideAnim(m_checkboxBtnOn[i], fmt("CHECKBOX/CHECKBOX_%i_ON", i), 0, 0, 1.f, 0.f); + _setHideAnim(m_checkboxLblTxt[i], fmt("CHECKBOX/CHECKBOX_%i_TXT", i), 0, 0, 1.f, 0.f); + m_checkboxBtn[i] = m_checkboxBtnOff[i]; + } + _hideCheckboxesMenu(true); + _textCheckboxesMenu(); +} + +void CMenu::_textCheckboxesMenu(void) +{ + m_btnMgr.setText(m_checkboxesBtnBack, _t("cd1", L"Back")); + m_btnMgr.setText(m_checkboxLblTxt[0], _t("dl25", L"All")); +} + +/********************************************************************************************************************/ + +void CMenu::_hideSM_Editor(bool instant) +{ + m_btnMgr.hide(m_configLblTitle, instant); + m_btnMgr.hide(m_configBtnBack, instant); + + m_btnMgr.hide(m_config7Lbl1, instant); + m_btnMgr.hide(m_config7Btn1, instant); + m_btnMgr.hide(m_config7Lbl2, instant); + m_btnMgr.hide(m_config7Btn2, instant); + m_btnMgr.hide(m_config7Lbl3, instant); + m_btnMgr.hide(m_config7Btn3, instant); + //m_btnMgr.hide(m_config7Lbl4, instant); + //m_btnMgr.hide(m_config7Btn4, instant); + + for(u8 i = 0; i < ARRAY_SIZE(m_config7LblUser); ++i) + if(m_config7LblUser[i] != -1) + m_btnMgr.hide(m_config7LblUser[i], instant); +} + +void CMenu::_showSM_Editor() +{ + m_btnMgr.hide(m_config7Lbl1, true); + m_btnMgr.hide(m_config7Btn1, true); + m_btnMgr.hide(m_config7Lbl2, true); + m_btnMgr.hide(m_config7Btn2, true); + m_btnMgr.hide(m_config7Lbl3, true); + m_btnMgr.hide(m_config7Btn3, true); + //m_btnMgr.hide(m_config7Lbl4, true); + //m_btnMgr.hide(m_config7Btn4, true); + + _setBg(m_config7Bg, m_config7Bg); + for(u32 i = 0; i < ARRAY_SIZE(m_config7LblUser); ++i) + if(m_config7LblUser[i] != -1) + m_btnMgr.show(m_config7LblUser[i]); + + m_btnMgr.show(m_configLblTitle); + m_btnMgr.show(m_configBtnBack); + + m_btnMgr.show(m_config7Lbl1); + m_btnMgr.show(m_config7Btn1); + m_btnMgr.show(m_config7Lbl2); + m_btnMgr.show(m_config7Btn2); + m_btnMgr.show(m_config7Lbl3); + m_btnMgr.show(m_config7Btn3); + //m_btnMgr.show(m_config7Lbl4); + //m_btnMgr.show(m_config7Btn4); + + m_btnMgr.setText(m_config7Lbl1, _t("smedit5", L"Hide source buttons")); + m_btnMgr.setText(m_config7Btn1, _t("cfg14", L"Set")); + m_btnMgr.setText(m_config7Lbl2, _t("smedit6", L"Link source buttons to plugins")); + m_btnMgr.setText(m_config7Btn2, _t("cfg14", L"Set")); + m_btnMgr.setText(m_config7Lbl3, _t("smedit7", L"Set plugin ROMs path")); + m_btnMgr.setText(m_config7Btn3, _t("cfg14", L"Set")); + //m_btnMgr.setText(m_config7Lbl4, _t("smedit8", L"Sourceflow settings")); + //m_btnMgr.setText(m_config7Btn4, _t("cfg14", L"Set")); +} + +void CMenu::_SM_Editor() +{ + m_btnMgr.setText(m_configLblTitle, _t("smedit9", L"Source Menu Setup"));// edit sources + SetupInput(); + _showSM_Editor(); + while(!m_exit) + { + _mainLoopCommon(); + if(BTN_HOME_PRESSED || BTN_B_PRESSED || (BTN_A_PRESSED && m_btnMgr.selected(m_configBtnBack))) + { + break; + } + else if(BTN_UP_PRESSED) + m_btnMgr.up(); + else if(BTN_DOWN_PRESSED) + m_btnMgr.down(); + if(BTN_A_PRESSED) + { + if(m_btnMgr.selected(m_config7Btn1)) + { + _hideSM_Editor(); + _checkboxesMenu(1); + _showSM_Editor(); + } + else if(m_btnMgr.selected(m_config7Btn2)) + { + _hideSM_Editor(); + _checkboxesMenu(2); + _showSM_Editor(); + } + else if(m_btnMgr.selected(m_config7Btn3)) + { + _hideSM_Editor(); + _checkboxesMenu(3); + _showSM_Editor(); + } + /*else if(m_btnMgr.selected(m_config7Btn4)) + { + _hideSM_Editor(); + _CfgSrc(); + _showSM_Editor(); + }*/ + } + } + _hideSM_Editor(); + m_btnMgr.setText(m_configLblTitle, _t("cfg1", L"Settings")); +} diff --git a/source/menu/menu_source.cpp b/source/menu/menu_source.cpp index bbe980eb..b3cb955f 100644 --- a/source/menu/menu_source.cpp +++ b/source/menu/menu_source.cpp @@ -17,6 +17,7 @@ bool exitSource = false; static u8 i, j; int curPage; int numPages; +vector nonHiddenSources; vector magicNums; char btn_selected[16]; @@ -213,8 +214,23 @@ void CMenu::_srcTierLoad(string fn) } if(!m_sourceflow) { - curPage = stoi(sm_numbers[sm_numbers.size() - 1]) / 12 + 1; - numPages = (m_max_source_btn / 12) + 1; + nonHiddenSources.clear(); + for(i = 0; i <= m_max_source_btn; i++) + { + if(!m_source.getBool(sfmt("BUTTON_%i", i), "hidden", false)) + nonHiddenSources.push_back(i); + } + u8 num = stoi(sm_numbers[sm_numbers.size() - 1]); + curPage = 1; + for(i = 0; i < nonHiddenSources.size(); i++) + { + if(nonHiddenSources[i] == num) + { + curPage = i / 12 + 1; + break; + } + } + numPages = (nonHiddenSources.size() / 12) + 1; } } @@ -257,6 +273,7 @@ void CMenu::_getSFlowBgTex(void) } } +// ******************************************************************************************* /* end of sourceflow stuff - start of source menu stuff */ void CMenu::_hideSource(bool instant) { @@ -308,12 +325,12 @@ void CMenu::_updateSourceBtns(void) j = (curPage - 1) * 12; for(i = j; i < (j + 12); ++i) { - if(i > m_max_source_btn) + if(i >= nonHiddenSources.size()) m_btnMgr.hide(m_sourceBtnSource[i -j]); else { memset(current_btn, 0, 16); - strncpy(current_btn, fmt("BUTTON_%i", i), 15); + strncpy(current_btn, fmt("BUTTON_%i", nonHiddenSources[i]), 15); string btnSource = m_source.getString(current_btn, "source", ""); if(btnSource == "") continue; @@ -358,9 +375,9 @@ bool CMenu::_Source() while(!m_exit) { _mainLoopCommon(); - if(BTN_HOME_PRESSED || BTN_B_PRESSED) + if(BTN_B_PRESSED) { - if(!_srcTierBack(BTN_HOME_PRESSED)) + if(!_srcTierBack(false)) { _restoreSrcTiers(); break; @@ -368,7 +385,14 @@ bool CMenu::_Source() else _updateSourceBtns(); } - if(BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnBack)) + else if(BTN_HOME_PRESSED) + { + _hideSource(); + _SM_Editor(); + _showSource(); + _updateSourceBtns(); + } + else if(BTN_A_PRESSED && m_btnMgr.selected(m_sourceBtnBack)) { _restoreSrcTiers(); break; diff --git a/source/plugin/plugin.cpp b/source/plugin/plugin.cpp index 96371b8a..96ccb749 100644 --- a/source/plugin/plugin.cpp +++ b/source/plugin/plugin.cpp @@ -71,7 +71,7 @@ void Plugin::init(const string& m_pluginsDir) m_plugin_cfg.load(iniFile->c_str()); if(m_plugin_cfg.loaded()) { - m_plugin.AddPlugin(m_plugin_cfg); + m_plugin.AddPlugin(m_plugin_cfg, *iniFile); } m_plugin_cfg.unload(); } @@ -84,9 +84,10 @@ void Plugin::Cleanup() Plugins.clear(); } -void Plugin::AddPlugin(Config &plugin) +void Plugin::AddPlugin(Config &plugin, const string &iniPath) { PluginOptions NewPlugin; + NewPlugin.path = iniPath; NewPlugin.DolName = plugin.getString(PLUGIN, "dolFile"); NewPlugin.coverFolder = plugin.getString(PLUGIN, "coverFolder"); NewPlugin.magic = strtoul(plugin.getString(PLUGIN, "magic").c_str(), NULL, 16); @@ -123,6 +124,11 @@ u8 Plugin::GetPluginPosition(u32 magic) return 255; } +string Plugin::GetPluginPath(u8 pos) +{ + return Plugins[pos].path; +} + u32 Plugin::GetPluginMagic(u8 pos) { return Plugins[pos].magic; @@ -167,11 +173,21 @@ int Plugin::GetRomPartition(u8 pos) return -1; } +void Plugin::SetRomPartition(u8 pos, int part) +{ + Plugins[pos].romPartition = part; +} + const char *Plugin::GetRomDir(u8 pos) { return Plugins[pos].romDir.c_str(); } +void Plugin::SetRomDir(u8 pos, const string &rd) +{ + Plugins[pos].romDir = rd; +} + const string& Plugin::GetFileTypes(u8 pos) { return Plugins[pos].fileTypes; diff --git a/source/plugin/plugin.hpp b/source/plugin/plugin.hpp index ac35ef34..2f5923cf 100644 --- a/source/plugin/plugin.hpp +++ b/source/plugin/plugin.hpp @@ -41,6 +41,7 @@ using namespace std; struct PluginOptions { + string path; u32 magic; u32 caseColor; int romPartition; @@ -66,17 +67,20 @@ public: const char *GetDolName(u32 magic); const char *GetCoverFolderName(u32 magic); const char *GetRomDir(u8 pos); + void SetRomDir(u8 pos, const string &rd); string GetRomName(const char *FullPath); string GetRomId(char *romPath, u32 Magic, Config &m_crc, const char *datadir, const char *platform, const char *name); int GetRomPartition(u8 pos); + void SetRomPartition(u8 pos, int part); const string& GetFileTypes(u8 pos); wstringEx GetPluginName(u8 pos); + string GetPluginPath(u8 pos); u32 GetPluginMagic(u8 pos); u8 GetPluginPosition(u32 magic); s8 GetBoxMode(u8 pos); void init(const string& m_pluginsDir); - void AddPlugin(Config &plugin); + void AddPlugin(Config &plugin, const string &iniPath); void Cleanup(); bool GetEnabledStatus(u8 pos); void SetEnablePlugin(u8 pos, u8 ForceMode = 0); diff --git a/wii/wiiflow/Languages/english.ini b/wii/wiiflow/Languages/english.ini index c0d190c5..ebd94114 100644 --- a/wii/wiiflow/Languages/english.ini +++ b/wii/wiiflow/Languages/english.ini @@ -64,7 +64,7 @@ cfg719=Mount SD only cfg720=Play GC banner sound cfg721=Play GC default sound cfg722=Homebrew settings -cfg723=Source menu settings +cfg723=Sourceflow settings cfg724=Lock coverflow layouts cfg725=Shutdown to idle standby cfg726=Covers Box Mode @@ -231,7 +231,7 @@ cfgs1=Music volume cfgs2=GUI sound volume cfgs3=Coverflow sound volume cfgs4=Game sound volume -cfgsm1=Source Menu Settings +cfgsm1=Sourceflow Settings cfgsm3=Enable Sourceflow cfgsm4=Sourceflow Smallbox cfgsm5=Clear Sourceflow Cache @@ -453,6 +453,15 @@ shutdown1=Shutdown how? shutdown2=Full Shutdown shutdown3=Standby Shutdown4=Cancel +smedit1=Hide Sources +smedit2=Choose Source +smedit3=Choose Plugin +smedit4=Choose Plugins +smedit5=Hide source buttons +smedit6=Link source buttons to plugins +smedit7=Set plugin ROMs path +smedit9=Source Menu Setup +smediterr=Not allowed! snes=Super Nintendo stup1=Select Source translation_author=