Add `getSettings()` to streamline settings locations in my apps

* Keep handling for old location of settings file
* Add handling to allow portable settings (see
  https://github.com/Martchus/tageditor/issues/88)
This commit is contained in:
Martchus 2022-08-20 16:16:40 +02:00
parent d08ce3781d
commit e3e2d24aeb
2 changed files with 35 additions and 0 deletions

View File

@ -326,6 +326,38 @@ void setupCommonQtApplicationAttributes()
#endif
}
/*!
* \brief Returns the settings object for the specified \a organization and \a application.
* \remarks
* - This function always uses INI as that's what I'd like to use in all of my applications consistently, regardless of the platform.
* - The parameter \a application might be empty. In fact, most of my applications use just `getSettings(QStringLiteral(PROJECT_NAME))`.
* - This function first checks whether a file called `$organization/$application.ini` exists in the current working directory (or just
* `$organization.ini` if \a application is empty) and uses that if it exists. That allows having a portable installation.
* - Some of my apps where using values from QCoreApplication for \a organization and \a application in the beginning. This function
* moves those old config files to their new location if needed. This extra handling will likely removed at some point. Note that
* I moved away from using values from QCoreApplication to avoid having spaces and additional config suffixes in the file name.
*/
std::unique_ptr<QSettings> getSettings(const QString &organization, const QString &application)
{
auto settings = std::unique_ptr<QSettings>();
if (const auto portableFile
= QFile(application.isEmpty() ? organization + QStringLiteral(".ini") : organization % QChar('/') % application % QStringLiteral(".ini"));
portableFile.exists()) {
settings = std::make_unique<QSettings>(portableFile.fileName(), QSettings::IniFormat);
} else {
settings = std::make_unique<QSettings>(QSettings::IniFormat, QSettings::UserScope, organization, application);
// move config created by older versions to new location
if (organization != QCoreApplication::organizationName() || application != QCoreApplication::applicationName()) {
const auto oldConfig
= QSettings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName())
.fileName();
QFile::rename(oldConfig, settings->fileName()) || QFile::remove(oldConfig);
}
}
settings->sync();
return settings;
}
// namespace ApplicationInstances
} // namespace QtUtilities

View File

@ -3,10 +3,12 @@
#include "../global.h"
#include <QString>
#include <QtContainerFwd>
#include <QtGlobal>
#include <initializer_list>
#include <memory>
QT_FORWARD_DECLARE_CLASS(QString)
QT_FORWARD_DECLARE_CLASS(QSettings)
@ -65,6 +67,7 @@ QT_UTILITIES_EXPORT bool hasCoreApp();
} // namespace ApplicationInstances
QT_UTILITIES_EXPORT void setupCommonQtApplicationAttributes();
QT_UTILITIES_EXPORT std::unique_ptr<QSettings> getSettings(const QString &organization, const QString &application = QString());
} // namespace QtUtilities