diff --git a/kcms/kded/kcmkded.h b/kcms/kded/kcmkded.h --- a/kcms/kded/kcmkded.h +++ b/kcms/kded/kcmkded.h @@ -52,8 +52,9 @@ void slotItemChecked(QTreeWidgetItem *item, int column); void getServiceStatus(); - bool autoloadEnabled(KConfig *config, const KPluginMetaData &filename); - void setAutoloadEnabled(KConfig *config, const KPluginMetaData &filename, bool b); + bool autoloadEnabled(KConfig *config, const KPluginMetaData &filename); + void setAutoloadEnabled(KConfig *config, const KPluginMetaData &filename, bool b); + bool autoloadIsImmutable(KConfig *config, const KPluginMetaData &module); private: QTreeWidget *_lvLoD; @@ -63,6 +64,8 @@ QString RUNNING; QString NOT_RUNNING; + + bool isDirty() const; }; #endif // KCMKDED_H diff --git a/kcms/kded/kcmkded.cpp b/kcms/kded/kcmkded.cpp --- a/kcms/kded/kcmkded.cpp +++ b/kcms/kded/kcmkded.cpp @@ -71,6 +71,7 @@ static const int LibraryRole = Qt::UserRole + 1; +static const int StartupUseSavedRole = Qt::UserRole + 2; KDEDConfig::KDEDConfig(QWidget* parent, const QVariantList &) : KCModule( parent ) @@ -166,6 +167,12 @@ return cg.readEntry("autoload", true); } +bool KDEDConfig::autoloadIsImmutable(KConfig *config, const KPluginMetaData &module) +{ + KConfigGroup cg(config, setModuleGroup(module)); + return cg.isEntryImmutable("autoload"); +} + void KDEDConfig::setAutoloadEnabled(KConfig *config, const KPluginMetaData &module, bool b) { KConfigGroup cg(config, setModuleGroup(module)); @@ -237,6 +244,11 @@ treeitem->setText(StartupDescription, mod.description()); treeitem->setText(StartupStatus, NOT_RUNNING); treeitem->setData(StartupService, LibraryRole, dbusModuleName); + if (autoloadIsImmutable(&kdedrc, mod)) { + auto flags = treeitem->flags(); + treeitem->setFlags(flags ^ Qt::ItemIsEnabled); + } + treeitem->setData(StartupUse, StartupUseSavedRole, autoloadEnabled(&kdedrc, mod)); _lvStartup->addTopLevelItem(treeitem); } else if (isModuleLoadedOnDemand(mod)) { @@ -280,7 +292,9 @@ QTreeWidgetItem *treeitem = _lvStartup->topLevelItem(i); if ( treeitem->data(StartupService, LibraryRole ).toString() == libraryName) { // we found a match, now compare and see what changed - setAutoloadEnabled(&kdedrc, mod, treeitem->checkState( StartupUse ) == Qt::Checked); + bool autoloadEnabled = treeitem->checkState( StartupUse ) == Qt::Checked; + setAutoloadEnabled(&kdedrc, mod, autoloadEnabled); + treeitem->setData(StartupUse, StartupUseSavedRole, autoloadEnabled); break; } } @@ -301,15 +315,31 @@ int count = _lvStartup->topLevelItemCount(); for( int i = 0; i < count; ++i ) { - _lvStartup->topLevelItem( i )->setCheckState( StartupUse, Qt::Checked ); + if (_lvStartup->topLevelItem( i )->flags() & Qt::ItemIsEnabled) { + _lvStartup->topLevelItem( i )->setCheckState( StartupUse, Qt::Checked ); + } } getServiceStatus(); - emit changed(true); + emit changed(isDirty()); } +bool KDEDConfig::isDirty() const +{ + bool dirty = false; + int count = _lvStartup->topLevelItemCount(); + for( int i = 0; i < count; ++i ) { + bool currentState = _lvStartup->topLevelItem(i)->checkState( StartupUse ) == Qt::Checked; + bool savedState = _lvStartup->topLevelItem(i)->data(StartupUse, StartupUseSavedRole).toBool(); + if (currentState != savedState) { + dirty = true; + } + } + return dirty; +} + void KDEDConfig::getServiceStatus() { QStringList modules; @@ -494,11 +524,11 @@ } } -void KDEDConfig::slotItemChecked(QTreeWidgetItem*, int column) +void KDEDConfig::slotItemChecked(QTreeWidgetItem* item, int column) { // We only listen to changes the user did. if (column==StartupUse) { - emit changed(true); + emit changed(isDirty()); } }