diff --git a/kate/kateconfigdialog.h b/kate/kateconfigdialog.h --- a/kate/kateconfigdialog.h +++ b/kate/kateconfigdialog.h @@ -22,6 +22,8 @@ #ifndef __kate_configdialog_h__ #define __kate_configdialog_h__ +#include + #include #include #include @@ -67,18 +69,23 @@ void addPluginPage(KTextEditor::Plugin *plugin); void removePluginPage(KTextEditor::Plugin *plugin); void showAppPluginPage(KTextEditor::Plugin *plugin, uint id); + protected Q_SLOTS: void slotApply(); void slotChanged(); void slotHelp(); void slotCurrentPageChanged(KPageWidgetItem *current, KPageWidgetItem *before); +protected: + void closeEvent(QCloseEvent *event) override; + private: KateMainWindow *m_mainWindow; KTextEditor::View *m_view; bool m_dataChanged; + bool m_unsavedChange; QCheckBox *m_modNotifications; QCheckBox *m_modCloseAfterLast; diff --git a/kate/kateconfigdialog.cpp b/kate/kateconfigdialog.cpp --- a/kate/kateconfigdialog.cpp +++ b/kate/kateconfigdialog.cpp @@ -36,6 +36,7 @@ #include #include +#include #include #include #include @@ -53,6 +54,7 @@ : KPageDialog(parent) , m_mainWindow(parent) , m_view(view) + , m_unsavedChange(false) { setFaceType(Tree); setWindowTitle(i18n("Configure")); @@ -386,11 +388,13 @@ m_dataChanged = false; buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(false); + m_unsavedChange = true; } void KateConfigDialog::slotChanged() { m_dataChanged = true; + m_unsavedChange = true; buttonBox()->button(QDialogButtonBox::Apply)->setEnabled(true); } @@ -415,3 +419,30 @@ return maxItems; } +void KateConfigDialog::closeEvent(QCloseEvent* event) +{ + if (!m_unsavedChange) { + 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: + slotApply(); + Q_FALLTHROUGH(); + case KMessageBox::No: + event->accept(); + break; + case KMessageBox::Cancel: + event->ignore(); + break; + default: + break; + } +}