[ConfirmationsSettingsPage] behaviourOnLaunch setting needs a tri-state
Closed, ResolvedPublic

Description

KRun accepts the following values:

  • "alwaysAsk"
  • "execute"
  • "open"

but currently is not possible to choose between "execute" and "open".

See also https://bugs.kde.org/show_bug.cgi?id=371837#c7

elvisangelaccio triaged this task as Normal priority.
elvisangelaccio renamed this task from [ConfirmationsSettingsPage] behaviourOnLaunch settings needs a tri-state to [ConfirmationsSettingsPage] behaviourOnLaunch setting needs a tri-state.

https://git.reviewboard.kde.org/r/129383/ had a patch for this but it never got merged. Copying the diff here in case anyone wants to take over:

diff --git a/src/settings/general/behaviorsettingspage.h b/src/settings/general/behaviorsettingspage.h
index 96eaf3d..51e4107 100644
--- a/src/settings/general/behaviorsettingspage.h
+++ b/src/settings/general/behaviorsettingspage.h
@@ -49,6 +49,8 @@ private:
     void loadSettings();
     void setSortingChoiceValue(GeneralSettings* settings);
     void loadSortingChoiceSettings();
+    void setScriptsChoiceValue();
+    void loadScriptsChoiceSettings();
 
 private:
     QUrl m_url;
@@ -64,6 +66,10 @@ private:
     QRadioButton* m_caseSensitiveSorting;
     QRadioButton* m_caseInsensitiveSorting;
 
+    QRadioButton* m_openScripts;
+    QRadioButton* m_executeScripts;
+    QRadioButton* m_alwaysAskScripts;
+
     QCheckBox* m_renameInline;
     QCheckBox* m_useTabForSplitViewSwitch;
 };
diff --git a/src/settings/general/behaviorsettingspage.cpp b/src/settings/general/behaviorsettingspage.cpp
index 6d1e8bb..4af3c9f 100644
--- a/src/settings/general/behaviorsettingspage.cpp
+++ b/src/settings/general/behaviorsettingspage.cpp
@@ -70,6 +70,19 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) :
     sortingPropsLayout->addWidget(m_caseInsensitiveSorting);
     sortingPropsLayout->addWidget(m_caseSensitiveSorting);
 
+    // Executable script properties
+    QGroupBox* scriptsPropsBox = new QGroupBox(i18nc("@title:group", "Behavior for executable scripts and desktop files in all KDE applications"), this);
+    scriptsPropsBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+
+    m_alwaysAskScripts = new QRadioButton(i18nc("option:radio", "Always Ask"), scriptsPropsBox);
+    m_openScripts = new QRadioButton(i18nc("option:radio", "Open"), scriptsPropsBox);
+    m_executeScripts = new QRadioButton(i18nc("option:radio", "Execute"), scriptsPropsBox);
+
+    QVBoxLayout* scriptsPropsLayout = new QVBoxLayout(scriptsPropsBox);
+    scriptsPropsLayout->addWidget(m_alwaysAskScripts);
+    scriptsPropsLayout->addWidget(m_openScripts);
+    scriptsPropsLayout->addWidget(m_executeScripts);
+
     // 'Show tooltips'
     m_showToolTips = new QCheckBox(i18nc("@option:check", "Show tooltips"), this);
 
@@ -84,6 +97,7 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) :
 
     topLayout->addWidget(viewPropsBox);
     topLayout->addWidget(sortingPropsBox);
+    topLayout->addWidget(scriptsPropsBox);
     topLayout->addWidget(m_showToolTips);
     topLayout->addWidget(m_showSelectionToggle);
     topLayout->addWidget(m_renameInline);
@@ -99,6 +113,9 @@ BehaviorSettingsPage::BehaviorSettingsPage(const QUrl& url, QWidget* parent) :
     connect(m_naturalSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed);
     connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed);
     connect(m_caseSensitiveSorting, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed);
+    connect(m_alwaysAskScripts, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed);
+    connect(m_openScripts, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed);
+    connect(m_executeScripts, &QRadioButton::toggled, this, &BehaviorSettingsPage::changed);
     connect(m_renameInline, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed);
     connect(m_useTabForSplitViewSwitch, &QCheckBox::toggled, this, &BehaviorSettingsPage::changed);
 }
@@ -117,6 +134,7 @@ void BehaviorSettingsPage::applySettings()
     settings->setShowToolTips(m_showToolTips->isChecked());
     settings->setShowSelectionToggle(m_showSelectionToggle->isChecked());
     setSortingChoiceValue(settings);
+    setScriptsChoiceValue();
     settings->setRenameInline(m_renameInline->isChecked());
     settings->setUseTabForSwitchingSplitView(m_useTabForSplitViewSwitch->isChecked());
     settings->save();
@@ -135,6 +153,9 @@ void BehaviorSettingsPage::restoreDefaults()
 {
     GeneralSettings* settings = GeneralSettings::self();
     settings->useDefaults(true);
+    KSharedConfig::Ptr kioConfig = KSharedConfig::openConfig(QStringLiteral("kiorc"), KConfig::IncludeGlobals);
+    KConfigGroup scriptExecutionGroup(kioConfig, "Executable scripts");
+    scriptExecutionGroup.writeEntry("behaviourOnLaunch", "alwaysAsk");
     loadSettings();
     settings->useDefaults(false);
 }
@@ -151,6 +172,7 @@ void BehaviorSettingsPage::loadSettings()
     m_useTabForSplitViewSwitch->setChecked(GeneralSettings::useTabForSwitchingSplitView());
 
     loadSortingChoiceSettings();
+    loadScriptsChoiceSettings();
 }
 
 void BehaviorSettingsPage::setSortingChoiceValue(GeneralSettings *settings)
