Implemented caching for settings model.
This commit is contained in:
parent
78d1bf5773
commit
822e1e1ffb
@ -34,7 +34,7 @@
|
|||||||
#define VER_LAMEXP_MINOR_LO 8
|
#define VER_LAMEXP_MINOR_LO 8
|
||||||
#define VER_LAMEXP_TYPE Beta
|
#define VER_LAMEXP_TYPE Beta
|
||||||
#define VER_LAMEXP_PATCH 1
|
#define VER_LAMEXP_PATCH 1
|
||||||
#define VER_LAMEXP_BUILD 1316
|
#define VER_LAMEXP_BUILD 1318
|
||||||
#define VER_LAMEXP_CONFG 1288
|
#define VER_LAMEXP_CONFG 1288
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1714,7 +1714,7 @@ void MainWindow::encodeButtonClicked(void)
|
|||||||
writeTest.remove();
|
writeTest.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_accepted = true;
|
m_accepted = true;
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
@ -174,6 +174,9 @@ static int lamexp_main(int argc, char* argv[])
|
|||||||
iResult = QApplication::instance()->exec();
|
iResult = QApplication::instance()->exec();
|
||||||
bAccepted = poMainWindow->isAccepted();
|
bAccepted = poMainWindow->isAccepted();
|
||||||
|
|
||||||
|
//Sync settings
|
||||||
|
settingsModel->syncNow();
|
||||||
|
|
||||||
//Show processing dialog
|
//Show processing dialog
|
||||||
if(bAccepted && (fileListModel->rowCount() > 0))
|
if(bAccepted && (fileListModel->rowCount() > 0))
|
||||||
{
|
{
|
||||||
|
@ -35,30 +35,33 @@
|
|||||||
#include <QReadWriteLock>
|
#include <QReadWriteLock>
|
||||||
#include <QReadLocker>
|
#include <QReadLocker>
|
||||||
#include <QWriteLocker>
|
#include <QWriteLocker>
|
||||||
|
#include <QHash>
|
||||||
|
#include <QMutex>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
//Macros
|
//Macros
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#define LAMEXP_MAKE_OPTION_I(OPT,DEF) \
|
#define LAMEXP_MAKE_OPTION_I(OPT,DEF) \
|
||||||
int SettingsModel::OPT(void) const { return m_settings->value(g_settingsId_##OPT, DEF).toInt(); } \
|
int SettingsModel::OPT(void) const { return loadValue(g_settingsId_##OPT, (DEF)).toInt(); } \
|
||||||
void SettingsModel::OPT(int value) { m_settings->setValue(g_settingsId_##OPT, value); } \
|
void SettingsModel::OPT(int value) { storeValue(g_settingsId_##OPT, value); } \
|
||||||
int SettingsModel::OPT##Default(void) { return DEF; }
|
int SettingsModel::OPT##Default(void) { return (DEF); }
|
||||||
|
|
||||||
#define LAMEXP_MAKE_OPTION_S(OPT,DEF) \
|
#define LAMEXP_MAKE_OPTION_S(OPT,DEF) \
|
||||||
QString SettingsModel::OPT(void) const { return m_settings->value(g_settingsId_##OPT, DEF).toString().trimmed(); } \
|
QString SettingsModel::OPT(void) const { return loadValue(g_settingsId_##OPT, (DEF)).toString().trimmed(); } \
|
||||||
void SettingsModel::OPT(const QString &value) { m_settings->setValue(g_settingsId_##OPT, value); } \
|
void SettingsModel::OPT(const QString &value) { storeValue(g_settingsId_##OPT, value); } \
|
||||||
QString SettingsModel::OPT##Default(void) { return DEF; }
|
QString SettingsModel::OPT##Default(void) { return (DEF); }
|
||||||
|
|
||||||
#define LAMEXP_MAKE_OPTION_B(OPT,DEF) \
|
#define LAMEXP_MAKE_OPTION_B(OPT,DEF) \
|
||||||
bool SettingsModel::OPT(void) const { return m_settings->value(g_settingsId_##OPT, DEF).toBool(); } \
|
bool SettingsModel::OPT(void) const { return loadValue(g_settingsId_##OPT, (DEF)).toBool(); } \
|
||||||
void SettingsModel::OPT(bool value) { m_settings->setValue(g_settingsId_##OPT, value); } \
|
void SettingsModel::OPT(bool value) { storeValue(g_settingsId_##OPT, value); } \
|
||||||
bool SettingsModel::OPT##Default(void) { return DEF; }
|
bool SettingsModel::OPT##Default(void) { return (DEF); }
|
||||||
|
|
||||||
#define LAMEXP_MAKE_OPTION_U(OPT,DEF) \
|
#define LAMEXP_MAKE_OPTION_U(OPT,DEF) \
|
||||||
unsigned int SettingsModel::OPT(void) const { return m_settings->value(g_settingsId_##OPT, DEF).toUInt(); } \
|
unsigned int SettingsModel::OPT(void) const { return loadValue(g_settingsId_##OPT, (DEF)).toUInt(); } \
|
||||||
void SettingsModel::OPT(unsigned int value) { m_settings->setValue(g_settingsId_##OPT, value); } \
|
void SettingsModel::OPT(unsigned int value) { storeValue(g_settingsId_##OPT, value); } \
|
||||||
unsigned int SettingsModel::OPT##Default(void) { return DEF; }
|
unsigned int SettingsModel::OPT##Default(void) { return (DEF); }
|
||||||
|
|
||||||
#define LAMEXP_MAKE_ID(DEC,STR) static const char *g_settingsId_##DEC = STR
|
#define LAMEXP_MAKE_ID(DEC,STR) static const char *g_settingsId_##DEC = STR
|
||||||
#define REMOVE_GROUP(OBJ,ID) OBJ->beginGroup(ID); OBJ->remove(""); OBJ->endGroup();
|
#define REMOVE_GROUP(OBJ,ID) OBJ->beginGroup(ID); OBJ->remove(""); OBJ->endGroup();
|
||||||
@ -191,10 +194,17 @@ SettingsModel::SettingsModel(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Create the cache
|
||||||
|
m_cache = new QHash<QString, QVariant>();
|
||||||
|
m_cacheLock = new QMutex();
|
||||||
|
m_cacheDirty = new QSet<QString>();
|
||||||
|
|
||||||
|
//Create settings
|
||||||
m_settings = new QSettings(configPath, QSettings::IniFormat);
|
m_settings = new QSettings(configPath, QSettings::IniFormat);
|
||||||
const QString groupKey = QString().sprintf("LameXP_%u%02u%05u", lamexp_version_major(), lamexp_version_minor(), lamexp_version_confg());
|
const QString groupKey = QString().sprintf("LameXP_%u%02u%05u", lamexp_version_major(), lamexp_version_minor(), lamexp_version_confg());
|
||||||
QStringList childGroups = m_settings->childGroups();
|
QStringList childGroups = m_settings->childGroups();
|
||||||
|
|
||||||
|
//Clean-up settings
|
||||||
while(!childGroups.isEmpty())
|
while(!childGroups.isEmpty())
|
||||||
{
|
{
|
||||||
QString current = childGroups.takeFirst();
|
QString current = childGroups.takeFirst();
|
||||||
@ -212,6 +222,7 @@ SettingsModel::SettingsModel(void)
|
|||||||
REMOVE_GROUP(m_settings, current);
|
REMOVE_GROUP(m_settings, current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Setup settings
|
||||||
m_settings->beginGroup(groupKey);
|
m_settings->beginGroup(groupKey);
|
||||||
m_settings->setValue(g_settingsId_versionNumber, QApplication::applicationVersion());
|
m_settings->setValue(g_settingsId_versionNumber, QApplication::applicationVersion());
|
||||||
m_settings->sync();
|
m_settings->sync();
|
||||||
@ -223,6 +234,11 @@ SettingsModel::SettingsModel(void)
|
|||||||
|
|
||||||
SettingsModel::~SettingsModel(void)
|
SettingsModel::~SettingsModel(void)
|
||||||
{
|
{
|
||||||
|
flushValues();
|
||||||
|
|
||||||
|
LAMEXP_DELETE(m_cache);
|
||||||
|
LAMEXP_DELETE(m_cacheDirty);
|
||||||
|
LAMEXP_DELETE(m_cacheLock);
|
||||||
LAMEXP_DELETE(m_settings);
|
LAMEXP_DELETE(m_settings);
|
||||||
LAMEXP_DELETE(m_defaultLanguage);
|
LAMEXP_DELETE(m_defaultLanguage);
|
||||||
}
|
}
|
||||||
@ -313,7 +329,7 @@ void SettingsModel::validate(void)
|
|||||||
|
|
||||||
void SettingsModel::syncNow(void)
|
void SettingsModel::syncNow(void)
|
||||||
{
|
{
|
||||||
m_settings->sync();
|
flushValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
@ -422,6 +438,61 @@ QString SettingsModel::initDirectory(const QString &path) const
|
|||||||
return QDir(path).canonicalPath();
|
return QDir(path).canonicalPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Cache support
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void SettingsModel::storeValue(const QString &key, const QVariant &value)
|
||||||
|
{
|
||||||
|
QMutexLocker lock(m_cacheLock);
|
||||||
|
|
||||||
|
if(!m_cache->contains(key))
|
||||||
|
{
|
||||||
|
m_cache->insert(key, value);
|
||||||
|
m_cacheDirty->insert(key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(m_cache->value(key) != value)
|
||||||
|
{
|
||||||
|
m_cache->insert(key, value);
|
||||||
|
m_cacheDirty->insert(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant SettingsModel::loadValue(const QString &key, const QVariant &defaultValue) const
|
||||||
|
{
|
||||||
|
QMutexLocker lock(m_cacheLock);
|
||||||
|
|
||||||
|
if(!m_cache->contains(key))
|
||||||
|
{
|
||||||
|
const QVariant storedValue = m_settings->value(key, defaultValue);
|
||||||
|
m_cache->insert(key, storedValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_cache->value(key, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingsModel::flushValues(void)
|
||||||
|
{
|
||||||
|
QMutexLocker lock(m_cacheLock);
|
||||||
|
|
||||||
|
if(!m_cacheDirty->isEmpty())
|
||||||
|
{
|
||||||
|
QHash<QString, QVariant>::ConstIterator iter;
|
||||||
|
for(iter = m_cache->constBegin(); iter != m_cache->constEnd(); iter++)
|
||||||
|
{
|
||||||
|
if(m_cacheDirty->contains(iter.key()))
|
||||||
|
{
|
||||||
|
m_settings->setValue(iter.key(), iter.value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_settings->sync();
|
||||||
|
m_cacheDirty->clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
// Getter and Setter
|
// Getter and Setter
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
@ -23,6 +23,11 @@
|
|||||||
|
|
||||||
class QSettings;
|
class QSettings;
|
||||||
class QString;
|
class QString;
|
||||||
|
class QVariant;
|
||||||
|
class QMutex;
|
||||||
|
|
||||||
|
template<class K, class V> class QHash;
|
||||||
|
template<class T> class QSet;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ -169,7 +174,16 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QSettings *m_settings;
|
QSettings *m_settings;
|
||||||
|
QHash<QString, QVariant> *m_cache;
|
||||||
|
QSet<QString> *m_cacheDirty;
|
||||||
|
QMutex *m_cacheLock;
|
||||||
|
|
||||||
static QString *m_defaultLanguage;
|
static QString *m_defaultLanguage;
|
||||||
|
|
||||||
|
inline void storeValue(const QString &key, const QVariant &value);
|
||||||
|
inline QVariant loadValue(const QString &key, const QVariant &defaultValue) const;
|
||||||
|
inline void flushValues(void);
|
||||||
|
|
||||||
QString initDirectory(const QString &path) const;
|
QString initDirectory(const QString &path) const;
|
||||||
QString defaultLanguage(void) const;
|
QString defaultLanguage(void) const;
|
||||||
QString defaultDirectory(void) const;
|
QString defaultDirectory(void) const;
|
||||||
|
Loading…
Reference in New Issue
Block a user