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 <marcus.tillmanns@qt.io>
This commit is contained in:
hjk
2023-07-24 18:10:10 +02:00
parent 355e8d133c
commit d31416a5f5
2 changed files with 57 additions and 14 deletions

View File

@@ -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

View File

@@ -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<BaseAspect::Data::Ptr> 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();