From fa27ae2def962658799fe413cf4bc1cb5ef58f0e Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 17 Mar 2020 10:35:54 +0100 Subject: [PATCH] Gui: [skip ci] update editor action on request --- src/Gui/EditorView.cpp | 99 +++++++++++++++++++++++++++++++++--------- src/Gui/EditorView.h | 5 ++- 2 files changed, 82 insertions(+), 22 deletions(-) diff --git a/src/Gui/EditorView.cpp b/src/Gui/EditorView.cpp index 8df586010b..59676de47b 100644 --- a/src/Gui/EditorView.cpp +++ b/src/Gui/EditorView.cpp @@ -46,6 +46,7 @@ #include "BitmapFactory.h" #include "FileDialog.h" #include "Macro.h" +#include "MainWindow.h" #include "PythonDebugger.h" #include "PythonEditor.h" @@ -63,6 +64,7 @@ public: QTimer* activityTimer; uint timeStamp; bool lock; + bool aboutToClose; QStringList undos; QStringList redos; }; @@ -81,12 +83,19 @@ EditorView::EditorView(QPlainTextEdit* editor, QWidget* parent) { d = new EditorViewP; d->lock = false; + d->aboutToClose = false; d->displayName = EditorView::FullName; // create the editor first d->textEdit = editor; d->textEdit->setLineWrapMode(QPlainTextEdit::NoWrap); + // update editor actions on request + Gui::MainWindow* mw = Gui::getMainWindow(); + connect(editor, SIGNAL(undoAvailable(bool)), mw, SLOT(updateEditorActions())); + connect(editor, SIGNAL(redoAvailable(bool)), mw, SLOT(updateEditorActions())); + connect(editor, SIGNAL(copyAvailable(bool)), mw, SLOT(updateEditorActions())); + // Create the layout containing the workspace and a tab bar QFrame* hbox = new QFrame(this); hbox->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); @@ -133,6 +142,28 @@ QPlainTextEdit* EditorView::getEditor() const return d->textEdit; } +void EditorView::showEvent(QShowEvent* event) +{ + Gui::MainWindow* mw = Gui::getMainWindow(); + mw->updateEditorActions(); + MDIView::showEvent(event); +} + +void EditorView::hideEvent(QHideEvent* event) +{ + MDIView::hideEvent(event); +} + +void EditorView::closeEvent(QCloseEvent* event) +{ + MDIView::closeEvent(event); + if (event->isAccepted()) { + d->aboutToClose = true; + Gui::MainWindow* mw = Gui::getMainWindow(); + mw->updateEditorActions(); + } +} + void EditorView::OnChange(Base::Subject &rCaller,const char* rcReason) { Q_UNUSED(rCaller); @@ -170,28 +201,39 @@ void EditorView::checkTimestamp() */ bool EditorView::onMsg(const char* pMsg,const char** /*ppReturn*/) { - if (strcmp(pMsg,"Save")==0){ + // don't allow any actions if the editor is being closed + if (d->aboutToClose) + return false; + + if (strcmp(pMsg, "Save") == 0) { saveFile(); return true; - } else if (strcmp(pMsg,"SaveAs")==0){ + } + else if (strcmp(pMsg, "SaveAs") == 0) { saveAs(); return true; - } else if (strcmp(pMsg,"Cut")==0){ + } + else if (strcmp(pMsg, "Cut") == 0) { cut(); return true; - } else if (strcmp(pMsg,"Copy")==0){ + } + else if (strcmp(pMsg, "Copy") == 0) { copy(); return true; - } else if (strcmp(pMsg,"Paste")==0){ + } + else if (strcmp(pMsg, "Paste") == 0) { paste(); return true; - } else if (strcmp(pMsg,"Undo")==0){ + } + else if (strcmp(pMsg, "Undo") == 0) { undo(); return true; - } else if (strcmp(pMsg,"Redo")==0){ + } + else if (strcmp(pMsg, "Redo") == 0) { redo(); return true; - } else if (strcmp(pMsg,"ViewFit")==0){ + } + else if (strcmp(pMsg, "ViewFit") == 0) { // just ignore this return true; } @@ -205,21 +247,34 @@ bool EditorView::onMsg(const char* pMsg,const char** /*ppReturn*/) */ bool EditorView::onHasMsg(const char* pMsg) const { - if (strcmp(pMsg,"Run")==0) return true; - if (strcmp(pMsg,"DebugStart")==0) return true; - if (strcmp(pMsg,"DebugStop")==0) return true; - if (strcmp(pMsg,"SaveAs")==0) return true; - if (strcmp(pMsg,"Print")==0) return true; - if (strcmp(pMsg,"PrintPreview")==0) return true; - if (strcmp(pMsg,"PrintPdf")==0) return true; - if (strcmp(pMsg,"Save")==0) { + // don't allow any actions if the editor is being closed + if (d->aboutToClose) + return false; + if (strcmp(pMsg, "Run") == 0) + return true; + if (strcmp(pMsg, "DebugStart") == 0) + return true; + if (strcmp(pMsg, "DebugStop") == 0) + return true; + if (strcmp(pMsg, "SaveAs") == 0) + return true; + if (strcmp(pMsg, "Print") == 0) + return true; + if (strcmp(pMsg, "PrintPreview") == 0) + return true; + if (strcmp(pMsg, "PrintPdf") == 0) + return true; + if (strcmp(pMsg, "Save") == 0) { return d->textEdit->document()->isModified(); - } else if (strcmp(pMsg,"Cut")==0) { + } + else if (strcmp(pMsg, "Cut") == 0) { bool canWrite = !d->textEdit->isReadOnly(); return (canWrite && (d->textEdit->textCursor().hasSelection())); - } else if (strcmp(pMsg,"Copy")==0) { + } + else if (strcmp(pMsg, "Copy") == 0) { return ( d->textEdit->textCursor().hasSelection() ); - } else if (strcmp(pMsg,"Paste")==0) { + } + else if (strcmp(pMsg, "Paste") == 0) { QClipboard *cb = QApplication::clipboard(); QString text; @@ -228,9 +283,11 @@ bool EditorView::onHasMsg(const char* pMsg) const bool canWrite = !d->textEdit->isReadOnly(); return ( !text.isEmpty() && canWrite ); - } else if (strcmp(pMsg,"Undo")==0) { + } + else if (strcmp(pMsg, "Undo") == 0) { return d->textEdit->document()->isUndoAvailable (); - } else if (strcmp(pMsg,"Redo")==0) { + } + else if (strcmp(pMsg, "Redo") == 0) { return d->textEdit->document()->isRedoAvailable (); } diff --git a/src/Gui/EditorView.h b/src/Gui/EditorView.h index 61db75266b..54f6ccc5e7 100644 --- a/src/Gui/EditorView.h +++ b/src/Gui/EditorView.h @@ -60,7 +60,7 @@ public: void OnChange(Base::Subject &rCaller,const char* rcReason); const char *getName(void) const {return "EditorView";} - void onUpdate(void){}; + void onUpdate(void){} bool onMsg(const char* pMsg,const char** ppReturn); bool onHasMsg(const char* pMsg) const; @@ -88,6 +88,9 @@ public: protected: void focusInEvent(QFocusEvent* e); + void showEvent(QShowEvent*); + void hideEvent(QHideEvent*); + void closeEvent(QCloseEvent*); private Q_SLOTS: void checkTimestamp();