summaryrefslogtreecommitdiff
path: root/OptionEngine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'OptionEngine.cpp')
-rw-r--r--OptionEngine.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/OptionEngine.cpp b/OptionEngine.cpp
new file mode 100644
index 0000000..807e027
--- /dev/null
+++ b/OptionEngine.cpp
@@ -0,0 +1,271 @@
+/** \file OptionEngine.cpp
+\brief Define the class of the event dispatcher
+\author alpha_one_x86
+\version 0.3
+\date 2010
+\licence GPL3, see the file COPYING */
+
+#include <QFileInfo>
+#include <QDir>
+#include <QPluginLoader>
+#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()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //locate the settings
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ resources=ResourcesManager::getInstance();
+ QString settingsFilePath=resources->getWritablePath();
+ if(settingsFilePath!="")
+ settings = new QSettings(settingsFilePath+"Ultracopier.conf",QSettings::IniFormat);
+ else
+ settings = NULL;
+ #else // ULTRACOPIER_VERSION_PORTABLE
+ settings = new QSettings("Ultracopier","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("test","test");
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ else
+ {
+ settings->remove("test");
+ if(settings->status()!=QSettings::NoError)
+ {
+ delete settings;
+ settings=NULL;
+ }
+ }
+ }
+ }
+ //set the backend
+ if(settings==NULL)
+ {
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ resources->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ else
+ currentBackend=File;
+}
+
+/// \brief Destroy the option
+OptionEngine::~OptionEngine()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ ResourcesManager::destroyInstanceAtTheLastCall();
+}
+
+/// \brief To add option group to options
+bool OptionEngine::addOptionGroup(const QString &groupName,const QList<QPair<QString, QVariant> > &KeysList)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start(\""+groupName+"\",[...])");
+ //search if previous with the same name exists
+ indexGroup=0;
+ loop_size=GroupKeysList.size();
+ while(indexGroup<loop_size)
+ {
+ if(GroupKeysList.at(indexGroup).groupName==groupName)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"group already used previously");
+ break;
+ }
+ indexGroup++;
+ }
+ //else create the entry
+ if(indexGroup==loop_size)
+ {
+ OptionEngineGroup tempEntry;
+ tempEntry.groupName=groupName;
+ GroupKeysList << tempEntry;
+ }
+ //here GroupKeysList.at(indexGroup) can be used
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"variable used: GroupKeysList.at("+QString::number(indexGroup)+")");
+ //if the backend is file, enter into the group
+ if(currentBackend==File)
+ settings->beginGroup(groupName);
+ //browse all key, and append it to the key
+ index=0;
+ QList<OptionEngineGroupKey> KeyListTemp;
+ loop_size=KeysList.size();
+ while(index<loop_size)
+ {
+ OptionEngineGroupKey theCurrentKey;
+ theCurrentKey.variableName=KeysList.at(index).first;
+ theCurrentKey.defaultValue=KeysList.at(index).second;
+ theCurrentKey.emptyList=false;
+ //if memory backend, load the default value into the current value
+ if(currentBackend==Memory)
+ theCurrentKey.currentValue=theCurrentKey.defaultValue;
+ else if(settings->contains(theCurrentKey.variableName))//if file backend, load the default value from the file
+ theCurrentKey.currentValue=settings->value(theCurrentKey.variableName);
+ 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(theCurrentKey.variableName,theCurrentKey.defaultValue);
+ }
+ if(settings->status()!=QSettings::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ resources->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ GroupKeysList[indexGroup].KeysList << 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 QString &groupName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, groupName: "+groupName);
+ indexGroup=0;
+ loop_size=GroupKeysList.size();
+ while(indexGroup<loop_size)
+ {
+ if(GroupKeysList.at(indexGroup).groupName==groupName)
+ {
+ GroupKeysList.removeAt(indexGroup);
+ return true;
+ }
+ indexGroup++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName);
+ return false;
+}
+
+/// \brief To get option value
+QVariant OptionEngine::getOptionValue(const QString &groupName,const QString &variableName)
+{
+ indexGroup=0;
+ loop_size=GroupKeysList.size();
+ while(indexGroup<loop_size)
+ {
+ if(GroupKeysList.at(indexGroup).groupName==groupName)
+ {
+ //search if previous with the same name exists
+ indexGroupKey=0;
+ loop_sub_size=GroupKeysList.at(indexGroup).KeysList.size();
+ while(indexGroupKey<loop_sub_size)
+ {
+ if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).variableName==variableName)
+ return GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).currentValue;
+ indexGroupKey++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
+ return QVariant();
+ }
+ indexGroup++;
+ }
+ QMessageBox::critical(NULL,"Internal error","Get the option value but not found");
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"group \""+groupName+"\" not found, internal bug!");
+ //return default value
+ return QVariant();
+}
+
+/// \brief To set option value
+void OptionEngine::setOptionValue(const QString &groupName,const QString &variableName,const QVariant &value)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value.toString()+"\"");
+ indexGroup=0;
+ loop_size=GroupKeysList.size();
+ while(indexGroup<loop_size)
+ {
+ if(GroupKeysList.at(indexGroup).groupName==groupName)
+ {
+ //search if previous with the same name exists
+ indexGroupKey=0;
+ loop_sub_size=GroupKeysList.at(indexGroup).KeysList.size();
+ while(indexGroupKey<loop_sub_size)
+ {
+ if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).variableName==variableName)
+ {
+ if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).currentValue!=value) //protection to prevent same value writing
+ {
+ GroupKeysList[indexGroup].KeysList[indexGroupKey].currentValue=value;
+ if(currentBackend==File)
+ {
+ settings->beginGroup(groupName);
+ settings->setValue(variableName,value);
+ settings->endGroup();
+ if(settings->status()!=QSettings::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ resources->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
+ }
+ emit newOptionValue(groupName,variableName,value);
+ }
+ return;
+ }
+ indexGroupKey++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"value not found, internal bug, groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value.toString()+"\"");
+ return;
+ }
+ indexGroup++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"group \""+groupName+"\" not found, internal bug, groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value.toString()+"\"");
+}
+
+//the reset of right value of widget need be do into the calling object
+void OptionEngine::internal_resetToDefaultValue()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ int indexGroup=0;
+ while(indexGroup<GroupKeysList.size())
+ {
+ //search if previous with the same name exists
+ int indexGroupKey=0;
+ while(indexGroupKey<GroupKeysList.at(indexGroup).KeysList.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"option check: "+GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).variableName);
+ if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).currentValue!=GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).defaultValue)
+ GroupKeysList[indexGroup].KeysList[indexGroupKey].currentValue=GroupKeysList[indexGroup].KeysList[indexGroupKey].defaultValue;
+ indexGroupKey++;
+ }
+ indexGroup++;
+ }
+}
+
+void OptionEngine::queryResetOptions()
+{
+ emit resetOptions();
+}