diff --git a/kcms/componentchooser/CMakeLists.txt b/kcms/componentchooser/CMakeLists.txt --- a/kcms/componentchooser/CMakeLists.txt +++ b/kcms/componentchooser/CMakeLists.txt @@ -15,6 +15,7 @@ componentchooserterminal.cpp kcm_componentchooser.cpp ) +kconfig_add_kcfg_files(kcm_componentchooser_SRCS browser_settings.kcfgc GENERATE_MOC) ki18n_wrap_ui(kcm_componentchooser_SRCS browserconfig_ui.ui @@ -46,4 +47,5 @@ ########### install files ############### install( FILES componentchooser.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} ) +install(FILES browser_settings.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR}) diff --git a/kcms/componentchooser/browser_settings.kcfg b/kcms/componentchooser/browser_settings.kcfg new file mode 100644 --- /dev/null +++ b/kcms/componentchooser/browser_settings.kcfg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/kcms/componentchooser/browser_settings.kcfgc b/kcms/componentchooser/browser_settings.kcfgc new file mode 100644 --- /dev/null +++ b/kcms/componentchooser/browser_settings.kcfgc @@ -0,0 +1,5 @@ +File=browser_settings.kcfg +ClassName=BrowserSettings +Mutators=true +DefaultValueGetters=true +GenerateProperties=true diff --git a/kcms/componentchooser/componentchooser.h b/kcms/componentchooser/componentchooser.h --- a/kcms/componentchooser/componentchooser.h +++ b/kcms/componentchooser/componentchooser.h @@ -39,6 +39,9 @@ virtual void load(KConfig *cfg)=0; virtual void save(KConfig *cfg)=0; virtual void defaults()=0; + virtual bool isDefaults() const { + return false; + }; }; class CfgComponent: public QWidget, public Ui::ComponentConfig_UI, public CfgPlugin @@ -58,6 +61,7 @@ void slotComponentChanged(const QString&); Q_SIGNALS: void changed(bool); + void defaulted(bool); }; class ComponentChooser : public QWidget, public Ui::ComponentChooser_UI @@ -87,6 +91,7 @@ Q_SIGNALS: void changed(bool); + void defaulted(bool); }; diff --git a/kcms/componentchooser/componentchooser.cpp b/kcms/componentchooser/componentchooser.cpp --- a/kcms/componentchooser/componentchooser.cpp +++ b/kcms/componentchooser/componentchooser.cpp @@ -189,8 +189,10 @@ configWidget = configWidgetMap.value(service); if (configWidget) { - configContainer->setCurrentWidget(configWidget); - dynamic_cast(configWidget)->load(&cfg); + configContainer->setCurrentWidget(configWidget); + const auto plugin = dynamic_cast(configWidget); + plugin->load(&cfg); + emit defaulted(plugin->isDefaults()); } emitChanged(false); @@ -201,6 +203,9 @@ void ComponentChooser::emitChanged(bool val) { somethingChanged=val; emit changed(val); + + CfgPlugin * plugin = dynamic_cast( configWidget ); + emit defaulted(plugin->isDefaults()); } diff --git a/kcms/componentchooser/componentchooserbrowser.h b/kcms/componentchooser/componentchooserbrowser.h --- a/kcms/componentchooser/componentchooserbrowser.h +++ b/kcms/componentchooser/componentchooserbrowser.h @@ -28,6 +28,7 @@ void load(KConfig *cfg) override; void save(KConfig *cfg) override; void defaults() override; + bool isDefaults() const override; protected Q_SLOTS: void selectBrowser(); diff --git a/kcms/componentchooser/componentchooserbrowser.cpp b/kcms/componentchooser/componentchooserbrowser.cpp --- a/kcms/componentchooser/componentchooserbrowser.cpp +++ b/kcms/componentchooser/componentchooserbrowser.cpp @@ -15,7 +15,7 @@ #include "componentchooserbrowser.h" #include -#include +#include "browser_settings.h" #include #include @@ -52,18 +52,38 @@ void CfgBrowser::configChanged() { - emit changed(true); + bool hasChanged = false; + const BrowserSettings settings; + const QString exec = settings.browserApplication(); + + if (exec.isEmpty()) { + hasChanged |= !radioKIO->isChecked(); + } else { + if (exec.startsWith('!')) { + hasChanged |= lineExec->text() != exec; + } else { + hasChanged |= KService::serviceByStorageId(lineExec->text()) != KService::serviceByStorageId( exec ); + } + } + + emit changed(hasChanged); } void CfgBrowser::defaults() { - load(nullptr); + emit changed(!radioKIO->isChecked()); + radioKIO->setChecked(true); +} + +bool CfgBrowser::isDefaults() const +{ + return radioKIO->isChecked(); } void CfgBrowser::load(KConfig *) { - const KConfigGroup config(KSharedConfig::openConfig(QStringLiteral("kdeglobals")), QStringLiteral("General") ); - const QString exec = config.readPathEntry( QStringLiteral("BrowserApplication"), QString() ); + const BrowserSettings settings; + const QString exec = settings.browserApplication(); if (exec.isEmpty()) { radioKIO->setChecked(true); m_browserExec = exec; @@ -87,8 +107,9 @@ browserCombo->clear(); - const auto &browsers = KServiceTypeTrader::self()->query(QStringLiteral("Application"), - QStringLiteral("'WebBrowser' in Categories")); + const auto constraint = QStringLiteral("'WebBrowser' in Categories and" + " ('x-scheme-handler/http' in ServiceTypes or 'x-scheme-handler/https' in ServiceTypes)"); + const auto &browsers = KServiceTypeTrader::self()->query(QStringLiteral("Application"), constraint); for (const auto &service : browsers) { browserCombo->addItem(QIcon::fromTheme(service->icon()), service->name(), service->storageId()); @@ -103,8 +124,7 @@ void CfgBrowser::save(KConfig *) { - KSharedConfig::Ptr profile = KSharedConfig::openConfig(QStringLiteral("kdeglobals")); - KConfigGroup config(profile, QStringLiteral("General")); + BrowserSettings settings; QString exec; if (radioService->isChecked()) { if (m_browserService) { @@ -118,8 +138,8 @@ exec = '!' + exec; // Literal command } } - config.writePathEntry( QStringLiteral("BrowserApplication"), exec); // KConfig::Normal|KConfig::Global - config.sync(); + settings.setBrowserApplication(exec); + settings.save(); // Save the default browser as scheme handler for http(s) in mimeapps.list KSharedConfig::Ptr mimeAppList = KSharedConfig::openConfig(QStringLiteral("mimeapps.list"), KConfig::NoGlobals, QStandardPaths::GenericConfigLocation); diff --git a/kcms/componentchooser/componentchooserfilemanager.h b/kcms/componentchooser/componentchooserfilemanager.h --- a/kcms/componentchooser/componentchooserfilemanager.h +++ b/kcms/componentchooser/componentchooserfilemanager.h @@ -33,6 +33,7 @@ void load(KConfig *cfg) override; void save(KConfig *cfg) override; void defaults() override; + bool isDefaults() const override; protected Q_SLOTS: void slotAddFileManager(); @@ -42,7 +43,7 @@ void changed(bool); private: - QList mDynamicWidgets; + QList mDynamicRadioButtons; }; #endif diff --git a/kcms/componentchooser/componentchooserfilemanager.cpp b/kcms/componentchooser/componentchooserfilemanager.cpp --- a/kcms/componentchooser/componentchooserfilemanager.cpp +++ b/kcms/componentchooser/componentchooserfilemanager.cpp @@ -50,46 +50,52 @@ load(nullptr); } +bool CfgFileManager::isDefaults() const +{ + if (!mDynamicRadioButtons.isEmpty()) { + return !mDynamicRadioButtons.first()->isChecked(); + } else { + return false; + } +} + static KService::List appOffers() { return KMimeTypeTrader::self()->query(QStringLiteral("inode/directory"), QStringLiteral("Application")); } void CfgFileManager::load(KConfig *) { - qDeleteAll(mDynamicWidgets); - mDynamicWidgets.clear(); + qDeleteAll(mDynamicRadioButtons); + mDynamicRadioButtons.clear(); const KService::List apps = appOffers(); bool first = true; - Q_FOREACH(const KService::Ptr& service, apps) - { - QRadioButton* button = new QRadioButton(service->name(), this); + for (const KService::Ptr &service : apps) { + QRadioButton *button = new QRadioButton(service->name(), this); connect(button, &QRadioButton::toggled, this, &CfgFileManager::configChanged); button->setProperty("storageId", service->storageId()); radioLayout->addWidget(button); if (first) { button->setChecked(true); first = false; } - mDynamicWidgets << button; + mDynamicRadioButtons << button; } emit changed(false); } static const char s_DefaultApplications[] = "Default Applications"; static const char s_AddedAssociations[] = "Added Associations"; -static const char s_RemovedAssociations[] = "Removed Associations"; void CfgFileManager::save(KConfig *) { QString storageId; - Q_FOREACH(QRadioButton* button, qFindChildren(this)) { + for (QRadioButton *button : qAsConst(mDynamicRadioButtons)) { if (button->isChecked()) { storageId = button->property("storageId").toString(); } } - qDebug() << storageId; if (!storageId.isEmpty()) { // This is taken from filetypes/mimetypedata.cpp KSharedConfig::Ptr profile = KSharedConfig::openConfig(QStringLiteral("mimeapps.list"), KConfig::NoGlobals, QStandardPaths::GenericConfigLocation); @@ -106,25 +112,8 @@ KConfigGroup defaultApp(profile, s_DefaultApplications); defaultApp.writeXdgListEntry(mime, QStringList(storageId)); - Kdelibs4SharedConfig::syncConfigGroup(QLatin1String("Added Associations"), QStringLiteral("mimeapps.list")); - profile->sync(); - // Clean out any kde-mimeapps.list which would take precedence any cancel our changes. - // (also taken from filetypes/mimetypedata.cpp) - const QString desktops = QString::fromLocal8Bit(qgetenv("XDG_CURRENT_DESKTOP")); - foreach (const QString &desktop, desktops.split(":", QString::SkipEmptyParts)) { - const QString file = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) - + QLatin1Char('/') + desktop.toLower() + QLatin1String("-mimeapps.list"); - if (QFileInfo::exists(file)) { - qDebug() << "Cleaning up" << file; - KConfig conf(file, KConfig::NoGlobals); - KConfigGroup(&conf, s_DefaultApplications).deleteEntry(mime); - KConfigGroup(&conf, s_AddedAssociations).deleteEntry(mime); - KConfigGroup(&conf, s_RemovedAssociations).deleteEntry(mime); - } - } - KBuildSycocaProgressDialog::rebuildKSycoca(this); } diff --git a/kcms/componentchooser/componentchooserterminal.h b/kcms/componentchooser/componentchooserterminal.h --- a/kcms/componentchooser/componentchooserterminal.h +++ b/kcms/componentchooser/componentchooserterminal.h @@ -30,6 +30,7 @@ void load(KConfig *cfg) override; void save(KConfig *cfg) override; void defaults() override; + bool isDefaults() const override; protected Q_SLOTS: void selectTerminalApp(); diff --git a/kcms/componentchooser/kcm_componentchooser.cpp b/kcms/componentchooser/kcm_componentchooser.cpp --- a/kcms/componentchooser/kcm_componentchooser.cpp +++ b/kcms/componentchooser/kcm_componentchooser.cpp @@ -37,7 +37,7 @@ m_chooser=new ComponentChooser(this); lay->addWidget(m_chooser); connect(m_chooser,SIGNAL(changed(bool)),this,SIGNAL(changed(bool))); - setButtons( Default|Apply|Help ); + connect(m_chooser, &ComponentChooser::defaulted, this, &KCModule::defaulted); KAboutData *about = new KAboutData( QStringLiteral("kcmcomponentchooser"), i18n("Component Chooser"), QStringLiteral("1.0"),