GH-992 Add a transaction/locking mechanism to settings objects

This can cut the FTB loading by ~66% - worth it, but not ideal.
Real solution will have to be implemented later.
This commit is contained in:
Petr Mrázek
2015-05-23 16:07:47 +02:00
parent 0e0ddf5494
commit ce99fabe13
14 changed files with 102 additions and 41 deletions

View File

@ -33,6 +33,20 @@ bool INISettingsObject::reload()
return m_ini.loadFile(m_filePath) && SettingsObject::reload();
}
void INISettingsObject::suspendSave()
{
m_suspendSave = true;
}
void INISettingsObject::resumeSave()
{
m_suspendSave = false;
if(m_doSave)
{
m_ini.saveFile(m_filePath);
}
}
void INISettingsObject::changeSetting(const Setting &setting, QVariant value)
{
if (contains(setting.id()))
@ -51,6 +65,18 @@ void INISettingsObject::changeSetting(const Setting &setting, QVariant value)
for(auto iter: setting.configKeys())
m_ini.remove(iter);
}
doSave();
}
}
void INISettingsObject::doSave()
{
if(m_suspendSave)
{
m_doSave = true;
}
else
{
m_ini.saveFile(m_filePath);
}
}
@ -62,7 +88,7 @@ void INISettingsObject::resetSetting(const Setting &setting)
{
for(auto iter: setting.configKeys())
m_ini.remove(iter);
m_ini.saveFile(m_filePath);
doSave();
}
}

View File

@ -47,15 +47,18 @@ public:
bool reload() override;
protected
slots:
void suspendSave();
void resumeSave();
protected slots:
virtual void changeSetting(const Setting &setting, QVariant value);
virtual void resetSetting(const Setting &setting);
protected:
virtual QVariant retrieveValue(const Setting &setting);
void doSave();
protected:
INIFile m_ini;
QString m_filePath;
};

View File

@ -22,6 +22,9 @@
#include <memory>
class Setting;
class SettingsObject;
typedef std::shared_ptr<SettingsObject> SettingsObjectPtr;
/*!
* \brief The SettingsObject handles communicating settings between the application and a
@ -38,6 +41,22 @@ class Setting;
class SettingsObject : public QObject
{
Q_OBJECT
public:
class Lock
{
public:
Lock(SettingsObjectPtr locked)
:m_locked(locked)
{
m_locked->suspendSave();
}
~Lock()
{
m_locked->resumeSave();
}
private:
SettingsObjectPtr m_locked;
};
public:
explicit SettingsObject(QObject *parent = 0);
virtual ~SettingsObject();
@ -127,6 +146,8 @@ public:
*/
virtual bool reload();
virtual void suspendSave() = 0;
virtual void resumeSave() = 0;
signals:
/*!
* \brief Signal emitted when one of this SettingsObject object's settings changes.
@ -184,6 +205,7 @@ protected:
private:
QMap<QString, std::shared_ptr<Setting>> m_settings;
protected:
bool m_suspendSave = false;
bool m_doSave = false;
};
typedef std::shared_ptr<SettingsObject> SettingsObjectPtr;