]> cloud.milkyroute.net Git - dolphin.git/blob - src/settings/dolphinsettingsdialog.cpp
Merge branch 'release/20.08' into master
[dolphin.git] / src / settings / dolphinsettingsdialog.cpp
1 /*
2 * SPDX-FileCopyrightText: 2006 Peter Penz <peter.penz@gmx.at>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "dolphinsettingsdialog.h"
8
9 #include "dolphin_generalsettings.h"
10 #include "dolphinmainwindow.h"
11 #include "general/generalsettingspage.h"
12 #include "navigation/navigationsettingspage.h"
13 #include "services/servicessettingspage.h"
14 #include "startup/startupsettingspage.h"
15 #include "trash/trashsettingspage.h"
16 #include "viewmodes/viewsettingspage.h"
17
18 #include <KAuthorized>
19 #include <KLocalizedString>
20 #include <KWindowConfig>
21 #include <KMessageBox>
22
23 #include <QCloseEvent>
24 #include <QPushButton>
25
26 DolphinSettingsDialog::DolphinSettingsDialog(const QUrl& url, QWidget* parent) :
27 KPageDialog(parent),
28 m_pages(),
29 m_unsavedChanges(false)
30
31 {
32 const QSize minSize = minimumSize();
33 setMinimumSize(QSize(540, minSize.height()));
34
35 setFaceType(List);
36 setWindowTitle(i18nc("@title:window", "Dolphin Preferences"));
37 QDialogButtonBox* box = new QDialogButtonBox(QDialogButtonBox::Ok
38 | QDialogButtonBox::Apply | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults);
39 box->button(QDialogButtonBox::Apply)->setEnabled(false);
40 box->button(QDialogButtonBox::Ok)->setDefault(true);
41 setButtonBox(box);
42
43 connect(box->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, this, &DolphinSettingsDialog::applySettings);
44 connect(box->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, &DolphinSettingsDialog::applySettings);
45 connect(box->button(QDialogButtonBox::RestoreDefaults), &QAbstractButton::clicked, this, &DolphinSettingsDialog::restoreDefaults);
46
47 // General
48 GeneralSettingsPage* generalSettingsPage = new GeneralSettingsPage(url, this);
49 KPageWidgetItem* generalSettingsFrame = addPage(generalSettingsPage,
50 i18nc("@title:group General settings", "General"));
51 generalSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("system-file-manager")));
52 connect(generalSettingsPage, &GeneralSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
53
54 // Startup
55 StartupSettingsPage* startupSettingsPage = new StartupSettingsPage(url, this);
56 KPageWidgetItem* startupSettingsFrame = addPage(startupSettingsPage,
57 i18nc("@title:group", "Startup"));
58 startupSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-launch-feedback")));
59 connect(startupSettingsPage, &StartupSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
60
61 // View Modes
62 ViewSettingsPage* viewSettingsPage = new ViewSettingsPage(this);
63 KPageWidgetItem* viewSettingsFrame = addPage(viewSettingsPage,
64 i18nc("@title:group", "View Modes"));
65 viewSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-icons")));
66 connect(viewSettingsPage, &ViewSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
67
68 // Navigation
69 NavigationSettingsPage* navigationSettingsPage = new NavigationSettingsPage(this);
70 KPageWidgetItem* navigationSettingsFrame = addPage(navigationSettingsPage,
71 i18nc("@title:group", "Navigation"));
72 navigationSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-navigation")));
73 connect(navigationSettingsPage, &NavigationSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
74
75 // Services
76 ServicesSettingsPage* servicesSettingsPage = new ServicesSettingsPage(this);
77 KPageWidgetItem* servicesSettingsFrame = addPage(servicesSettingsPage,
78 i18nc("@title:group", "Services"));
79 servicesSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("preferences-system-services")));
80 connect(servicesSettingsPage, &ServicesSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
81
82 // Trash
83 auto* trashSettingsPage = createTrashSettingsPage(this);
84 if (trashSettingsPage) {
85 KPageWidgetItem* trashSettingsFrame = addPage(trashSettingsPage,
86 i18nc("@title:group", "Trash"));
87 trashSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("user-trash")));
88 connect(trashSettingsPage, &TrashSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
89 }
90
91 m_pages.append(generalSettingsPage);
92 m_pages.append(startupSettingsPage);
93 m_pages.append(viewSettingsPage);
94 m_pages.append(navigationSettingsPage);
95 m_pages.append(servicesSettingsPage);
96 if (trashSettingsPage) {
97 m_pages.append(trashSettingsPage);
98 }
99
100 const KConfigGroup dialogConfig(KSharedConfig::openConfig(QStringLiteral("dolphinrc")), "SettingsDialog");
101 KWindowConfig::restoreWindowSize(windowHandle(), dialogConfig);
102 }
103
104 DolphinSettingsDialog::~DolphinSettingsDialog()
105 {
106 KConfigGroup dialogConfig(KSharedConfig::openConfig(QStringLiteral("dolphinrc")), "SettingsDialog");
107 KWindowConfig::saveWindowSize(windowHandle(), dialogConfig);
108 }
109
110 void DolphinSettingsDialog::enableApply()
111 {
112 buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(true);
113 m_unsavedChanges = true;
114 }
115
116 void DolphinSettingsDialog::applySettings()
117 {
118 foreach (SettingsPageBase* page, m_pages) {
119 page->applySettings();
120 }
121
122 emit settingsChanged();
123
124 GeneralSettings* settings = GeneralSettings::self();
125 if (settings->modifiedStartupSettings()) {
126 // Reset the modified startup settings hint. The changed startup settings
127 // have been applied already due to emitting settingsChanged().
128 settings->setModifiedStartupSettings(false);
129 settings->save();
130 }
131 buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(false);
132 m_unsavedChanges = false;
133 }
134
135 void DolphinSettingsDialog::restoreDefaults()
136 {
137 foreach (SettingsPageBase* page, m_pages) {
138 page->restoreDefaults();
139 }
140 }
141
142 void DolphinSettingsDialog::closeEvent(QCloseEvent* event)
143 {
144 if (!m_unsavedChanges) {
145 event->accept();
146 return;
147 }
148
149 const auto response = KMessageBox::warningYesNoCancel(this,
150 i18n("You have unsaved changes. Do you want to apply the changes or discard them?"),
151 i18n("Warning"),
152 KStandardGuiItem::save(),
153 KStandardGuiItem::discard(),
154 KStandardGuiItem::cancel());
155 switch (response) {
156 case KMessageBox::Yes:
157 applySettings();
158 Q_FALLTHROUGH();
159 case KMessageBox::No:
160 event->accept();
161 break;
162 case KMessageBox::Cancel:
163 event->ignore();
164 break;
165 default:
166 break;
167 }
168 }
169
170
171 SettingsPageBase *DolphinSettingsDialog::createTrashSettingsPage(QWidget *parent)
172 {
173 if (!KAuthorized::authorizeControlModule(QStringLiteral("kcmtrash.desktop"))) {
174 return nullptr;
175 }
176
177 return new TrashSettingsPage(parent);
178 }