]> cloud.milkyroute.net Git - dolphin.git/blob - src/settings/interface/confirmationssettingspage.cpp
Add "Act as Administrator" toggle action
[dolphin.git] / src / settings / interface / confirmationssettingspage.cpp
1 /*
2 * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "confirmationssettingspage.h"
8
9 #include "admin/workerintegration.h"
10 #include "dolphin_generalsettings.h"
11 #include "global.h"
12
13 #include <KLocalizedString>
14 #include <KMessageBox>
15 #include <KProtocolInfo>
16
17 #include <QCheckBox>
18 #include <QComboBox>
19 #include <QFormLayout>
20 #include <QLabel>
21
22 namespace
23 {
24 enum ScriptExecution { AlwaysAsk = 0, Open = 1, Execute = 2 };
25
26 const bool ConfirmEmptyTrash = true;
27 const bool ConfirmTrash = false;
28 const bool ConfirmDelete = true;
29 const int ConfirmScriptExecution = ScriptExecution::AlwaysAsk;
30 }
31
32 ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget *parent)
33 : SettingsPageBase(parent)
34 , m_confirmMoveToTrash(nullptr)
35 , m_confirmEmptyTrash(nullptr)
36 , m_confirmDelete(nullptr)
37 ,
38
39 #if HAVE_TERMINAL
40 m_confirmClosingTerminalRunningProgram(nullptr)
41 ,
42 #endif
43
44 m_confirmClosingMultipleTabs(nullptr)
45 {
46 QFormLayout *topLayout = new QFormLayout(this);
47
48 QLabel *confirmLabelKde = new QLabel(i18nc("@title:group", "Ask for confirmation in all KDE applications when:"), this);
49 confirmLabelKde->setWordWrap(true);
50
51 m_confirmMoveToTrash = new QCheckBox(i18nc("@option:check Ask for confirmation when", "Moving files or folders to trash"), this);
52 m_confirmEmptyTrash = new QCheckBox(i18nc("@option:check Ask for confirmation when", "Emptying trash"), this);
53 m_confirmDelete = new QCheckBox(i18nc("@option:check Ask for confirmation when", "Deleting files or folders"), this);
54
55 QLabel *confirmLabelDolphin = new QLabel(i18nc("@title:group", "Ask for confirmation in Dolphin when:"), this);
56 confirmLabelDolphin->setWordWrap(true);
57
58 m_confirmClosingMultipleTabs = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Closing windows with multiple tabs"), this);
59
60 #if HAVE_TERMINAL
61 m_confirmClosingTerminalRunningProgram =
62 new QCheckBox(i18nc("@option:check Ask for confirmation when", "Closing windows with a program running in the Terminal panel"), this);
63 #endif
64
65 m_confirmOpenManyFolders = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Opening many folders at once"), this);
66 m_confirmOpenManyTerminals = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Opening many terminals at once"), this);
67 m_confirmRisksOfActingAsAdmin = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when", "Switching to act as an administrator"), this);
68
69 QLabel *executableScriptLabel = new QLabel(i18nc("@title:group", "When opening an executable file:"), this);
70 executableScriptLabel->setWordWrap(true);
71
72 m_confirmScriptExecution = new QComboBox(this);
73 m_confirmScriptExecution->addItems({i18n("Always ask"), i18n("Open in application"), i18n("Run script")});
74
75 topLayout->addRow(confirmLabelKde);
76 topLayout->addRow(nullptr, m_confirmMoveToTrash);
77 topLayout->addRow(nullptr, m_confirmEmptyTrash);
78 topLayout->addRow(nullptr, m_confirmDelete);
79
80 topLayout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed));
81 topLayout->addRow(confirmLabelDolphin);
82 topLayout->addRow(nullptr, m_confirmClosingMultipleTabs);
83
84 #if HAVE_TERMINAL
85 topLayout->addRow(nullptr, m_confirmClosingTerminalRunningProgram);
86 #endif
87
88 topLayout->addRow(nullptr, m_confirmOpenManyFolders);
89 topLayout->addRow(nullptr, m_confirmOpenManyTerminals);
90 if (KProtocolInfo::isKnownProtocol(QStringLiteral("admin"))) {
91 topLayout->addRow(nullptr, m_confirmRisksOfActingAsAdmin);
92 } else {
93 m_confirmRisksOfActingAsAdmin->hide();
94 }
95
96 topLayout->addItem(new QSpacerItem(0, Dolphin::VERTICAL_SPACER_HEIGHT, QSizePolicy::Fixed, QSizePolicy::Fixed));
97 topLayout->addRow(executableScriptLabel, m_confirmScriptExecution);
98
99 loadSettings();
100
101 connect(m_confirmMoveToTrash, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
102 connect(m_confirmEmptyTrash, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
103 connect(m_confirmDelete, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
104 connect(m_confirmScriptExecution, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ConfirmationsSettingsPage::changed);
105 connect(m_confirmClosingMultipleTabs, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
106 connect(m_confirmOpenManyFolders, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
107 connect(m_confirmOpenManyTerminals, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
108 connect(m_confirmRisksOfActingAsAdmin, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
109
110 #if HAVE_TERMINAL
111 connect(m_confirmClosingTerminalRunningProgram, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
112 #endif
113 }
114
115 ConfirmationsSettingsPage::~ConfirmationsSettingsPage()
116 {
117 }
118
119 void ConfirmationsSettingsPage::applySettings()
120 {
121 KSharedConfig::Ptr kioConfig = KSharedConfig::openConfig(QStringLiteral("kiorc"), KConfig::NoGlobals);
122 KConfigGroup confirmationGroup(kioConfig, QStringLiteral("Confirmations"));
123 confirmationGroup.writeEntry("ConfirmTrash", m_confirmMoveToTrash->isChecked());
124 confirmationGroup.writeEntry("ConfirmEmptyTrash", m_confirmEmptyTrash->isChecked());
125 confirmationGroup.writeEntry("ConfirmDelete", m_confirmDelete->isChecked());
126
127 KConfigGroup scriptExecutionGroup(kioConfig, QStringLiteral("Executable scripts"));
128 const int index = m_confirmScriptExecution->currentIndex();
129 switch (index) {
130 case ScriptExecution::AlwaysAsk:
131 scriptExecutionGroup.writeEntry("behaviourOnLaunch", "alwaysAsk");
132 break;
133 case ScriptExecution::Open:
134 scriptExecutionGroup.writeEntry("behaviourOnLaunch", "open");
135 break;
136 case ScriptExecution::Execute:
137 scriptExecutionGroup.writeEntry("behaviourOnLaunch", "execute");
138 break;
139 }
140 kioConfig->sync();
141
142 GeneralSettings *settings = GeneralSettings::self();
143 settings->setConfirmClosingMultipleTabs(m_confirmClosingMultipleTabs->isChecked());
144 settings->setConfirmOpenManyFolders(m_confirmOpenManyFolders->isChecked());
145 settings->setConfirmOpenManyTerminals(m_confirmOpenManyTerminals->isChecked());
146 if (m_confirmRisksOfActingAsAdmin->isChecked()) {
147 KMessageBox::enableMessage(Admin::warningDontShowAgainName);
148 } else {
149 KMessageBox::saveDontShowAgainContinue(Admin::warningDontShowAgainName);
150 }
151
152 #if HAVE_TERMINAL
153 settings->setConfirmClosingTerminalRunningProgram(m_confirmClosingTerminalRunningProgram->isChecked());
154 #endif
155
156 settings->save();
157 }
158
159 void ConfirmationsSettingsPage::restoreDefaults()
160 {
161 GeneralSettings *settings = GeneralSettings::self();
162 settings->useDefaults(true);
163 loadSettings();
164 settings->useDefaults(false);
165
166 m_confirmMoveToTrash->setChecked(ConfirmTrash);
167 m_confirmEmptyTrash->setChecked(ConfirmEmptyTrash);
168 m_confirmDelete->setChecked(ConfirmDelete);
169 m_confirmScriptExecution->setCurrentIndex(ConfirmScriptExecution);
170 KMessageBox::enableMessage(Admin::warningDontShowAgainName);
171 }
172
173 void ConfirmationsSettingsPage::loadSettings()
174 {
175 KSharedConfig::Ptr kioConfig = KSharedConfig::openConfig(QStringLiteral("kiorc"), KConfig::IncludeGlobals);
176 const KConfigGroup confirmationGroup(kioConfig, QStringLiteral("Confirmations"));
177 m_confirmMoveToTrash->setChecked(confirmationGroup.readEntry("ConfirmTrash", ConfirmTrash));
178 m_confirmEmptyTrash->setChecked(confirmationGroup.readEntry("ConfirmEmptyTrash", ConfirmEmptyTrash));
179 m_confirmDelete->setChecked(confirmationGroup.readEntry("ConfirmDelete", ConfirmDelete));
180
181 const KConfigGroup scriptExecutionGroup(KSharedConfig::openConfig(QStringLiteral("kiorc")), QStringLiteral("Executable scripts"));
182 const QString value = scriptExecutionGroup.readEntry("behaviourOnLaunch", "alwaysAsk");
183 if (value == QLatin1String("alwaysAsk")) {
184 m_confirmScriptExecution->setCurrentIndex(ScriptExecution::AlwaysAsk);
185 } else if (value == QLatin1String("execute")) {
186 m_confirmScriptExecution->setCurrentIndex(ScriptExecution::Execute);
187 } else /* if (value == QLatin1String("open"))*/ {
188 m_confirmScriptExecution->setCurrentIndex(ScriptExecution::Open);
189 }
190
191 m_confirmClosingMultipleTabs->setChecked(GeneralSettings::confirmClosingMultipleTabs());
192
193 // KMessageBox for its dontshowAgain settings are true => Yes, false => No, No value => ask
194 // we use default = false to not write false into the rc file, but have no value
195 // the UI has inversed meaning compared to the interpretation
196 m_confirmOpenManyFolders->setChecked(GeneralSettings::confirmOpenManyFolders());
197 m_confirmOpenManyTerminals->setChecked(GeneralSettings::confirmOpenManyTerminals());
198 m_confirmRisksOfActingAsAdmin->setChecked(KMessageBox::shouldBeShownContinue(Admin::warningDontShowAgainName));
199
200 #if HAVE_TERMINAL
201 m_confirmClosingTerminalRunningProgram->setChecked(GeneralSettings::confirmClosingTerminalRunningProgram());
202 #endif
203 }
204
205 #include "moc_confirmationssettingspage.cpp"