#pragma once #include "ConfigOption.h" #include "framework.h" namespace PluginConfig { enum ConfigType { CONFIG_BOOLEAN, CONFIG_NUMERIC, CONFIG_STRING, CONFIG_DROPDOWN_INDEX, CONFIG_DROPDOWN_TEXT, CONFIG_DROPDOWN_NUMBER, CONFIG_RESOLUTION, CONFIG_GROUP_START, CONFIG_GROUP_END }; struct PluginConfigBooleanData { LPCWSTR iniVarName; LPCWSTR iniSectionName; LPCWSTR iniFilePath; LPCWSTR friendlyName; LPCWSTR description; bool defaultVal; bool saveAsString; }; struct PluginConfigNumericData { LPCWSTR iniVarName; LPCWSTR iniSectionName; LPCWSTR iniFilePath; LPCWSTR friendlyName; LPCWSTR description; int defaultVal; int minVal; int maxVal; }; struct PluginConfigStringData { LPCWSTR iniVarName; LPCWSTR iniSectionName; LPCWSTR iniFilePath; LPCWSTR friendlyName; LPCWSTR description; LPCWSTR defaultVal; bool useUtf8; }; struct PluginConfigDropdownIndexData { LPCWSTR iniVarName; LPCWSTR iniSectionName; LPCWSTR iniFilePath; LPCWSTR friendlyName; LPCWSTR description; int defaultVal; std::vector valueStrings; }; struct PluginConfigDropdownTextData { LPCWSTR iniVarName; LPCWSTR iniSectionName; LPCWSTR iniFilePath; LPCWSTR friendlyName; LPCWSTR description; LPCWSTR defaultVal; std::vector valueStrings; bool useUtf8; }; struct PluginConfigDropdownNumberData { LPCWSTR iniVarName; LPCWSTR iniSectionName; LPCWSTR iniFilePath; LPCWSTR friendlyName; LPCWSTR description; int defaultVal; std::vector valueInts; }; struct PluginConfigResolutionData { LPCWSTR iniVarName; LPCWSTR iniVarName2; LPCWSTR iniSectionName; LPCWSTR iniFilePath; LPCWSTR friendlyName; LPCWSTR description; resolution defaultVal; std::vector valueResolutions; }; struct PluginConfigGroupData { LPCWSTR name; int height; }; struct PluginConfigOption { ConfigType cfgType; void* data; }; ConfigOptionBase* GetConfigOption(PluginConfigOption cfg) { PluginConfigBooleanData* boolData = (PluginConfigBooleanData*)(cfg.data); PluginConfigNumericData* numericData = (PluginConfigNumericData*)(cfg.data); PluginConfigStringData* stringData = (PluginConfigStringData*)(cfg.data); PluginConfigDropdownIndexData* ddIdxData = (PluginConfigDropdownIndexData*)(cfg.data); PluginConfigDropdownTextData* ddTextData = (PluginConfigDropdownTextData*)(cfg.data); PluginConfigDropdownNumberData* ddNumberData = (PluginConfigDropdownNumberData*)(cfg.data); PluginConfigResolutionData* resData = (PluginConfigResolutionData*)(cfg.data); PluginConfigGroupData* groupData = (PluginConfigGroupData*)(cfg.data); switch (cfg.cfgType) { case CONFIG_BOOLEAN: return new BooleanOption(boolData->iniVarName, boolData->iniSectionName, boolData->iniFilePath, boolData->friendlyName, boolData->description, boolData->defaultVal, boolData->saveAsString); case CONFIG_NUMERIC: return new NumericOption(numericData->iniVarName, numericData->iniSectionName, numericData->iniFilePath, numericData->friendlyName, numericData->description, numericData->defaultVal, numericData->minVal, numericData->maxVal); case CONFIG_STRING: return new StringOption(stringData->iniVarName, stringData->iniSectionName, stringData->iniFilePath, stringData->friendlyName, stringData->description, stringData->defaultVal, stringData->useUtf8); case CONFIG_DROPDOWN_INDEX: return new DropdownOption(ddIdxData->iniVarName, ddIdxData->iniSectionName, ddIdxData->iniFilePath, ddIdxData->friendlyName, ddIdxData->description, ddIdxData->defaultVal, ddIdxData->valueStrings); case CONFIG_DROPDOWN_TEXT: return new EditableDropdownOption(ddTextData->iniVarName, ddTextData->iniSectionName, ddTextData->iniFilePath, ddTextData->friendlyName, ddTextData->description, ddTextData->defaultVal, ddTextData->valueStrings, ddTextData->useUtf8); case CONFIG_DROPDOWN_NUMBER: return new EditableDropdownNumberOption(ddNumberData->iniVarName, ddNumberData->iniSectionName, ddNumberData->iniFilePath, ddNumberData->friendlyName, ddNumberData->description, ddNumberData->defaultVal, ddNumberData->valueInts); case CONFIG_RESOLUTION: return new ResolutionOption(resData->iniVarName, resData->iniVarName2, resData->iniSectionName, resData->iniFilePath, resData->friendlyName, resData->description, resData->defaultVal, resData->valueResolutions); case CONFIG_GROUP_START: return new OptionMetaGroupStart(groupData->name, groupData->height); case CONFIG_GROUP_END: return new OptionMetaGroupEnd(); default: return new ConfigOptionBase(); } } std::vector GetConfigOptionVec(std::vector in) { std::vector outvec; for (PluginConfigOption &opt : in) { outvec.push_back(GetConfigOption(opt)); } return outvec; } std::vector testcfg = { PluginConfigOption{ CONFIG_GROUP_START, new PluginConfigGroupData{L"Screen Resolution", 400 } }, PluginConfigOption{ CONFIG_DROPDOWN_INDEX, new PluginConfigDropdownIndexData{ L"display", RESOLUTION_SECTION, CONFIG_FILE, L"Display:", L"Sets the window/screen mode.", 0, std::vector({ L"Windowed", L"Borderless", L"Fullscreen" }) } }, PluginConfigOption{ CONFIG_RESOLUTION, new PluginConfigResolutionData{ L"width", L"height", RESOLUTION_SECTION, CONFIG_FILE, L"Resolution:", L"Sets the display resolution.", resolution(1280, 720), getScreenResolutionsVec(screenModes) } } }; std::vector testcfgconfigopts = GetConfigOptionVec(testcfg); };