diff --git a/src/settings/dolphinsettingsdialog.h b/src/settings/dolphinsettingsdialog.h --- a/src/settings/dolphinsettingsdialog.h +++ b/src/settings/dolphinsettingsdialog.h @@ -48,10 +48,14 @@ void applySettings(); void restoreDefaults(); +protected: + void closeEvent(QCloseEvent* event) override; + private: static SettingsPageBase *createTrashSettingsPage(QWidget *parent); QList m_pages; + bool m_unsavedChanges; }; #endif diff --git a/src/settings/dolphinsettingsdialog.cpp b/src/settings/dolphinsettingsdialog.cpp --- a/src/settings/dolphinsettingsdialog.cpp +++ b/src/settings/dolphinsettingsdialog.cpp @@ -32,12 +32,14 @@ #include #include #include +#include #include DolphinSettingsDialog::DolphinSettingsDialog(const QUrl& url, QWidget* parent) : KPageDialog(parent), - m_pages() + m_pages(), + m_unsavedChanges(false) { const QSize minSize = minimumSize(); @@ -121,6 +123,7 @@ void DolphinSettingsDialog::enableApply() { buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(true); + m_unsavedChanges = true; } void DolphinSettingsDialog::applySettings() @@ -139,6 +142,7 @@ settings->save(); } buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(false); + m_unsavedChanges = false; } void DolphinSettingsDialog::restoreDefaults() @@ -148,6 +152,35 @@ } } +void DolphinSettingsDialog::closeEvent(QCloseEvent* event) +{ + if (!m_unsavedChanges) { + event->accept(); + return; + } + + const auto response = KMessageBox::warningYesNoCancel(this, + i18n("You have have unsaved changes. Do you want to apply the changes or discard them?"), + i18n("Warning"), + KStandardGuiItem::save(), + KStandardGuiItem::discard(), + KStandardGuiItem::cancel()); + switch (response) { + case KMessageBox::Yes: + applySettings(); + Q_FALLTHROUGH(); + case KMessageBox::No: + event->accept(); + break; + case KMessageBox::Cancel: + event->ignore(); + break; + default: + break; + } +} + + SettingsPageBase *DolphinSettingsDialog::createTrashSettingsPage(QWidget *parent) { if (!KAuthorized::authorizeControlModule(QStringLiteral("kcmtrash.desktop"))) {