@@ -182,3 +204,26 @@ void BehaviorSettingsPage::loadSortingChoiceSettings()
         Q_UNREACHABLE();
     }
 }
+
+void BehaviorSettingsPage::setScriptsChoiceValue()
+{
+    KSharedConfig::Ptr kioConfig = KSharedConfig::openConfig(QStringLiteral("kiorc"), KConfig::IncludeGlobals);
+    KConfigGroup scriptExecutionGroup(kioConfig, "Executable scripts");
+    if (m_alwaysAskScripts->isChecked()) {
+        scriptExecutionGroup.writeEntry("behaviourOnLaunch", "alwaysAsk");
+    } else if (m_openScripts->isChecked()) {
+        scriptExecutionGroup.writeEntry("behaviourOnLaunch", "open");
+    } else if (m_executeScripts->isChecked()) {
+        scriptExecutionGroup.writeEntry("behaviourOnLaunch", "execute");
+    }
+    scriptExecutionGroup.sync();
+}
+
+void BehaviorSettingsPage::loadScriptsChoiceSettings()
+{
+    const KConfigGroup scriptExecutionGroup(KSharedConfig::openConfig(QStringLiteral("kiorc")), "Executable scripts");
+    const QString value = scriptExecutionGroup.readEntry("behaviourOnLaunch", "alwaysAsk");
+    m_alwaysAskScripts->setChecked(value == QLatin1String("alwaysAsk"));
+    m_openScripts->setChecked(value == QLatin1String("open"));
+    m_executeScripts->setChecked(value == QLatin1String("execute"));
+}
diff --git a/src/settings/general/confirmationssettingspage.h b/src/settings/general/confirmationssettingspage.h
index e702fe8..f365143 100644
--- a/src/settings/general/confirmationssettingspage.h
+++ b/src/settings/general/confirmationssettingspage.h
@@ -47,7 +47,6 @@ private:
     QCheckBox* m_confirmMoveToTrash;
     QCheckBox* m_confirmDelete;
     QCheckBox* m_confirmClosingMultipleTabs;
-    QCheckBox* m_confirmScriptExecution;
 };
 
 #endif
diff --git a/src/settings/general/confirmationssettingspage.cpp b/src/settings/general/confirmationssettingspage.cpp
index 2419dc0..1b0640f 100644
--- a/src/settings/general/confirmationssettingspage.cpp
+++ b/src/settings/general/confirmationssettingspage.cpp
@@ -48,8 +48,6 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) :
                                                "Moving files or folders to trash"), this);
     m_confirmDelete = new QCheckBox(i18nc("@option:check Ask for confirmation when",
                                           "Deleting files or folders"), this);
-    m_confirmScriptExecution = new QCheckBox(i18nc("@option:check Ask for confirmation when",
-                                                   "Executing scripts or desktop files"), this);
 
     QLabel* confirmLabelDolphin = new QLabel(i18nc("@title:group", "Ask for confirmation when:"), this);
     confirmLabelDolphin->setWordWrap(true);
@@ -60,7 +58,6 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) :
     topLayout->addWidget(confirmLabelKde);
     topLayout->addWidget(m_confirmMoveToTrash);
     topLayout->addWidget(m_confirmDelete);
-    topLayout->addWidget(m_confirmScriptExecution);
     topLayout->addWidget(confirmLabelDolphin);
     topLayout->addWidget(m_confirmClosingMultipleTabs);
     topLayout->addStretch();
@@ -69,7 +66,6 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) :
 
     connect(m_confirmMoveToTrash, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
     connect(m_confirmDelete, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
-    connect(m_confirmScriptExecution, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
     connect(m_confirmClosingMultipleTabs, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
 }
 
@@ -85,12 +81,6 @@ void ConfirmationsSettingsPage::applySettings()
     confirmationGroup.writeEntry("ConfirmDelete", m_confirmDelete->isChecked());
     confirmationGroup.sync();
 
-    if (m_confirmScriptExecution->isChecked()) {
-        KConfigGroup scriptExecutionGroup(kioConfig, "Executable scripts");
-        scriptExecutionGroup.writeEntry("behaviourOnLaunch", "alwaysAsk");
-        scriptExecutionGroup.sync();
-    }
-
     GeneralSettings* settings = GeneralSettings::self();
     settings->setConfirmClosingMultipleTabs(m_confirmClosingMultipleTabs->isChecked());
     settings->save();
@@ -105,7 +95,6 @@ void ConfirmationsSettingsPage::restoreDefaults()
 
     m_confirmMoveToTrash->setChecked(ConfirmTrash);
     m_confirmDelete->setChecked(ConfirmDelete);
-    m_confirmScriptExecution->setChecked(ConfirmScriptExecution);
 }
 
 void ConfirmationsSettingsPage::loadSettings()
@@ -115,10 +104,6 @@ void ConfirmationsSettingsPage::loadSettings()
     m_confirmMoveToTrash->setChecked(confirmationGroup.readEntry("ConfirmTrash", ConfirmTrash));
     m_confirmDelete->setChecked(confirmationGroup.readEntry("ConfirmDelete", ConfirmDelete));
 
-    const KConfigGroup scriptExecutionGroup(KSharedConfig::openConfig(QStringLiteral("kiorc")), "Executable scripts");
-    const QString value = scriptExecutionGroup.readEntry("behaviourOnLaunch", "alwaysAsk");
-    m_confirmScriptExecution->setChecked(value == QLatin1String("alwaysAsk"));
-
     m_confirmClosingMultipleTabs->setChecked(GeneralSettings::confirmClosingMultipleTabs());
 }

I can look into that.

ngraham claimed this task.Dec 6 2019, 5:00 PM
ngraham closed this task as Resolved.

Should be fully completed with D24247.