aboutsummaryrefslogtreecommitdiff
path: root/qmidiplayer-desktop/qmpsettings.cpp
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2020-04-19 23:36:48 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2020-04-19 23:36:48 +0800
commit6d568d07b31ba2ae39703cfd272d3003ea542018 (patch)
tree58dca1ac27ffe9dd6bb045c5a71d04644b7a2e07 /qmidiplayer-desktop/qmpsettings.cpp
parentc7bf3e37e6eaed6895c797f72ef116b42c6f8a44 (diff)
downloadQMidiPlayer-6d568d07b31ba2ae39703cfd272d3003ea542018.tar.xz
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.
Diffstat (limited to 'qmidiplayer-desktop/qmpsettings.cpp')
-rw-r--r--qmidiplayer-desktop/qmpsettings.cpp233
1 files changed, 233 insertions, 0 deletions
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 <QStandardPaths>
+
+QSettings* qmpSettings::settings=nullptr;
+qmpSettings::qmpSettings()
+{
+ qRegisterMetaTypeStreamOperators<QPair<QString,QString>>();
+ 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<std::string> 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<int>(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<size_t>(options[key].defaultval.toInt())];
+ }
+ }
+ qWarning("Unregistered option or mismatching option type: %s.",key.c_str());
+ return options[key].enumlist[static_cast<size_t>(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<size_t>(val)<options[key].enumlist.size())
+ settings->setValue(QString(key.c_str()),QString(options[key].enumlist[static_cast<size_t>(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<void*()> save_func,std::function<void(void*)> load_func)
+{
+ optionlist.push_back(key);
+ options[key]=qmpOption(tab,desc,qmpOption::parameter_custom,
+ static_cast<QWidget*>(widget),
+ *static_cast<QVariant*>(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<void*>(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<QVariant*>(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<QString,QString> &o)
+{
+ out<<o.first<<o.second;
+ return out;
+}
+
+QDataStream &operator>>(QDataStream &in,QPair<QString,QString> &o)
+{
+ in>>o.first>>o.second;
+ return in;
+}