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"),