From 6c0659711bc70697647b0552c224373ff2f83000 Mon Sep 17 00:00:00 2001 From: wmayer Date: Mon, 30 Sep 2024 19:47:09 +0200 Subject: [PATCH] Core: Do not save changes of a text object if the GUI document is about to be closed This fixes #16873: Text document breaks some Analysis container objects --- src/Gui/Document.cpp | 4 ++ src/Gui/Document.h | 3 ++ src/Gui/TextDocumentEditorView.cpp | 67 +++++++++++++++++------------- src/Gui/TextDocumentEditorView.h | 1 + 4 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index cadc6121a0..e79979349a 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -997,6 +997,10 @@ bool Document::isModified() const return d->_isModified; } +bool Document::isAboutToClose() const +{ + return d->_isClosing; +} ViewProviderDocumentObject* Document::getViewProviderByPathFromTail(SoPath * path) const { diff --git a/src/Gui/Document.h b/src/Gui/Document.h index 4e2d8f59da..cefe963d6a 100644 --- a/src/Gui/Document.h +++ b/src/Gui/Document.h @@ -169,6 +169,9 @@ public: void setModified(bool); bool isModified() const; + /// Returns true if the document is about to be closed, false otherwise + bool isAboutToClose() const; + /// Getter for the App Document App::Document* getDocument() const; diff --git a/src/Gui/TextDocumentEditorView.cpp b/src/Gui/TextDocumentEditorView.cpp index 3e613d2f81..c5e3856a2f 100644 --- a/src/Gui/TextDocumentEditorView.cpp +++ b/src/Gui/TextDocumentEditorView.cpp @@ -222,42 +222,51 @@ bool TextDocumentEditorView::onHasMsg(const char* msg) const return false; } +int TextDocumentEditorView::execSaveDialog() +{ + this->setFocus(); + QMessageBox box(this); + box.setIcon(QMessageBox::Question); + box.setWindowTitle(tr("Unsaved document")); + box.setText(tr("Do you want to save your changes before closing?")); + box.setInformativeText(tr("If you don't save, your changes will be lost.")); + box.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel | QMessageBox::Save); + box.setDefaultButton(QMessageBox::Save); + box.setEscapeButton(QMessageBox::Cancel); + + // add shortcuts + QAbstractButton* saveBtn = box.button(QMessageBox::Save); + if (saveBtn->shortcut().isEmpty()) { + QString text = saveBtn->text(); + text.prepend(QLatin1Char('&')); + saveBtn->setShortcut(QKeySequence::mnemonic(text)); + } + + QAbstractButton* discardBtn = box.button(QMessageBox::Discard); + if (discardBtn->shortcut().isEmpty()) { + QString text = discardBtn->text(); + text.prepend(QLatin1Char('&')); + discardBtn->setShortcut(QKeySequence::mnemonic(text)); + } + + box.adjustSize(); + return box.exec(); +} + bool TextDocumentEditorView::canClose() { + if (getGuiDocument()->isAboutToClose()) { + return true; + } + if (getEditor()->document()->isModified()) { - this->setFocus(); - - QMessageBox box(this); - box.setIcon(QMessageBox::Question); - box.setWindowTitle(tr("Unsaved document")); - box.setText(tr("Do you want to save your changes before closing?")); - box.setInformativeText(tr("If you don't save, your changes will be lost.")); - box.setStandardButtons(QMessageBox::Discard | QMessageBox::Cancel | QMessageBox::Save); - box.setDefaultButton(QMessageBox::Save); - box.setEscapeButton(QMessageBox::Cancel); - - // add shortcuts - QAbstractButton* saveBtn = box.button(QMessageBox::Save); - if (saveBtn->shortcut().isEmpty()) { - QString text = saveBtn->text(); - text.prepend(QLatin1Char('&')); - saveBtn->setShortcut(QKeySequence::mnemonic(text)); - } - - QAbstractButton* discardBtn = box.button(QMessageBox::Discard); - if (discardBtn->shortcut().isEmpty()) { - QString text = discardBtn->text(); - text.prepend(QLatin1Char('&')); - discardBtn->setShortcut(QKeySequence::mnemonic(text)); - } - - box.adjustSize(); - switch (box.exec()) + switch (execSaveDialog()) { case QMessageBox::Save: saveToObject(); - if (getGuiDocument()->isLastView()) + if (getGuiDocument()->isLastView()) { return getGuiDocument()->save(); + } return true; case QMessageBox::Discard: return true; diff --git a/src/Gui/TextDocumentEditorView.h b/src/Gui/TextDocumentEditorView.h index 0ba1d6f165..2bba370d43 100644 --- a/src/Gui/TextDocumentEditorView.h +++ b/src/Gui/TextDocumentEditorView.h @@ -66,6 +66,7 @@ private: void labelChanged(); void refresh(); bool isEditorModified() const; + int execSaveDialog(); private: QPlainTextEdit *const editor;