From 4471fe771ee6790eee7e5e4e65120360c42a5664 Mon Sep 17 00:00:00 2001 From: cc9cii Date: Tue, 9 Sep 2014 21:09:37 +1000 Subject: [PATCH] Fix logic errors. --- apps/opencs/view/doc/view.cpp | 2 +- apps/opencs/view/doc/viewmanager.cpp | 48 ++++++++++++++++++++++------ apps/opencs/view/doc/viewmanager.hpp | 2 +- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index 384ae6c54..63bb9efb1 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -27,7 +27,7 @@ void CSVDoc::View::closeEvent (QCloseEvent *event) else { // closeRequest() returns true if last document - mViewManager.removeDocument(mDocument); + mViewManager.removeDocAndView(mDocument); } } diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index 47a52891e..a037219a4 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -172,7 +172,7 @@ bool CSVDoc::ViewManager::closeRequest (View *view) { std::vector::iterator iter = std::find (mViews.begin(), mViews.end(), view); - bool continueWithClose = true; + bool continueWithClose = false; if (iter!=mViews.end()) { @@ -192,10 +192,22 @@ bool CSVDoc::ViewManager::closeRequest (View *view) return continueWithClose; } -void CSVDoc::ViewManager::removeDocument (CSMDoc::Document *document) +// NOTE: This method assumes that it is called only if the last document +void CSVDoc::ViewManager::removeDocAndView (CSMDoc::Document *document) { - if(document) - mDocumentManager.removeDocument(document); + for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + { + // the first match should also be the only match + if((*iter)->getDocument() == document) + { + mDocumentManager.removeDocument(document); + (*iter)->deleteLater(); + mViews.erase (iter); + + updateIndices(); + return; + } + } } bool CSVDoc::ViewManager::notifySaveOnClose (CSVDoc::View *view) @@ -354,14 +366,23 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) return; else { + // don't bother closing views or updating indicies, but remove from mViews CSMDoc::Document * document = view->getDocument(); - removeDocument(document); - view->setVisible(false); + std::vector remainingViews; + for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + { + if(document == (*iter)->getDocument()) + (*iter)->setVisible(false); + else + remainingViews.push_back(*iter); + } + mDocumentManager.removeDocument(document); + mViews = remainingViews; // attempt to close all other documents while(!mViews.empty()) { - // raise the window + // raise the window to alert the user mViews.back()->activateWindow(); mViews.back()->raise(); if (!notifySaveOnClose(mViews.back())) @@ -369,9 +390,16 @@ void CSVDoc::ViewManager::exitApplication (CSVDoc::View *view) else { document = mViews.back()->getDocument(); - removeDocument(document); - mViews.back()->setVisible(false); - mViews.pop_back(); + remainingViews.clear(); + for (std::vector::const_iterator iter (mViews.begin()); iter!=mViews.end(); ++iter) + { + if(document == (*iter)->getDocument()) + (*iter)->setVisible(false); + else + remainingViews.push_back(*iter); + } + mDocumentManager.removeDocument(document); + mViews = remainingViews; } } } diff --git a/apps/opencs/view/doc/viewmanager.hpp b/apps/opencs/view/doc/viewmanager.hpp index 6be3aba5a..e0121a7fb 100644 --- a/apps/opencs/view/doc/viewmanager.hpp +++ b/apps/opencs/view/doc/viewmanager.hpp @@ -55,7 +55,7 @@ namespace CSVDoc ///< Return number of views for \a document. bool closeRequest (View *view); - void removeDocument (CSMDoc::Document *document); + void removeDocAndView (CSMDoc::Document *document); signals: