From 3757aa3f532c943f8a47e997d0a4f250d9dacdd3 Mon Sep 17 00:00:00 2001
From: isanae <14251494+isanae@users.noreply.github.com>
Date: Mon, 2 Sep 2019 15:07:35 -0400
Subject: split into settingsutilities
---
src/settings.cpp | 452 +------------------------------------------------------
1 file changed, 1 insertion(+), 451 deletions(-)
(limited to 'src/settings.cpp')
diff --git a/src/settings.cpp b/src/settings.cpp
index 8b063efb..14189be3 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -18,6 +18,7 @@ along with Mod Organizer. If not, see .
*/
#include "settings.h"
+#include "settingsutilities.h"
#include "serverinfo.h"
#include "executableslist.h"
#include "appconfig.h"
@@ -27,310 +28,6 @@ along with Mod Organizer. If not, see .
using namespace MOBase;
-template
-struct ValueConverter
-{
- static const T& convert(const T& t)
- {
- return t;
- }
-};
-
-template
-struct ValueConverter>>
-{
- static QString convert(const T& t)
- {
- return QString("%1").arg(static_cast>(t));
- }
-};
-
-
-template
-void logChange(
- const QString& displayName, std::optional oldValue, const T& newValue)
-{
- using VC = ValueConverter;
-
- if (oldValue) {
- log::debug(
- "setting '{}' changed from '{}' to '{}'",
- displayName, VC::convert(*oldValue), VC::convert(newValue));
- } else {
- log::debug(
- "setting '{}' set to '{}'",
- displayName, VC::convert(newValue));
- }
-}
-
-void logRemoval(const QString& name)
-{
- log::debug("setting '{}' removed", name);
-}
-
-
-QString settingName(const QString& section, const QString& key)
-{
- if (section.isEmpty()) {
- return key;
- } else if (key.isEmpty()) {
- return section;
- } else {
- if (section.compare("General", Qt::CaseInsensitive) == 0) {
- return key;
- } else {
- return section + "/" + key;
- }
- }
-}
-
-template
-void setImpl(
- QSettings& settings, const QString& displayName,
- const QString& section, const QString& key, const T& value)
-{
- const auto current = getOptional(settings, section, key);
-
- if (current && *current == value) {
- // no change
- return;
- }
-
- const auto name = settingName(section, key);
-
- logChange(displayName, current, value);
-
- if constexpr (std::is_enum_v) {
- settings.setValue(
- name, static_cast>(value));
- } else {
- settings.setValue(name, value);
- }
-}
-
-void removeImpl(
- QSettings& settings, const QString& displayName,
- const QString& section, const QString& key)
-{
- if (key.isEmpty()) {
- if (!settings.childGroups().contains(section, Qt::CaseInsensitive)) {
- // not there
- return;
- }
- } else {
- if (!settings.contains(settingName(section, key))) {
- // not there
- return;
- }
- }
-
- logRemoval(displayName);
- settings.remove(settingName(section, key));
-}
-
-
-template
-std::optional getOptional(
- const QSettings& settings,
- const QString& section, const QString& key, std::optional def={})
-{
- if (settings.contains(settingName(section, key))) {
- const auto v = settings.value(settingName(section, key));
-
- if constexpr (std::is_enum_v) {
- return static_cast(v.value>());
- } else {
- return v.value();
- }
- }
-
- return def;
-}
-
-template
-T get(
- const QSettings& settings,
- const QString& section, const QString& key, T def)
-{
- if (auto v=getOptional(settings, section, key)) {
- return *v;
- } else {
- return def;
- }
-}
-
-template
-void set(
- QSettings& settings,
- const QString& section, const QString& key, const T& value)
-{
- setImpl(settings, settingName(section, key), section, key, value);
-}
-
-void remove(QSettings& settings, const QString& section, const QString& key)
-{
- removeImpl(settings, settingName(section, key), section, key);
-}
-
-void removeSection(QSettings& settings, const QString& section)
-{
- removeImpl(settings, section, section, "");
-}
-
-
-class ScopedGroup
-{
-public:
- ScopedGroup(QSettings& s, const QString& name)
- : m_settings(s), m_name(name)
- {
- m_settings.beginGroup(m_name);
- }
-
- ~ScopedGroup()
- {
- m_settings.endGroup();
- }
-
- ScopedGroup(const ScopedGroup&) = delete;
- ScopedGroup& operator=(const ScopedGroup&) = delete;
-
- template
- void set(const QString& key, const T& value)
- {
- setImpl(m_settings, settingName(m_name, key), "", key, value);
- }
-
- void remove(const QString& key)
- {
- removeImpl(m_settings, settingName(m_name, key), "", key);
- }
-
- QStringList keys() const
- {
- return m_settings.childKeys();
- }
-
- template
- void for_each(F&& f) const
- {
- for (const QString& key : keys()) {
- f(key);
- }
- }
-
- template
- std::optional getOptional(const QString& key, std::optional def={}) const
- {
- return ::getOptional(m_settings, "", key, def);
- }
-
- template
- T get(const QString& key, T def={}) const
- {
- return ::get(m_settings, "", key, def);
- }
-
-private:
- QSettings& m_settings;
- QString m_name;
-};
-
-
-class ScopedReadArray
-{
-public:
- ScopedReadArray(QSettings& s, const QString& section)
- : m_settings(s), m_count(0)
- {
- m_count = m_settings.beginReadArray(section);
- }
-
- ~ScopedReadArray()
- {
- m_settings.endArray();
- }
-
- ScopedReadArray(const ScopedReadArray&) = delete;
- ScopedReadArray& operator=(const ScopedReadArray&) = delete;
-
- template
- void for_each(F&& f) const
- {
- for (int i=0; i
- std::optional getOptional(const QString& key, std::optional def={}) const
- {
- return ::getOptional(m_settings, "", key, def);
- }
-
- template
- T get(const QString& key, T def={}) const
- {
- return ::get(m_settings, "", key, def);
- }
-
- int count() const
- {
- return m_count;
- }
-
- QStringList keys() const
- {
- return m_settings.childKeys();
- }
-
-private:
- QSettings& m_settings;
- int m_count;
-};
-
-
-class ScopedWriteArray
-{
-public:
- ScopedWriteArray(QSettings& s, const QString& section)
- : m_settings(s), m_section(section), m_i(0)
- {
- m_settings.beginWriteArray(section);
- }
-
- ~ScopedWriteArray()
- {
- m_settings.endArray();
- }
-
- ScopedWriteArray(const ScopedWriteArray&) = delete;
- ScopedWriteArray& operator=(const ScopedWriteArray&) = delete;
-
- void next()
- {
- m_settings.setArrayIndex(m_i);
- ++m_i;
- }
-
- template
- void set(const QString& key, const T& value)
- {
- const auto displayName = QString("%1/%2\\%3")
- .arg(m_section)
- .arg(m_i)
- .arg(key);
-
- setImpl(m_settings, displayName, "", key, value);
- }
-
-private:
- QSettings& m_settings;
- QString m_section;
- int m_i;
-};
-
EndorsementState endorsementStateFromString(const QString& s)
{
@@ -360,153 +57,6 @@ QString toString(EndorsementState s)
}
-QString widgetNameWithTopLevel(const QWidget* widget)
-{
- QStringList components;
-
- auto* tl = widget->window();
-
- if (tl == widget) {
- // this is a top level widget, such as a dialog
- components.push_back(widget->objectName());
- } else {
- // this is a widget
- const auto toplevelName = tl->objectName();
- if (!toplevelName.isEmpty()) {
- components.push_back(toplevelName);
- }
-
- const auto widgetName = widget->objectName();
- if (!widgetName.isEmpty()) {
- components.push_back(widgetName);
- }
- }
-
- if (components.isEmpty()) {
- // can't do much
- return "unknown_widget";
- }
-
- return components.join("_");
-}
-
-QString widgetName(const QMainWindow* w)
-{
- return w->objectName();
-}
-
-QString widgetName(const QHeaderView* w)
-{
- return widgetNameWithTopLevel(w->parentWidget());
-}
-
-QString widgetName(const ExpanderWidget* w)
-{
- return widgetNameWithTopLevel(w->button());
-}
-
-QString widgetName(const QWidget* w)
-{
- return widgetNameWithTopLevel(w);
-}
-
-template
-QString geoSettingName(const Widget* widget)
-{
- return widgetName(widget) + "_geometry";
-}
-
-template
-QString stateSettingName(const Widget* widget)
-{
- return widgetName(widget) + "_state";
-}
-
-template
-QString visibilitySettingName(const Widget* widget)
-{
- return widgetName(widget) + "_visibility";
-}
-
-QString dockSettingName(const QDockWidget* dock)
-{
- return "MainWindow_docks_" + dock->objectName() + "_size";
-}
-
-QString indexSettingName(const QWidget* widget)
-{
- return widgetNameWithTopLevel(widget) + "_index";
-}
-
-QString checkedSettingName(const QAbstractButton* b)
-{
- return widgetNameWithTopLevel(b) + "_checked";
-}
-
-void warnIfNotCheckable(const QAbstractButton* b)
-{
- if (!b->isCheckable()) {
- log::warn(
- "button '{}' used in the settings as a checkbox or radio button "
- "but is not checkable", b->objectName());
- }
-}
-
-
-bool setWindowsCredential(const QString key, const QString data)
-{
- QString finalKey("ModOrganizer2_" + key);
- wchar_t* keyData = new wchar_t[finalKey.size()+1];
- finalKey.toWCharArray(keyData);
- keyData[finalKey.size()] = L'\0';
- bool result = false;
- if (data.isEmpty()) {
- result = CredDeleteW(keyData, CRED_TYPE_GENERIC, 0);
- if (!result)
- if (GetLastError() == ERROR_NOT_FOUND)
- result = true;
- } else {
- wchar_t* charData = new wchar_t[data.size()];
- data.toWCharArray(charData);
-
- CREDENTIALW cred = {};
- cred.Flags = 0;
- cred.Type = CRED_TYPE_GENERIC;
- cred.TargetName = keyData;
- cred.CredentialBlob = (LPBYTE)charData;
- cred.CredentialBlobSize = sizeof(wchar_t) * data.size();
- cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
-
- result = CredWriteW(&cred, 0);
- delete[] charData;
- }
- delete[] keyData;
- return result;
-}
-
-QString getWindowsCredential(const QString key)
-{
- QString result;
- QString finalKey("ModOrganizer2_" + key);
- wchar_t* keyData = new wchar_t[finalKey.size()+1];
- finalKey.toWCharArray(keyData);
- keyData[finalKey.size()] = L'\0';
- PCREDENTIALW creds;
- if (CredReadW(keyData, 1, 0, &creds)) {
- wchar_t *charData = (wchar_t *)creds->CredentialBlob;
- result = QString::fromWCharArray(charData, creds->CredentialBlobSize / sizeof(wchar_t));
- CredFree(creds);
- } else {
- const auto e = GetLastError();
- if (e != ERROR_NOT_FOUND) {
- log::error("Retrieving encrypted data failed: {}", formatSystemMessage(e));
- }
- }
- delete[] keyData;
- return result;
-}
-
-
Settings *Settings::s_Instance = nullptr;
Settings::Settings(const QString& path) :
--
cgit v1.3.1