diff -r 1b49f34e533d -r 5be0ce31ce60 src/documentmanager.cpp --- a/src/documentmanager.cpp Tue Sep 22 23:38:19 2015 +0300 +++ b/src/documentmanager.cpp Sun Oct 04 02:52:03 2015 +0300 @@ -16,24 +16,31 @@ * along with this program. If not, see . */ +#include #include #include #include "documentmanager.h" #include "ldDocument.h" #include "mainwindow.h" #include "partdownloader.h" +#include "documentloader.h" +#include "glRenderer.h" + +ConfigOption (QStringList RecentFiles) +ConfigOption (bool TryDownloadMissingFiles = false) enum { - MAX_RECENT_FILES = 10 + MaxRecentFiles = 10 }; DocumentManager::DocumentManager (QObject* parent) : QObject (parent), - g_loadingMainFile (false), - g_loadingLogoedStuds (false), - g_logoedStud (nullptr), - g_logoedStud2 (nullptr) {} + HierarchyElement (parent), + m_loadingMainFile (false), + m_isLoadingLogoedStuds (false), + m_logoedStud (nullptr), + m_logoedStud2 (nullptr) {} DocumentManager::~DocumentManager() { @@ -42,9 +49,8 @@ void DocumentManager::clear() { - for (DocumentMapIterator it (m_documents); it.hasNext();) + for (LDDocument* document : m_documents) { - LDDocument* document = it.next().value(); document->close(); delete document; } @@ -54,12 +60,15 @@ LDDocument* DocumentManager::getDocumentByName (QString filename) { - // Try find the file in the list of loaded files LDDocument* doc = findDocumentByName (filename); - // If it's not loaded, try open it - if (not doc) + if (doc == nullptr) + { + bool tmp = m_loadingMainFile; + m_loadingMainFile = false; doc = openDocument (filename, true, true); + m_loadingMainFile = tmp; + } return doc; } @@ -71,7 +80,7 @@ LDDocument* file = nullptr; QString shortName = LDDocument::shortenName (path); - for (LDDocument* doc : m_window->allDocuments()) + for (LDDocument* doc : m_documents) { if (doc->name() == shortName) { @@ -85,7 +94,7 @@ if (documentToReplace and not documentToReplace->isSafeToClose()) return; - g_loadingMainFile = true; + m_loadingMainFile = true; // If we're replacing an existing document, clear the document and // make it ready for being loaded to. @@ -107,7 +116,7 @@ Critical (format (tr ("Failed to open %1: %2"), path, strerror (errno))); } - g_loadingMainFile = false; + m_loadingMainFile = false; return; } @@ -116,7 +125,7 @@ m_window->changeDocument (file); m_window->doFullRefresh(); addRecentFile (path); - g_loadingMainFile = false; + m_loadingMainFile = false; // If there were problems loading subfile references, try see if we can find these // files on the parts tracker. @@ -147,10 +156,8 @@ LDDocument* DocumentManager::findDocumentByName (QString name) { - for (DocumentMapIterator it (m_documents); it.hasNext();) + for (LDDocument* document : m_documents) { - LDDocument* document = it.next().value(); - if (isOneOf (name, document->name(), document->defaultName())) return document; } @@ -185,48 +192,42 @@ QString DocumentManager::findDocumentPath (QString relativePath, bool subdirs) { - QString fullPath; - // LDraw models use backslashes as path separators. Replace those into forward slashes for Qt. relativePath.replace ("\\", "/"); // Try find it relative to other currently open documents. We want a file in the immediate vicinity of a current // part model to override stock LDraw stuff. - QString reltop = Basename (Dirname (relativePath)); + QString relativeTopDir = Basename (Dirname (relativePath)); - for (LDDocument* doc : m_window->allDocuments()) + for (LDDocument* document : m_documents) { - QString partpath = format ("%1/%2", Dirname (doc->fullPath()), relativePath); - QFile f (partpath); + QString partpath = format ("%1/%2", Dirname (document->fullPath()), relativePath); + QFileInfo fileinfo (partpath); - if (f.exists()) + if (fileinfo.exists()) { - // ensure we don't mix subfiles and 48-primitives with non-subfiles and non-48 - QString proptop = Basename (Dirname (partpath)); - - bool bogus = false; + // Ensure we don't mix subfiles and 48-primitives with non-subfiles and non-48 + QString partTopDir = Basename (Dirname (partpath)); - for (QString s : g_specialSubdirectories) + for (QString subdir : g_specialSubdirectories) { - if ((proptop == s and reltop != s) or (reltop == s and proptop != s)) - { - bogus = true; - break; - } + if ((partTopDir == subdir) != (relativeTopDir == subdir)) + goto skipthis; } - if (not bogus) - return partpath; + return partpath; } +skipthis: + continue; } - if (QFile::exists (relativePath)) + if (QFileInfo::exists (relativePath)) return relativePath; // Try with just the LDraw path first - fullPath = format ("%1" DIRSLASH "%2", m_window->configBag()->lDrawPath(), relativePath); + QString fullPath = format ("%1" DIRSLASH "%2", m_window->configBag()->lDrawPath(), relativePath); - if (QFile::exists (fullPath)) + if (QFileInfo::exists (fullPath)) return fullPath; if (subdirs) @@ -277,7 +278,7 @@ if (numWarnings) *numWarnings = 0; - DocumentLoader* loader = new DocumentLoader (g_loadingMainFile); + DocumentLoader* loader = new DocumentLoader (m_loadingMainFile); loader->read (fp); loader->start(); @@ -348,7 +349,7 @@ load->addObjects (objs); - if (g_loadingMainFile) + if (m_loadingMainFile) { m_window->changeDocument (load); m_window->renderer()->setDocument (load); @@ -359,12 +360,6 @@ return load; } -void DocumentManager::closeAllDocuments() -{ - for (LDDocument* file : m_window->allDocuments()) - file->close(); -} - void DocumentManager::addRecentFile (QString path) { QStringList recentFiles = m_window->configBag()->recentFiles(); @@ -380,7 +375,7 @@ } // If there's too many recent files, drop one out. - while (recentFiles.size() > (MAX_RECENT_FILES - 1)) + while (recentFiles.size() > (MaxRecentFiles - 1)) recentFiles.removeAt (0); // Add the file @@ -392,9 +387,9 @@ bool DocumentManager::isSafeToCloseAll() { - for (LDDocument* f : m_window->allDocuments()) + for (LDDocument* document : m_documents) { - if (not f->isSafeToClose()) + if (not document->isSafeToClose()) return false; } @@ -403,17 +398,19 @@ void DocumentManager::loadLogoedStuds() { - if (g_loadingLogoedStuds or (g_logoedStud and g_logoedStud2)) + if (m_isLoadingLogoedStuds or (m_logoedStud and m_logoedStud2)) return; - g_loadingLogoedStuds = true; - g_logoedStud = openDocument ("stud-logo.dat", true, true); - g_logoedStud2 = openDocument ("stud2-logo.dat", true, true); - print (tr ("Logoed studs loaded.\n")); - g_loadingLogoedStuds = false; + m_isLoadingLogoedStuds = true; + m_logoedStud = openDocument ("stud-logo.dat", true, true); + m_logoedStud2 = openDocument ("stud2-logo.dat", true, true); + m_isLoadingLogoedStuds = false; + + if (m_logoedStud and m_logoedStud2) + print (tr ("Logoed studs loaded.\n")); } -bool DocumentManager::preInline (LDDocument* doc, LDObjectList& objs) +bool DocumentManager::preInline (LDDocument* doc, LDObjectList& objs, bool deep, bool renderinline) { // Possibly substitute with logoed studs: // stud.dat -> stud-logo.dat @@ -423,9 +420,23 @@ // Ensure logoed studs are loaded first loadLogoedStuds(); - if (doc->name() == "stud.dat" and g_logoedStud) - return g_logoedStud->inlineContents (deep, renderinline); - else if (doc->name() == "stud2.dat" and g_logoedStud2) - return g_logoedStud2->inlineContents (deep, renderinline); + if (doc->name() == "stud.dat" and m_logoedStud) + { + objs = m_logoedStud->inlineContents (deep, renderinline); + return true; + } + else if (doc->name() == "stud2.dat" and m_logoedStud2) + { + objs = m_logoedStud2->inlineContents (deep, renderinline); + return true; + } } + return false; } + +LDDocument* DocumentManager::createNew() +{ + LDDocument* document = new LDDocument (this); + m_documents.insert (document); + return document; +}