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() { + 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() 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() +{ + 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 contraints = 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"), contraints); 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/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"),