summaryrefslogtreecommitdiff
path: root/OptionEngine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'OptionEngine.cpp')
-rw-r--r--OptionEngine.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/OptionEngine.cpp b/OptionEngine.cpp
new file mode 100644
index 0000000..ad2cf7c
--- /dev/null
+++ b/OptionEngine.cpp
@@ -0,0 +1,242 @@
+/** \file OptionEngine.cpp
+\brief Define the class of the event dispatcher
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QFileInfo>
+#include <QDir>
+#include <QLabel>
+#include <QComboBox>
+#include <QDialogButtonBox>
+#include <QMessageBox>
+
+#include "OptionEngine.h"
+
+/// \todo async the options write
+
+/// \brief Initiate the option, load from backend
+OptionEngine::OptionEngine()
+{
+ //locate the settings
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ QString settingsFilePath=QString::fromStdString(ResourcesManager::resourcesManager->getWritablePath());
+ if(settingsFilePath!="")
+ settings = new QSettings(settingsFilePath+QStringLiteral("Ultracopier.conf"),QSettings::IniFormat);
+ else
+ settings = NULL;
+ #else // ULTRACOPIER_VERSION_PORTABLE
+ settings = new QSettings(QStringLiteral("Ultracopier"),QStringLiteral("Ultracopier"));
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ if(settings!=NULL)
+ {
+ //do some write test
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ else if(!settings->isWritable())
+ {
+ delete settings;
+ settings=NULL;
+ }
+ else
+ {
+ settings->setValue(QStringLiteral("test"),QStringLiteral("test"));
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ else
+ {
+ settings->remove(QStringLiteral("test"));
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ }
+ }
+ }
+ //set the backend
+ if(settings==NULL)
+ {
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ ResourcesManager::resourcesManager->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ else
+ currentBackend=File;
+}
+
+/// \brief Destroy the option
+OptionEngine::~OptionEngine()
+{
+}
+
+/// \brief To add option group to options
+bool OptionEngine::addOptionGroup(const std::string &groupName,const std::vector<std::pair<std::string, std::string> > &KeysList)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start(\""+groupName+"\",[...])");
+ //search if previous with the same name exists
+ if(GroupKeysList.find(groupName)!=GroupKeysList.cend())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"group already used previously");
+ return false;
+ }
+ //if the backend is file, enter into the group
+ if(currentBackend==File)
+ settings->beginGroup(QString::fromStdString(groupName));
+ //browse all key, and append it to the key
+ unsigned int index=0;
+ //QList<OptionEngineGroupKey> KeyListTemp;
+ while(index<KeysList.size())
+ {
+ OptionEngineGroupKey theCurrentKey;
+ theCurrentKey.defaultValue=KeysList.at(index).second;
+ //if memory backend, load the default value into the current value
+ if(currentBackend==Memory)
+ theCurrentKey.currentValue=theCurrentKey.defaultValue;
+ else
+ {
+ if(settings->contains(QString::fromStdString(KeysList.at(index).first)))//if file backend, load the default value from the file
+ {
+ theCurrentKey.currentValue=settings->value(QString::fromStdString(KeysList.at(index).first)).toString().toStdString();
+ #ifdef ULTRACOPIER_DEBUG
+ if(theCurrentKey.currentValue!=theCurrentKey.defaultValue)
+ {
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ if(groupName=="Ultracopier" && KeysList.at(index).first=="key")
+ {
+ }
+ else
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"The current key: "+groupName+", group: "+KeysList.at(index).first+", have value: "+theCurrentKey.currentValue);
+ }
+ #endif
+ }
+ else //or if not found load the default value and set into the file
+ {
+ theCurrentKey.currentValue=theCurrentKey.defaultValue;
+ //to switch default value if is unchanged
+ //settings->setValue(KeysList.at(index).first,theCurrentKey.defaultValue);
+ }
+ if(settings->status()!=QSettings::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ ResourcesManager::resourcesManager->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ }
+ GroupKeysList[groupName][KeysList.at(index).first]=theCurrentKey;
+ index++;
+ }
+ //if the backend is file, leave into the group
+ if(currentBackend==File)
+ settings->endGroup();
+ return true;
+}
+
+/// \brief To remove option group to options, remove the widget need be do into the calling object
+bool OptionEngine::removeOptionGroup(const std::string &groupName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start, groupName: "+groupName);
+ if(GroupKeysList.erase(groupName)!=1)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName);
+ return false;
+}
+
+/// \brief To get option value
+std::string OptionEngine::getOptionValue(const std::string &groupName,const std::string &variableName) const
+{
+ if(GroupKeysList.find(groupName)!=GroupKeysList.cend())
+ {
+ const std::unordered_map<std::string,OptionEngineGroupKey> &optionEngineGroupKey=GroupKeysList.at(groupName);
+ if(optionEngineGroupKey.find(variableName)!=optionEngineGroupKey.cend())
+ return optionEngineGroupKey.at(variableName).currentValue;
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2")
+ .arg(QString::fromStdString(groupName))
+ .arg(QString::fromStdString(variableName))
+ );
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
+ return std::string();
+ }
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2").arg(QString::fromStdString(groupName)).arg(QString::fromStdString(variableName)));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QString("The variable was not found: %1 %2")
+ .arg(QString::fromStdString(groupName))
+ .arg(QString::fromStdString(variableName))
+ .toStdString()
+ );
+ //return default value
+ return std::string();
+}
+
+/// \brief To set option value
+void OptionEngine::setOptionValue(const std::string &groupName,const std::string &variableName,const std::string &value)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value+"\"");
+
+ if(GroupKeysList.find(groupName)!=GroupKeysList.cend())
+ {
+ const std::unordered_map<std::string,OptionEngineGroupKey> &group=GroupKeysList.at(groupName);
+ if(group.find(variableName)!=group.cend())
+ {
+ //prevent re-write the same value into the variable
+ if(group.at(variableName).currentValue==value)
+ return;
+ //write ONLY the new value
+ GroupKeysList[groupName][variableName].currentValue=value;
+ if(currentBackend==File)
+ {
+ settings->beginGroup(QString::fromStdString(groupName));
+ settings->setValue(QString::fromStdString(variableName),QString::fromStdString(value));
+ settings->endGroup();
+ if(settings->status()!=QSettings::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ ResourcesManager::resourcesManager->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ }
+ emit newOptionValue(groupName,variableName,value);
+ return;
+ }
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2").arg(QString::fromStdString(groupName)).arg(QString::fromStdString(variableName)));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
+ return;
+ }
+ QMessageBox::critical(NULL,"Internal error",tr("The variable was not found: %1 %2").arg(QString::fromStdString(groupName)).arg(QString::fromStdString(variableName)));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"The variable was not found: "+groupName+" "+variableName);
+}
+
+//the reset of right value of widget need be do into the calling object
+void OptionEngine::internal_resetToDefaultValue()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+
+ for(auto& n:GroupKeysList)
+ {
+ const std::string &firstKey=n.first;
+ for(auto& m:n.second)
+ {
+ const std::string &secondKey=m.first;
+ OptionEngineGroupKey &o=m.second;
+ if(o.currentValue!=o.defaultValue)
+ {
+ o.currentValue=o.defaultValue;
+ emit newOptionValue(firstKey,secondKey,o.currentValue);
+ }
+ }
+ }
+}
+
+void OptionEngine::queryResetOptions()
+{
+ emit resetOptions();
+}