diff --git a/apps/opencs/model/doc/document.cpp b/apps/opencs/model/doc/document.cpp index 760c675a0..a441f4ae2 100644 --- a/apps/opencs/model/doc/document.cpp +++ b/apps/opencs/model/doc/document.cpp @@ -8,23 +8,6 @@ #include #endif -void CSMDoc::Document::load (const std::vector::const_iterator& begin, - const std::vector::const_iterator& end, bool lastAsModified) -{ - assert (begin!=end); - - std::vector::const_iterator end2 (end); - - if (lastAsModified) - --end2; - - for (std::vector::const_iterator iter (begin); iter!=end2; ++iter) - getData().loadFile (*iter, true, false); - - if (lastAsModified) - getData().loadFile (*end2, false, false); -} - void CSMDoc::Document::addGmsts() { static const char *gmstFloats[] = @@ -2272,21 +2255,6 @@ CSMDoc::Document::~Document() { } -void CSMDoc::Document::setupData() -{ - if (!mNew || mContentFiles.size()>1) - { - std::vector::const_iterator end = mContentFiles.end(); - - if (mNew) - --end; - - load (mContentFiles.begin(), end, !mNew); - } - - getData().loadFile (mProjectPath, false, true); -} - QUndoStack& CSMDoc::Document::getUndoStack() { return mUndoStack; @@ -2313,6 +2281,11 @@ const boost::filesystem::path& CSMDoc::Document::getSavePath() const return mSavePath; } +const boost::filesystem::path& CSMDoc::Document::getProjectPath() const +{ + return mProjectPath; +} + const std::vector& CSMDoc::Document::getContentFiles() const { return mContentFiles; diff --git a/apps/opencs/model/doc/document.hpp b/apps/opencs/model/doc/document.hpp index e19efd04e..11a4057d1 100644 --- a/apps/opencs/model/doc/document.hpp +++ b/apps/opencs/model/doc/document.hpp @@ -54,10 +54,6 @@ namespace CSMDoc Document (const Document&); Document& operator= (const Document&); - void load (const std::vector::const_iterator& begin, - const std::vector::const_iterator& end, bool lastAsModified); - ///< \param lastAsModified Store the last file in Modified instead of merging it into Base. - void createBase(); void addGmsts(); @@ -78,14 +74,14 @@ namespace CSMDoc ~Document(); - void setupData(); - QUndoStack& getUndoStack(); int getState() const; const boost::filesystem::path& getSavePath() const; + const boost::filesystem::path& getProjectPath() const; + const std::vector& getContentFiles() const; ///< \attention The last element in this collection is the file that is being edited, /// but with its original path instead of the save path. diff --git a/apps/opencs/model/doc/loader.cpp b/apps/opencs/model/doc/loader.cpp index dbaa2b4d5..5277b08d2 100644 --- a/apps/opencs/model/doc/loader.cpp +++ b/apps/opencs/model/doc/loader.cpp @@ -5,6 +5,9 @@ #include "document.hpp" +CSMDoc::Loader::Stage::Stage() : mFile (0) {} + + CSMDoc::Loader::Loader() { QTimer *timer = new QTimer (this); @@ -28,31 +31,57 @@ void CSMDoc::Loader::load() return; } - std::vector >::iterator iter = mDocuments.begin(); + std::vector >::iterator iter = mDocuments.begin(); Document *document = iter->first; - mDocuments.erase (iter); + int size = static_cast (document->getContentFiles().size()); + + if (document->isNew()) + --size; + + bool done = false; try { - document->setupData(); - emit documentLoaded (document); + if (iter->second.mFilegetData().loadFile (document->getContentFiles()[iter->second.mFile], + iter->second.mFilesecond.mFile==size) + { + document->getData().loadFile (document->getProjectPath(), false, true); + } + else + { + done = true; + } + + ++(iter->second.mFile); } catch (const std::exception& e) { + mDocuments.erase (iter); emit documentNotLoaded (document, e.what()); + return; + } + + if (done) + { + mDocuments.erase (iter); + emit documentLoaded (document); } } void CSMDoc::Loader::loadDocument (CSMDoc::Document *document) { - mDocuments.push_back (std::make_pair (document, false)); + mDocuments.push_back (std::make_pair (document, Stage())); } void CSMDoc::Loader::abortLoading (Document *document) { - for (std::vector >::iterator iter = mDocuments.begin(); + for (std::vector >::iterator iter = mDocuments.begin(); iter!=mDocuments.end(); ++iter) { if (iter->first==document) diff --git a/apps/opencs/model/doc/loader.hpp b/apps/opencs/model/doc/loader.hpp index 4e3db1815..dee7d06cb 100644 --- a/apps/opencs/model/doc/loader.hpp +++ b/apps/opencs/model/doc/loader.hpp @@ -15,9 +15,16 @@ namespace CSMDoc { Q_OBJECT + struct Stage + { + int mFile; + + Stage(); + }; + QMutex mMutex; QWaitCondition mThingsToDo; - std::vector > mDocuments; + std::vector > mDocuments; public: