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:
		@@ -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();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user