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