diff --git a/kcms/desktoptheme/kcm.h b/kcms/desktoptheme/kcm.h --- a/kcms/desktoptheme/kcm.h +++ b/kcms/desktoptheme/kcm.h @@ -45,9 +45,8 @@ class KCMDesktopTheme : public KQuickAddons::ConfigModule { Q_OBJECT + Q_PROPERTY(DesktopThemeSettings *desktopThemeSettings READ desktopThemeSettings CONSTANT) Q_PROPERTY(QStandardItemModel *desktopThemeModel READ desktopThemeModel CONSTANT) - Q_PROPERTY(QString selectedPlugin READ selectedPlugin WRITE setSelectedPlugin NOTIFY selectedPluginChanged) - Q_PROPERTY(int selectedPluginIndex READ selectedPluginIndex NOTIFY selectedPluginIndexChanged) Q_PROPERTY(bool downloadingFile READ downloadingFile NOTIFY downloadingFileChanged) Q_PROPERTY(bool canEditThemes READ canEditThemes CONSTANT) @@ -64,11 +63,10 @@ KCMDesktopTheme(QObject *parent, const QVariantList &args); ~KCMDesktopTheme() override; + DesktopThemeSettings *desktopThemeSettings() const; QStandardItemModel *desktopThemeModel() const; - QString selectedPlugin() const; - void setSelectedPlugin(const QString &plugin); - int selectedPluginIndex() const; + Q_INVOKABLE int pluginIndex(const QString &pluginName) const; bool downloadingFile() const; @@ -84,8 +82,6 @@ Q_INVOKABLE void editTheme(const QString &themeName); Q_SIGNALS: - void selectedPluginChanged(const QString &plugin); - void selectedPluginIndexChanged(); void downloadingFileChanged(); void showSuccessMessage(const QString &message); @@ -106,7 +102,7 @@ DesktopThemeSettings *m_settings; QStandardItemModel *m_model; - QString m_selectedPlugin; + QString m_currentTheme; QStringList m_pendingRemoval; QHash m_themes; bool m_haveThemeExplorerInstalled; diff --git a/kcms/desktoptheme/kcm.cpp b/kcms/desktoptheme/kcm.cpp --- a/kcms/desktoptheme/kcm.cpp +++ b/kcms/desktoptheme/kcm.cpp @@ -56,6 +56,13 @@ { // Unfortunately doesn't generate a ctor taking the parent as parameter m_settings->setParent(this); + m_currentTheme = m_settings->name(); + connect(m_settings, &DesktopThemeSettings::configChanged, + this, &KCMDesktopTheme::updateNeedsSave); + connect(m_settings, &DesktopThemeSettings::nameChanged, + this, &KCMDesktopTheme::updateNeedsSave); + + qmlRegisterType(); qmlRegisterType(); KAboutData* about = new KAboutData(QStringLiteral("kcm_desktoptheme"), i18n("Plasma Style"), @@ -80,30 +87,19 @@ { } -QStandardItemModel *KCMDesktopTheme::desktopThemeModel() const +DesktopThemeSettings *KCMDesktopTheme::desktopThemeSettings() const { - return m_model; + return m_settings; } -QString KCMDesktopTheme::selectedPlugin() const -{ - return m_selectedPlugin; -} - -void KCMDesktopTheme::setSelectedPlugin(const QString &plugin) +QStandardItemModel *KCMDesktopTheme::desktopThemeModel() const { - if (m_selectedPlugin == plugin) { - return; - } - m_selectedPlugin = plugin; - emit selectedPluginChanged(m_selectedPlugin); - emit selectedPluginIndexChanged(); - updateNeedsSave(); + return m_model; } -int KCMDesktopTheme::selectedPluginIndex() const +int KCMDesktopTheme::pluginIndex(const QString &pluginName) const { - const auto results = m_model->match(m_model->index(0, 0), PluginNameRole, m_selectedPlugin); + const auto results = m_model->match(m_model->index(0, 0), PluginNameRole, pluginName); if (results.count() == 1) { return results.first().row(); } @@ -122,13 +118,11 @@ m_model->setData(idx, pending, PendingDeletionRole); - if (pending && selectedPluginIndex() == index) { + if (pending && pluginIndex(m_settings->name()) == index) { // move to the next non-pending theme const auto nonPending = m_model->match(idx, PendingDeletionRole, false); - setSelectedPlugin(nonPending.first().data(PluginNameRole).toString()); + m_settings->setName(nonPending.first().data(PluginNameRole).toString()); } - - updateNeedsSave(); } void KCMDesktopTheme::getNewStuff(QQuickItem *ctx) @@ -284,28 +278,26 @@ m_model->setSortRole(ThemeNameRole); // FIXME the model should really be just using Qt::DisplayRole m_model->sort(0 /*column*/); - setSelectedPlugin(m_settings->name()); + m_settings->load(); + m_currentTheme = m_settings->name(); - emit selectedPluginIndexChanged(); - - updateNeedsSave(); + // Model has been cleared so pretend the theme name changed to force view update + emit m_settings->nameChanged(); } void KCMDesktopTheme::save() { - if (m_settings->name() != m_selectedPlugin) { - m_settings->setName(m_selectedPlugin); - m_settings->save(); - Plasma::Theme().setThemeName(m_settings->name()); - } - + m_settings->save(); + m_currentTheme = m_settings->name(); + Plasma::Theme().setThemeName(m_settings->name()); processPendingDeletions(); updateNeedsSave(); } void KCMDesktopTheme::defaults() { - setSelectedPlugin(m_settings->defaultNameValue()); + m_settings->setDefaults(); + m_currentTheme = m_settings->name(); // can this be done more elegantly? const auto pendingDeletions = m_model->match(m_model->index(0, 0), PendingDeletionRole, true); @@ -327,7 +319,7 @@ void KCMDesktopTheme::updateNeedsSave() { setNeedsSave(!m_model->match(m_model->index(0, 0), PendingDeletionRole, true).isEmpty() - || m_selectedPlugin != m_settings->name()); + || m_currentTheme != m_settings->name()); } void KCMDesktopTheme::processPendingDeletions() @@ -346,7 +338,7 @@ const QString pluginName = idx.data(PluginNameRole).toString(); const QString displayName = idx.data(Qt::DisplayRole).toString(); - Q_ASSERT(pluginName != m_selectedPlugin); + Q_ASSERT(pluginName != m_settings->name()); const QStringList arguments = {QStringLiteral("-t"), QStringLiteral("theme"), QStringLiteral("-r"), pluginName}; diff --git a/kcms/desktoptheme/package/contents/ui/main.qml b/kcms/desktoptheme/package/contents/ui/main.qml --- a/kcms/desktoptheme/package/contents/ui/main.qml +++ b/kcms/desktoptheme/package/contents/ui/main.qml @@ -2,6 +2,7 @@ Copyright (c) 2014 Marco Martin Copyright (c) 2016 David Rosca Copyright (c) 2018 Kai Uwe Broulik + Copyright (c) 2019 Kevin Ottens This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -30,7 +31,7 @@ KCM.ConfigModule.quickHelp: i18n("This module lets you choose the Plasma style.") view.model: kcm.desktopThemeModel - view.currentIndex: kcm.selectedPluginIndex + view.currentIndex: kcm.pluginIndex(kcm.desktopThemeSettings.name) enabled: !kcm.downloadingFile @@ -86,7 +87,7 @@ ] onClicked: { - kcm.selectedPlugin = model.pluginName; + kcm.desktopThemeSettings.name = model.pluginName; view.forceActiveFocus(); } }