2017-06-12 16:38:59 +00:00
|
|
|
#include "guis/GuiCollectionSystemsOptions.h"
|
|
|
|
|
|
|
|
#include "components/OptionListComponent.h"
|
2017-11-01 22:21:10 +00:00
|
|
|
#include "components/SwitchComponent.h"
|
|
|
|
#include "guis/GuiSettings.h"
|
|
|
|
#include "guis/GuiTextEditPopup.h"
|
2018-01-26 18:53:19 +00:00
|
|
|
#include "utils/StringUtil.h"
|
2017-11-01 22:21:10 +00:00
|
|
|
#include "views/ViewController.h"
|
|
|
|
#include "CollectionSystemManager.h"
|
2020-06-07 18:09:02 +00:00
|
|
|
#include "SystemData.h"
|
2017-11-01 22:21:10 +00:00
|
|
|
#include "Window.h"
|
2017-06-12 16:38:59 +00:00
|
|
|
|
|
|
|
GuiCollectionSystemsOptions::GuiCollectionSystemsOptions(Window* window) : GuiComponent(window), mMenu(window, "GAME COLLECTION SETTINGS")
|
|
|
|
{
|
|
|
|
initializeMenu();
|
|
|
|
}
|
|
|
|
|
|
|
|
void GuiCollectionSystemsOptions::initializeMenu()
|
|
|
|
{
|
|
|
|
addChild(&mMenu);
|
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
// get collections
|
2017-06-12 16:38:59 +00:00
|
|
|
|
|
|
|
addSystemsToMenu();
|
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
// add "Create New Custom Collection from Theme"
|
|
|
|
|
|
|
|
std::vector<std::string> unusedFolders = CollectionSystemManager::get()->getUnusedSystemsFromTheme();
|
|
|
|
if (unusedFolders.size() > 0)
|
|
|
|
{
|
|
|
|
addEntry("CREATE NEW CUSTOM COLLECTION FROM THEME", 0x777777FF, true,
|
|
|
|
[this, unusedFolders] {
|
|
|
|
auto s = new GuiSettings(mWindow, "SELECT THEME FOLDER");
|
2020-06-07 18:09:02 +00:00
|
|
|
std::shared_ptr< OptionListComponent<std::string>>
|
|
|
|
folderThemes = std::make_shared< OptionListComponent<std::string>>
|
|
|
|
(mWindow, getHelpStyle(), "SELECT THEME FOLDER", true);
|
2017-07-18 09:45:50 +00:00
|
|
|
|
|
|
|
// add Custom Systems
|
2017-11-11 14:56:22 +00:00
|
|
|
for(auto it = unusedFolders.cbegin() ; it != unusedFolders.cend() ; it++ )
|
2017-07-18 09:45:50 +00:00
|
|
|
{
|
|
|
|
ComponentListRow row;
|
|
|
|
std::string name = *it;
|
|
|
|
|
|
|
|
std::function<void()> createCollectionCall = [name, this, s] {
|
|
|
|
createCollection(name);
|
|
|
|
};
|
|
|
|
row.makeAcceptInputHandler(createCollectionCall);
|
|
|
|
|
2018-01-27 17:04:28 +00:00
|
|
|
auto themeFolder = std::make_shared<TextComponent>(mWindow, Utils::String::toUpper(name), Font::get(FONT_SIZE_SMALL), 0x777777FF);
|
2017-07-18 09:45:50 +00:00
|
|
|
row.addElement(themeFolder, true);
|
|
|
|
s->addRow(row);
|
|
|
|
}
|
|
|
|
mWindow->pushGui(s);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
ComponentListRow row;
|
|
|
|
row.addElement(std::make_shared<TextComponent>(mWindow, "CREATE NEW CUSTOM COLLECTION", Font::get(FONT_SIZE_MEDIUM), 0x777777FF), true);
|
|
|
|
auto createCustomCollection = [this](const std::string& newVal) {
|
|
|
|
std::string name = newVal;
|
|
|
|
// we need to store the first Gui and remove it, as it'll be deleted by the actual Gui
|
|
|
|
Window* window = mWindow;
|
|
|
|
GuiComponent* topGui = window->peekGui();
|
|
|
|
window->removeGui(topGui);
|
|
|
|
createCollection(name);
|
|
|
|
};
|
|
|
|
row.makeAcceptInputHandler([this, createCustomCollection] {
|
2020-06-07 18:09:02 +00:00
|
|
|
mWindow->pushGui(new GuiTextEditPopup(mWindow, getHelpStyle(), "New Collection Name", "", createCustomCollection, false));
|
2017-07-18 09:45:50 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
mMenu.addRow(row);
|
|
|
|
|
|
|
|
bundleCustomCollections = std::make_shared<SwitchComponent>(mWindow);
|
|
|
|
bundleCustomCollections->setState(Settings::getInstance()->getBool("UseCustomCollectionsSystem"));
|
|
|
|
mMenu.addWithLabel("GROUP UNTHEMED CUSTOM COLLECTIONS", bundleCustomCollections);
|
|
|
|
|
2020-05-24 08:29:29 +00:00
|
|
|
sortFavFirstCustomSwitch = std::make_shared<SwitchComponent>(mWindow);
|
|
|
|
sortFavFirstCustomSwitch->setState(Settings::getInstance()->getBool("FavFirstCustom"));
|
|
|
|
mMenu.addWithLabel("SORT FAVORITES ON TOP FOR CUSTOM COLLECTIONS", sortFavFirstCustomSwitch);
|
2017-07-18 09:45:50 +00:00
|
|
|
|
2019-07-11 06:38:23 +00:00
|
|
|
toggleSystemNameInCollections = std::make_shared<SwitchComponent>(mWindow);
|
|
|
|
toggleSystemNameInCollections->setState(Settings::getInstance()->getBool("CollectionShowSystemInfo"));
|
2020-05-24 18:57:07 +00:00
|
|
|
mMenu.addWithLabel("SHOW SYSTEM NAMES IN COLLECTIONS", toggleSystemNameInCollections);
|
2019-07-11 06:38:23 +00:00
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
if(CollectionSystemManager::get()->isEditing())
|
|
|
|
{
|
|
|
|
row.elements.clear();
|
2018-01-27 17:04:28 +00:00
|
|
|
row.addElement(std::make_shared<TextComponent>(mWindow, "FINISH EDITING '" + Utils::String::toUpper(CollectionSystemManager::get()->getEditingCollection()) + "' COLLECTION", Font::get(FONT_SIZE_MEDIUM), 0x777777FF), true);
|
2017-07-18 09:45:50 +00:00
|
|
|
row.makeAcceptInputHandler(std::bind(&GuiCollectionSystemsOptions::exitEditMode, this));
|
|
|
|
mMenu.addRow(row);
|
|
|
|
}
|
|
|
|
|
2017-06-12 16:38:59 +00:00
|
|
|
mMenu.addButton("BACK", "back", std::bind(&GuiCollectionSystemsOptions::applySettings, this));
|
|
|
|
|
|
|
|
mMenu.setPosition((Renderer::getScreenWidth() - mMenu.getSize().x()) / 2, Renderer::getScreenHeight() * 0.15f);
|
|
|
|
}
|
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
void GuiCollectionSystemsOptions::addEntry(const char* name, unsigned int color, bool add_arrow, const std::function<void()>& func)
|
|
|
|
{
|
|
|
|
std::shared_ptr<Font> font = Font::get(FONT_SIZE_MEDIUM);
|
|
|
|
|
|
|
|
// populate the list
|
|
|
|
ComponentListRow row;
|
|
|
|
row.addElement(std::make_shared<TextComponent>(mWindow, name, font, color), true);
|
|
|
|
|
|
|
|
if(add_arrow)
|
|
|
|
{
|
|
|
|
std::shared_ptr<ImageComponent> bracket = makeArrow(mWindow);
|
|
|
|
row.addElement(bracket, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
row.makeAcceptInputHandler(func);
|
|
|
|
|
|
|
|
mMenu.addRow(row);
|
|
|
|
}
|
|
|
|
|
|
|
|
void GuiCollectionSystemsOptions::createCollection(std::string inName) {
|
|
|
|
std::string name = CollectionSystemManager::get()->getValidNewCollectionName(inName);
|
|
|
|
SystemData* newSys = CollectionSystemManager::get()->addNewCustomCollection(name);
|
|
|
|
customOptionList->add(name, name, true);
|
2018-01-26 18:53:19 +00:00
|
|
|
std::string outAuto = Utils::String::vectorToCommaString(autoOptionList->getSelectedObjects());
|
|
|
|
std::string outCustom = Utils::String::vectorToCommaString(customOptionList->getSelectedObjects());
|
2017-07-18 09:45:50 +00:00
|
|
|
updateSettings(outAuto, outCustom);
|
|
|
|
ViewController::get()->goToSystemView(newSys);
|
|
|
|
|
|
|
|
Window* window = mWindow;
|
|
|
|
CollectionSystemManager::get()->setEditMode(name);
|
|
|
|
while(window->peekGui() && window->peekGui() != ViewController::get())
|
|
|
|
delete window->peekGui();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void GuiCollectionSystemsOptions::exitEditMode()
|
|
|
|
{
|
|
|
|
CollectionSystemManager::get()->exitEditMode();
|
|
|
|
applySettings();
|
|
|
|
}
|
|
|
|
|
2017-06-12 16:38:59 +00:00
|
|
|
GuiCollectionSystemsOptions::~GuiCollectionSystemsOptions()
|
|
|
|
{
|
2017-07-18 09:45:50 +00:00
|
|
|
|
2017-06-12 16:38:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void GuiCollectionSystemsOptions::addSystemsToMenu()
|
|
|
|
{
|
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
std::map<std::string, CollectionSystemData> autoSystems = CollectionSystemManager::get()->getAutoCollectionSystems();
|
2017-06-12 16:38:59 +00:00
|
|
|
|
2020-06-07 18:09:02 +00:00
|
|
|
autoOptionList = std::make_shared< OptionListComponent<std::string> >(mWindow, getHelpStyle(), "SELECT COLLECTIONS", true);
|
2017-06-12 16:38:59 +00:00
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
// add Auto Systems
|
2017-11-11 14:56:22 +00:00
|
|
|
for(std::map<std::string, CollectionSystemData>::const_iterator it = autoSystems.cbegin() ; it != autoSystems.cend() ; it++ )
|
2017-06-12 16:38:59 +00:00
|
|
|
{
|
|
|
|
autoOptionList->add(it->second.decl.longName, it->second.decl.name, it->second.isEnabled);
|
|
|
|
}
|
2017-07-18 09:45:50 +00:00
|
|
|
mMenu.addWithLabel("AUTOMATIC GAME COLLECTIONS", autoOptionList);
|
|
|
|
|
|
|
|
std::map<std::string, CollectionSystemData> customSystems = CollectionSystemManager::get()->getCustomCollectionSystems();
|
|
|
|
|
2020-06-07 18:09:02 +00:00
|
|
|
customOptionList = std::make_shared< OptionListComponent<std::string> >(mWindow, getHelpStyle(), "SELECT COLLECTIONS", true);
|
2017-07-18 09:45:50 +00:00
|
|
|
|
|
|
|
// add Custom Systems
|
2017-11-11 14:56:22 +00:00
|
|
|
for(std::map<std::string, CollectionSystemData>::const_iterator it = customSystems.cbegin() ; it != customSystems.cend() ; it++ )
|
2017-07-18 09:45:50 +00:00
|
|
|
{
|
|
|
|
customOptionList->add(it->second.decl.longName, it->second.decl.name, it->second.isEnabled);
|
|
|
|
}
|
|
|
|
mMenu.addWithLabel("CUSTOM GAME COLLECTIONS", customOptionList);
|
2017-06-12 16:38:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void GuiCollectionSystemsOptions::applySettings()
|
|
|
|
{
|
2018-01-26 18:53:19 +00:00
|
|
|
std::string outAuto = Utils::String::vectorToCommaString(autoOptionList->getSelectedObjects());
|
2017-07-18 09:45:50 +00:00
|
|
|
std::string prevAuto = Settings::getInstance()->getString("CollectionSystemsAuto");
|
2018-01-26 18:53:19 +00:00
|
|
|
std::string outCustom = Utils::String::vectorToCommaString(customOptionList->getSelectedObjects());
|
2017-07-18 09:45:50 +00:00
|
|
|
std::string prevCustom = Settings::getInstance()->getString("CollectionSystemsCustom");
|
2020-05-24 08:29:29 +00:00
|
|
|
bool outSort = sortFavFirstCustomSwitch->getState();
|
|
|
|
bool prevSort = Settings::getInstance()->getBool("FavFirstCustom");
|
2017-07-18 09:45:50 +00:00
|
|
|
bool outBundle = bundleCustomCollections->getState();
|
|
|
|
bool prevBundle = Settings::getInstance()->getBool("UseCustomCollectionsSystem");
|
2019-07-11 06:38:23 +00:00
|
|
|
bool prevShow = Settings::getInstance()->getBool("CollectionShowSystemInfo");
|
|
|
|
bool outShow = toggleSystemNameInCollections->getState();
|
|
|
|
bool needUpdateSettings = prevAuto != outAuto || prevCustom != outCustom || outSort != prevSort || outBundle != prevBundle || prevShow != outShow ;
|
2017-07-18 09:45:50 +00:00
|
|
|
if (needUpdateSettings)
|
2017-06-12 16:38:59 +00:00
|
|
|
{
|
2017-07-18 09:45:50 +00:00
|
|
|
updateSettings(outAuto, outCustom);
|
2017-06-12 16:38:59 +00:00
|
|
|
}
|
2019-07-11 06:38:23 +00:00
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
delete this;
|
2017-06-12 16:38:59 +00:00
|
|
|
}
|
|
|
|
|
2017-07-18 09:45:50 +00:00
|
|
|
void GuiCollectionSystemsOptions::updateSettings(std::string newAutoSettings, std::string newCustomSettings)
|
2017-06-12 16:38:59 +00:00
|
|
|
{
|
2017-07-18 09:45:50 +00:00
|
|
|
Settings::getInstance()->setString("CollectionSystemsAuto", newAutoSettings);
|
|
|
|
Settings::getInstance()->setString("CollectionSystemsCustom", newCustomSettings);
|
2020-05-24 08:29:29 +00:00
|
|
|
Settings::getInstance()->setBool("FavFirstCustom", sortFavFirstCustomSwitch->getState());
|
2017-07-18 09:45:50 +00:00
|
|
|
Settings::getInstance()->setBool("UseCustomCollectionsSystem", bundleCustomCollections->getState());
|
2019-07-11 06:38:23 +00:00
|
|
|
Settings::getInstance()->setBool("CollectionShowSystemInfo", toggleSystemNameInCollections->getState());
|
2017-06-12 16:38:59 +00:00
|
|
|
Settings::getInstance()->saveFile();
|
|
|
|
CollectionSystemManager::get()->loadEnabledListFromSettings();
|
|
|
|
CollectionSystemManager::get()->updateSystemsList();
|
|
|
|
ViewController::get()->goToStart();
|
|
|
|
ViewController::get()->reloadAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool GuiCollectionSystemsOptions::input(InputConfig* config, Input input)
|
|
|
|
{
|
|
|
|
bool consumed = GuiComponent::input(config, input);
|
|
|
|
if(consumed)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if(config->isMappedTo("b", input) && input.value != 0)
|
|
|
|
{
|
|
|
|
applySettings();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<HelpPrompt> GuiCollectionSystemsOptions::getHelpPrompts()
|
|
|
|
{
|
|
|
|
std::vector<HelpPrompt> prompts = mMenu.getHelpPrompts();
|
|
|
|
prompts.push_back(HelpPrompt("b", "back"));
|
|
|
|
return prompts;
|
|
|
|
}
|
2020-06-07 18:09:02 +00:00
|
|
|
|
|
|
|
HelpStyle GuiCollectionSystemsOptions::getHelpStyle()
|
|
|
|
{
|
|
|
|
HelpStyle style = HelpStyle();
|
|
|
|
style.applyTheme(ViewController::get()->getState().getSystem()->getTheme(), "system");
|
|
|
|
return style;
|
|
|
|
}
|