From 6d568d07b31ba2ae39703cfd272d3003ea542018 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Sun, 19 Apr 2020 23:36:48 +0800 Subject: Legacy code massacre! Complete reconstruction of the settings infrastructure. All options are now registered using a revamped option API. Legacy configuration files are no longer compatible. Please make a backup. --- qmidiplayer-desktop/qmpsettings.cpp | 233 ++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 qmidiplayer-desktop/qmpsettings.cpp (limited to 'qmidiplayer-desktop/qmpsettings.cpp') diff --git a/qmidiplayer-desktop/qmpsettings.cpp b/qmidiplayer-desktop/qmpsettings.cpp new file mode 100644 index 0000000..134b73b --- /dev/null +++ b/qmidiplayer-desktop/qmpsettings.cpp @@ -0,0 +1,233 @@ +#include "qmpsettings.hpp" +#include + +QSettings* qmpSettings::settings=nullptr; +qmpSettings::qmpSettings() +{ + qRegisterMetaTypeStreamOperators>(); + settings=new QSettings(QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ConfigLocation)+QString("/qmprc"),QSettings::IniFormat); +} + +qmpSettings::~qmpSettings() +{ + delete settings; + settings=nullptr; +} + +void qmpSettings::registerOptionInt(std::string tab,std::string desc,std::string key,int min,int max,int defaultval) +{ + optionlist.push_back(key); + options[key]=qmpOption(tab,desc,qmpOption::ParameterType::parameter_int,nullptr,defaultval,min,max); +} +int qmpSettings::getOptionInt(std::string key) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_int) + return settings->value(QString(key.c_str()),options[key].defaultval).toInt(); + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return options[key].defaultval.toInt(); +} +void qmpSettings::setOptionInt(std::string key,int val) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_int) + settings->setValue(QString(key.c_str()),val); + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + //call qmpSettingsWindow::load(key)? +} + +void qmpSettings::registerOptionUint(std::string tab,std::string desc,std::string key,unsigned min, unsigned max,unsigned defaultval) +{ + optionlist.push_back(key); + options[key]=qmpOption(tab,desc,qmpOption::ParameterType::parameter_uint,nullptr,defaultval,min,max); +} +unsigned qmpSettings::getOptionUint(std::string key) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_uint) + return settings->value(QString(key.c_str()),options[key].defaultval).toUInt(); + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return options[key].defaultval.toUInt(); +} +void qmpSettings::setOptionUint(std::string key,unsigned val) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_uint) + settings->setValue(QString(key.c_str()),val); + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); +} + +void qmpSettings::registerOptionBool(std::string tab,std::string desc,std::string key,bool defaultval) +{ + optionlist.push_back(key); + options[key]=qmpOption(tab,desc,qmpOption::ParameterType::parameter_bool,nullptr,defaultval); +} +bool qmpSettings::getOptionBool(std::string key) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_bool) + return settings->value(QString(key.c_str()),options[key].defaultval).toBool(); + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return options[key].defaultval.toBool(); +} +void qmpSettings::setOptionBool(std::string key,bool val) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_bool) + settings->setValue(QString(key.c_str()),val); + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); +} + +void qmpSettings::registerOptionDouble(std::string tab, std::string desc, std::string key, double min, double max, double defaultval) +{ + optionlist.push_back(key); + options[key]=qmpOption(tab,desc,qmpOption::ParameterType::parameter_double,nullptr,defaultval,min,max); +} +double qmpSettings::getOptionDouble(std::string key) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_double) + return settings->value(QString(key.c_str()),options[key].defaultval).toDouble(); + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return options[key].defaultval.toDouble(); +} +void qmpSettings::setOptionDouble(std::string key,double val) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_double) + settings->setValue(QString(key.c_str()),val); + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); +} + +void qmpSettings::registerOptionString(std::string tab,std::string desc,std::string key,std::string defaultval,bool is_url) +{ + optionlist.push_back(key); + options[key]=qmpOption(tab,desc, + is_url?qmpOption::ParameterType::parameter_url:qmpOption::ParameterType::parameter_str, + nullptr,QString(defaultval.c_str())); +} +std::string qmpSettings::getOptionString(std::string key) +{ + if(options.find(key)!=options.end()&& + (options[key].type==qmpOption::ParameterType::parameter_str||options[key].type==qmpOption::ParameterType::parameter_url)) + return settings->value(QString(key.c_str()),options[key].defaultval).toString().toStdString(); + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return options[key].defaultval.toString().toStdString(); +} +void qmpSettings::setOptionString(std::string key,std::string val) +{ + if(options.find(key)!=options.end()&& + (options[key].type==qmpOption::ParameterType::parameter_str||options[key].type==qmpOption::ParameterType::parameter_url)) + settings->setValue(QString(key.c_str()),QString(val.c_str())); + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); +} + +void qmpSettings::registerOptionEnumInt(std::string tab,std::string desc,std::string key,std::vector enumlist,int defaultval) +{ + optionlist.push_back(key); + options[key]=qmpOption(tab,desc,qmpOption::ParameterType::parameter_enum,nullptr,defaultval); + options[key].enumlist=enumlist; +} +int qmpSettings::getOptionEnumInt(std::string key) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_enum) + { + std::string curitm=settings->value(QString(key.c_str()),options[key].defaultval).toString().toStdString(); + auto curidx=std::find(options[key].enumlist.begin(),options[key].enumlist.end(),curitm); + if(curidx!=options[key].enumlist.end()) + return static_cast(curidx-options[key].enumlist.begin()); + else + { + qWarning("Invalid value set for option \"%s\".",key.c_str()); + return options[key].defaultval.toInt(); + } + } + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return options[key].defaultval.toInt(); +} + +std::string qmpSettings::getOptionEnumIntOptName(std::string key) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_enum) + { + std::string curitm=settings->value(QString(key.c_str()),options[key].defaultval).toString().toStdString(); + auto curidx=std::find(options[key].enumlist.begin(),options[key].enumlist.end(),curitm); + if(curidx!=options[key].enumlist.end()) + return curitm; + else + { + qWarning("Invalid value set for option \"%s\".",key.c_str()); + return options[key].enumlist[static_cast(options[key].defaultval.toInt())]; + } + } + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return options[key].enumlist[static_cast(options[key].defaultval.toInt())]; +} +void qmpSettings::setOptionEnumInt(std::string key,int val) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_enum) + { + if(static_cast(val)setValue(QString(key.c_str()),QString(options[key].enumlist[static_cast(val)].c_str())); + else + qWarning("Trying to set invalid value for option \"%s\".",key.c_str()); + } + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); +} + +void qmpSettings::setOptionEnumIntOptName(std::string key,std::string valname) +{ + if(options.find(key)!=options.end()&&options[key].type==qmpOption::ParameterType::parameter_enum) + { + auto curidx=std::find(options[key].enumlist.begin(),options[key].enumlist.end(),valname); + if(curidx!=options[key].enumlist.end()) + settings->setValue(QString(key.c_str()),QString(valname.c_str())); + else + qWarning("Trying to set invalid value for option \"%s\".",key.c_str()); + } + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); +} + +void qmpSettings::registerOptionCustom(std::string tab,std::string desc,std::string key,void* widget, void* defaultval,std::function save_func,std::function load_func) +{ + optionlist.push_back(key); + options[key]=qmpOption(tab,desc,qmpOption::parameter_custom, + static_cast(widget), + *static_cast(defaultval), + QVariant(),QVariant(),save_func,load_func); +} +void* qmpSettings::getOptionCustom(std::string key) +{ + if(options.find(key)!=options.end()||options[key].type!=qmpOption::ParameterType::parameter_custom) + return static_cast(new QVariant(settings->value(QString(key.c_str()),options[key].defaultval))); + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); + return nullptr; +} +void qmpSettings::setOptionCustom(std::string key,void *val) +{ + if(options.find(key)!=options.end()||options[key].type!=qmpOption::ParameterType::parameter_custom) + settings->setValue(QString(key.c_str()),*static_cast(val)); + else + qWarning("Unregistered option or mismatching option type: %s.",key.c_str()); +} + +void qmpSettings::setOptionRaw(QString key,QVariant val) +{ + settings->setValue(key,val); +} + +QVariant qmpSettings::getOptionRaw(QString key,QVariant defval) +{ + return settings->value(key,defval); +} + +QDataStream &operator<<(QDataStream &out,const QPair &o) +{ + out<>(QDataStream &in,QPair &o) +{ + in>>o.first>>o.second; + return in; +} -- cgit v1.2.3