Prompt user to save/discard changes upon closing config dialog

Summary:
When the configuration dialog is closed with unsaved changes,
a message box is prompted to save/discard them or cancel the event.

BUG: 391206

Reviewers: #dolphin, elvisangelaccio

Reviewed By: #dolphin, elvisangelaccio

Subscribers: ngraham, elvisangelaccio, kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D19904
This commit is contained in:
Amish Naidu 2019-03-25 15:41:40 +05:30
parent 3dec3ee092
commit 017cd2322a
2 changed files with 38 additions and 1 deletions

View file

@ -32,12 +32,14 @@
#include <KAuthorized>
#include <KLocalizedString>
#include <KWindowConfig>
#include <KMessageBox>
#include <QPushButton>
DolphinSettingsDialog::DolphinSettingsDialog(const QUrl& url, QWidget* parent) :
KPageDialog(parent),
m_pages()
m_pages(),
m_unsavedChanges(false)
{
const QSize minSize = minimumSize();
@ -121,6 +123,7 @@ DolphinSettingsDialog::~DolphinSettingsDialog()
void DolphinSettingsDialog::enableApply()
{
buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(true);
m_unsavedChanges = true;
}
void DolphinSettingsDialog::applySettings()
@ -139,6 +142,7 @@ void DolphinSettingsDialog::applySettings()
settings->save();
}
buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(false);
m_unsavedChanges = false;
}
void DolphinSettingsDialog::restoreDefaults()
@ -148,6 +152,35 @@ void DolphinSettingsDialog::restoreDefaults()
}
}
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"))) {

View file

@ -48,10 +48,14 @@ private slots:
void applySettings();
void restoreDefaults();
protected:
void closeEvent(QCloseEvent* event) override;
private:
static SettingsPageBase *createTrashSettingsPage(QWidget *parent);
QList<SettingsPageBase*> m_pages;
bool m_unsavedChanges;
};
#endif