From d31416a5f5005f51973a0f5f0d36ba66d012deaa Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 24 Jul 2023 18:10:10 +0200 Subject: [PATCH] Utils: Introduce a way to immediate force aspect value saving Will be used for e.g. valgrinds error categories. These are handled by actions in a menu outside the settings page mechanism. Change-Id: I2dea9b9f13dbc92fa3e9938f85aa083d01d0d99b Reviewed-by: Marcus Tillmanns --- src/libs/utils/aspects.cpp | 55 ++++++++++++++++++++++++++++---------- src/libs/utils/aspects.h | 16 +++++++++++ 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 91cc020cdeb..ff7806bd84f 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -412,6 +412,22 @@ void BaseAspect::setSettingsKey(const QString &group, const QString &key) d->m_settingsKey = group + "/" + key; } +/*! + Immediately writes the value of this aspect into its specified + settings, taking a potential container's settings group specification + into account. + + \note This is expensive, so it should only be used with good reason. +*/ +void BaseAspect::writeToSettingsImmediatly() const +{ + QStringList groups; + if (d->m_container) + groups = d->m_container->settingsGroups(); + const SettingsGroupNester nester(groups); + writeSettings(); +} + /*! Returns the string that should be used when this action appears in menus or other places that are typically used with Book style capitalization. @@ -2344,28 +2360,16 @@ void AspectContainer::toMap(QVariantMap &map) const void AspectContainer::readSettings() { - QTC_ASSERT(theSettings, return); - for (const QString &group : d->m_settingsGroup) - theSettings->beginGroup(group); - + const SettingsGroupNester nester(d->m_settingsGroup); for (BaseAspect *aspect : std::as_const(d->m_items)) aspect->readSettings(); - - for (int i = 0; i != d->m_settingsGroup.size(); ++i) - theSettings->endGroup(); } void AspectContainer::writeSettings() const { - QTC_ASSERT(theSettings, return); - for (const QString &group : d->m_settingsGroup) - theSettings->beginGroup(group); - + const SettingsGroupNester nester(d->m_settingsGroup); for (BaseAspect *aspect : std::as_const(d->m_items)) aspect->writeSettings(); - - for (int i = 0; i != d->m_settingsGroup.size(); ++i) - theSettings->endGroup(); } void AspectContainer::setSettingsGroup(const QString &groupKey) @@ -2378,6 +2382,11 @@ void AspectContainer::setSettingsGroups(const QString &groupKey, const QString & d->m_settingsGroup = QStringList{groupKey, subGroupKey}; } +QStringList AspectContainer::settingsGroups() const +{ + return d->m_settingsGroup; +} + void AspectContainer::apply() { const bool willChange = isDirty(); @@ -2579,4 +2588,22 @@ void BaseAspect::Data::Ptr::operator=(const Ptr &other) m_data = other.m_data->clone(); } +// SettingsGroupNester + +SettingsGroupNester::SettingsGroupNester(const QStringList &groups) + : m_groupCount(groups.size()) +{ + QTC_ASSERT(theSettings, return); + for (const QString &group : groups) + theSettings->beginGroup(group); +} + +SettingsGroupNester::~SettingsGroupNester() +{ + QTC_ASSERT(theSettings, return); + for (int i = 0; i != m_groupCount; ++i) + theSettings->endGroup(); +} + + } // namespace Utils diff --git a/src/libs/utils/aspects.h b/src/libs/utils/aspects.h index 3dfd6d7aac9..e2093a2206b 100644 --- a/src/libs/utils/aspects.h +++ b/src/libs/utils/aspects.h @@ -165,6 +165,9 @@ public: static void setSettings(QSettings *settings); static QSettings *settings(); + // This is expensive. Do not use without good reason + void writeToSettingsImmediatly() const; + signals: void changed(); // "internal" void volatileValueChanged(); @@ -728,6 +731,18 @@ private: QList m_data; // Owned. }; +class QTCREATOR_UTILS_EXPORT SettingsGroupNester +{ + Q_DISABLE_COPY_MOVE(SettingsGroupNester) + +public: + explicit SettingsGroupNester(const QStringList &groups); + ~SettingsGroupNester(); + +private: + const int m_groupCount; +}; + class QTCREATOR_UTILS_EXPORT AspectContainer : public QObject { Q_OBJECT @@ -758,6 +773,7 @@ public: void setSettingsGroup(const QString &groupKey); void setSettingsGroups(const QString &groupKey, const QString &subGroupKey); + QStringList settingsGroups() const; void apply(); void cancel();