diff --git a/kcmkwin/common/effectmodel.h b/kcmkwin/common/effectmodel.h --- a/kcmkwin/common/effectmodel.h +++ b/kcmkwin/common/effectmodel.h @@ -159,12 +159,23 @@ **/ void updateEffectStatus(const QModelIndex &rowIndex, Status effectState); + /** + * This enum type is used to specify load options. + **/ + enum class LoadOptions { + None, + /** + * Do not discard unsaved changes when reloading the model. + **/ + KeepDirty + }; + /** * Loads effects. * * You have to call this method in order to populate the model. **/ - void load(); + void load(LoadOptions options = LoadOptions::None); /** * Saves status of each modified effect. diff --git a/kcmkwin/common/effectmodel.cpp b/kcmkwin/common/effectmodel.cpp --- a/kcmkwin/common/effectmodel.cpp +++ b/kcmkwin/common/effectmodel.cpp @@ -387,18 +387,38 @@ } } -void EffectModel::load() +void EffectModel::load(LoadOptions options) { KConfigGroup kwinConfig(KSharedConfig::openConfig("kwinrc"), "Plugins"); + const QVector oldEffects = m_effectsList; + beginResetModel(); m_effectsChanged.clear(); m_effectsList.clear(); const KPluginInfo::List configs = KPluginTrader::self()->query(QStringLiteral("kwin/effects/configs/")); loadBuiltInEffects(kwinConfig, configs); loadJavascriptEffects(kwinConfig); loadPluginEffects(kwinConfig, configs); + if (options == LoadOptions::KeepDirty) { + for (const EffectData &oldEffect : oldEffects) { + if (!oldEffect.changed) { + continue; + } + auto effectIt = std::find_if(m_effectsList.begin(), m_effectsList.end(), + [serviceName = oldEffect.serviceName](const EffectData &data) { + return data.serviceName == serviceName; + } + ); + if (effectIt == m_effectsList.end()) { + continue; + } + effectIt->effectStatus = oldEffect.effectStatus; + effectIt->changed = effectIt->effectStatus != effectIt->originalStatus; + } + } + qSort(m_effectsList.begin(), m_effectsList.end(), [](const EffectData &a, const EffectData &b) { if (a.category == b.category) { if (a.exclusiveGroup == b.exclusiveGroup) { @@ -461,7 +481,7 @@ QStringLiteral("/Effects"), QDBusConnection::sessionBus()); for (int it = 0; it < m_effectsList.size(); it++) { - if (m_effectsList.at(it).effectStatus == m_effectsChanged.at(it).effectStatus) { + if (!m_effectsList.at(it).changed) { continue; } if (m_effectsList.at(it).effectStatus != Status::Disabled) { diff --git a/kcmkwin/kwineffects/kcm.cpp b/kcmkwin/kwineffects/kcm.cpp --- a/kcmkwin/kwineffects/kcm.cpp +++ b/kcmkwin/kwineffects/kcm.cpp @@ -93,7 +93,7 @@ if (dialog->exec() == QDialog::Accepted) { if (!dialog->changedEntries().isEmpty()) { - m_model->load(); + m_model->load(EffectModel::LoadOptions::KeepDirty); } }