From efe739cbe47b68d167085a17709965779779aab5 Mon Sep 17 00:00:00 2001 From: Rodney Date: Nov 10 2019 02:26:00 +0000 Subject: Merge pull request #2638 from manongjohn/fix_missing_project Add project outside project root to drop-downs --- diff --git a/toonz/sources/include/toonz/tproject.h b/toonz/sources/include/toonz/tproject.h index 0898213..d8ec955 100644 --- a/toonz/sources/include/toonz/tproject.h +++ b/toonz/sources/include/toonz/tproject.h @@ -146,6 +146,7 @@ public: TFilePath projectNameToProjectPath(const TFilePath &projectName); TFilePath projectFolderToProjectPath(const TFilePath &projectFolder); TFilePath getProjectPathByName(const TFilePath &projectName); + TFilePath getProjectPathByProjectFolder(const TFilePath &projectFolder); TProjectP loadSceneProject(const TFilePath &scenePath); void getFolderNames(std::vector &names); diff --git a/toonz/sources/toonz/projectpopup.cpp b/toonz/sources/toonz/projectpopup.cpp index 638f999..9c09f01 100644 --- a/toonz/sources/toonz/projectpopup.cpp +++ b/toonz/sources/toonz/projectpopup.cpp @@ -348,13 +348,14 @@ void ProjectPopup::updateChooseProjectCombo() { m_projectPaths.clear(); m_chooseProjectCombo->clear(); - TFilePath sandboxFp = TProjectManager::instance()->getSandboxProjectFolder() + - "sandbox_otprj.xml"; + TProjectManager *pm = TProjectManager::instance(); + + TFilePath sandboxFp = pm->getSandboxProjectFolder() + "sandbox_otprj.xml"; m_projectPaths.push_back(sandboxFp); m_chooseProjectCombo->addItem("sandbox"); std::vector prjRoots; - TProjectManager::instance()->getProjectRoots(prjRoots); + pm->getProjectRoots(prjRoots); for (int i = 0; i < prjRoots.size(); i++) { TFilePathSet fps; TSystem::readDirectory_Dir_ReadExe(fps, prjRoots[i]); @@ -362,17 +363,24 @@ void ProjectPopup::updateChooseProjectCombo() { TFilePathSet::iterator it; for (it = fps.begin(); it != fps.end(); ++it) { TFilePath fp(*it); - if (TProjectManager::instance()->isProject(fp)) { - m_projectPaths.push_back( - TProjectManager::instance()->projectFolderToProjectPath(fp)); - m_chooseProjectCombo->addItem(QString::fromStdString(fp.getName())); + if (pm->isProject(fp)) { + m_projectPaths.push_back(pm->projectFolderToProjectPath(fp)); + TFilePath prjFile = pm->getProjectPathByProjectFolder(fp); + m_chooseProjectCombo->addItem( + QString::fromStdString(prjFile.getName())); } } } - + // Add in project of current project if outside known Project root folders + TProjectP currentProject = pm->getCurrentProject(); + TFilePath currentProjectFP = currentProject->getProjectPath(); + if (m_projectPaths.indexOf(currentProjectFP) == -1) { + m_projectPaths.push_back(currentProjectFP); + m_chooseProjectCombo->addItem( + QString::fromStdString(currentProject->getName().getName())); + } for (int i = 0; i < m_projectPaths.size(); i++) { - if (TProjectManager::instance()->getCurrentProjectPath() == - m_projectPaths[i]) { + if (pm->getCurrentProjectPath() == m_projectPaths[i]) { m_chooseProjectCombo->setCurrentIndex(i); break; } @@ -475,9 +483,18 @@ ProjectSettingsPopup::ProjectSettingsPopup() : ProjectPopup(false) { void ProjectSettingsPopup::onChooseProjectChanged(int index) { TFilePath projectFp = m_projectPaths[index]; - TProjectManager::instance()->setCurrentProjectPath(projectFp); + TProjectManager *pm = TProjectManager::instance(); + pm->setCurrentProjectPath(projectFp); + TProject *projectP = TProjectManager::instance()->getCurrentProject().getPointer(); + + // In case the project file was upgraded to current version, save it now + if (projectP->getProjectPath() != projectFp) { + m_projectPaths[index] = projectP->getProjectPath(); + projectP->save(); + } + updateFieldsFromProject(projectP); IoCmd::saveSceneIfNeeded("Change project"); IoCmd::newScene(); diff --git a/toonz/sources/toonz/startuppopup.cpp b/toonz/sources/toonz/startuppopup.cpp index fee6e05..761182f 100644 --- a/toonz/sources/toonz/startuppopup.cpp +++ b/toonz/sources/toonz/startuppopup.cpp @@ -508,13 +508,14 @@ void StartupPopup::updateProjectCB() { m_projectPaths.clear(); m_projectsCB->clear(); - TFilePath sandboxFp = TProjectManager::instance()->getSandboxProjectFolder() + - "sandbox_otprj.xml"; + TProjectManager *pm = TProjectManager::instance(); + + TFilePath sandboxFp = pm->getSandboxProjectFolder() + "sandbox_otprj.xml"; m_projectPaths.push_back(sandboxFp); m_projectsCB->addItem("sandbox"); std::vector prjRoots; - TProjectManager::instance()->getProjectRoots(prjRoots); + pm->getProjectRoots(prjRoots); for (int i = 0; i < prjRoots.size(); i++) { TFilePathSet fps; TSystem::readDirectory_Dir_ReadExe(fps, prjRoots[i]); @@ -522,17 +523,24 @@ void StartupPopup::updateProjectCB() { TFilePathSet::iterator it; for (it = fps.begin(); it != fps.end(); ++it) { TFilePath fp(*it); - if (TProjectManager::instance()->isProject(fp)) { - m_projectPaths.push_back( - TProjectManager::instance()->projectFolderToProjectPath(fp)); - m_projectsCB->addItem(QString::fromStdString(fp.getName())); + if (pm->isProject(fp)) { + m_projectPaths.push_back(pm->projectFolderToProjectPath(fp)); + TFilePath prjFile = pm->getProjectPathByProjectFolder(fp); + m_projectsCB->addItem(QString::fromStdString(prjFile.getName())); } } } + // Add in project of current project if outside known Project root folders + TProjectP currentProject = pm->getCurrentProject(); + TFilePath currentProjectFP = currentProject->getProjectPath(); + if (m_projectPaths.indexOf(currentProjectFP) == -1) { + m_projectPaths.push_back(currentProjectFP); + m_projectsCB->addItem( + QString::fromStdString(currentProject->getName().getName())); + } int i; for (i = 0; i < m_projectPaths.size(); i++) { - if (TProjectManager::instance()->getCurrentProjectPath() == - m_projectPaths[i]) { + if (pm->getCurrentProjectPath() == m_projectPaths[i]) { m_projectsCB->setCurrentIndex(i); break; } @@ -552,7 +560,16 @@ void StartupPopup::onProjectChanged(int index) { if (m_updating) return; TFilePath projectFp = m_projectPaths[index]; - TProjectManager::instance()->setCurrentProjectPath(projectFp); + TProjectManager *pm = TProjectManager::instance(); + pm->setCurrentProjectPath(projectFp); + + TProjectP currentProject = pm->getCurrentProject(); + + // In case the project file was upgraded to current version, save it now + if (currentProject->getProjectPath() != projectFp) { + m_projectPaths[index] = currentProject->getProjectPath(); + currentProject->save(); + } IoCmd::newScene(); m_pathFld->setPath(TApp::instance() @@ -867,23 +884,19 @@ void StartupPopup::onRecentSceneClicked(int index) { if (projectIndex >= 0) { TFilePath projectFp = m_projectPaths[projectIndex]; TProjectManager::instance()->setCurrentProjectPath(projectFp); - } else { - QString msg = tr("The selected scene project '%1' is not in the " - "Current Project list and may not open automatically.") - .arg(projectName); - DVGui::warning(msg); } } IoCmd::loadScene(TFilePath(path.toStdWString()), false, true); - if (RecentFiles::instance()->getFileProject(index) == "-") { + QString origProjectName = RecentFiles::instance()->getFileProject(index); + QString projectName = QString::fromStdString(TApp::instance() + ->getCurrentScene() + ->getScene() + ->getProject() + ->getName() + .getName()); + if (origProjectName == "-" || origProjectName != projectName) { QString fileName = RecentFiles::instance()->getFilePath(index, RecentFiles::Scene); - QString projectName = QString::fromStdString(TApp::instance() - ->getCurrentScene() - ->getScene() - ->getProject() - ->getName() - .getName()); RecentFiles::instance()->removeFilePath(index, RecentFiles::Scene); RecentFiles::instance()->addFilePath(fileName, RecentFiles::Scene, projectName); diff --git a/toonz/sources/toonzlib/toonzscene.cpp b/toonz/sources/toonzlib/toonzscene.cpp index 5da6ea5..2b08313 100644 --- a/toonz/sources/toonzlib/toonzscene.cpp +++ b/toonz/sources/toonzlib/toonzscene.cpp @@ -1254,7 +1254,7 @@ TXshLevel *ToonzScene::loadLevel(const TFilePath &actualPath, TFilePath ToonzScene::decodeFilePath(const TFilePath &path) const { TProject *project = getProject(); - bool projectIsEmpty = false; + bool projectIsEmpty = project->getFolderCount() ? false : true; TFilePath fp = path; std::wstring head; diff --git a/toonz/sources/toonzlib/tproject.cpp b/toonz/sources/toonzlib/tproject.cpp index bddbc91..877ff10 100644 --- a/toonz/sources/toonzlib/tproject.cpp +++ b/toonz/sources/toonzlib/tproject.cpp @@ -117,6 +117,29 @@ std::wstring getProjectSuffix(const TFilePath &path) { //------------------------------------------------------------------- +/*! Looks in the directory for a project file. If nothing found, returns a + * blank TFilePath +*/ +TFilePath getProjectFile(const TFilePath &fp) { + const std::wstring &fpName = fp.getWideName(); + const std::wstring &folderName = fp.getParentDir().getWideName(); + QDir dir(fp.getQString()); + for (int i = 0; i < prjSuffixCount; ++i) { + TFilePath path = fp + (fpName + prjSuffix[i] + xmlExt); + if (TFileStatus(path).doesExist()) return path; + + QStringList filters; + filters << "*" + QString::fromStdWString(prjSuffix[i] + xmlExt); + QStringList prjfiles = + dir.entryList(filters, QDir::Files, (QDir::Time | QDir::Reversed)); + if (prjfiles.size()) return fp + TFilePath(prjfiles[0]); + } + + return TFilePath(); +} + +//------------------------------------------------------------------- + //! In case the supplied path has an old version suffix, //! this function updates it to the most recent; otherwise, //! it is left untouched. @@ -146,11 +169,8 @@ TFilePath searchProjectPath(TFilePath folder) { wstring projectName = folder.getWideName(); // Search for the first available project file, starting from the most recent. - TFilePath projectPath; - for (int i = 0; i < prjSuffixCount; ++i) { - projectPath = folder + TFilePath(projectName + prjSuffix[i] + xmlExt); - if (TFileStatus(projectPath).doesExist()) return projectPath; - } + TFilePath projectPath = getProjectFile(folder); + if (projectPath != TFilePath()) return projectPath; // If none exist in the folder, build the name with the most recent suffix return folder + TFilePath(projectName + prjSuffix[0] + xmlExt); @@ -670,10 +690,9 @@ void TProject::load(const TFilePath &projectPath) { */ bool TProject::isAProjectPath(const TFilePath &fp) { if (fp.isAbsolute() && fp.getType() == "xml") { - const std::wstring &fpName = fp.getWideName(); - const std::wstring &folderName = fp.getParentDir().getWideName(); + const std::wstring &fpName = fp.getWideName(); for (int i = 0; i < prjSuffixCount; ++i) - if (fpName == (folderName + prjSuffix[i])) return true; + if (fpName.find(prjSuffix[i]) != std::wstring::npos) return true; } return false; @@ -799,6 +818,14 @@ TFilePath TProjectManager::projectPathToProjectName( assert(projectPath.isAbsolute()); TFilePath projectFolder = projectPath.getParentDir(); if (m_projectsRoots.empty()) addDefaultProjectsRoot(); + + std::wstring fpName = projectPath.getWideName(); + for (int i = 0; i < prjSuffixCount; ++i) { + // std::wstring::size_type const i = fpName.find(prjSuffix[i]); + if (fpName.find(prjSuffix[i]) != std::wstring::npos) + return TFilePath(fpName.substr(0, fpName.find(prjSuffix[i]))); + } + int i; for (i = 0; i < (int)m_projectsRoots.size(); i++) { if (m_projectsRoots[i].isAncestorOf(projectFolder)) @@ -866,6 +893,15 @@ TFilePath TProjectManager::getProjectPathByName(const TFilePath &projectName) { } //------------------------------------------------------------------- + +TFilePath TProjectManager::getProjectPathByProjectFolder( + const TFilePath &projectFolder) { + assert(!projectFolder.isAbsolute()); + TFilePath projectPath = searchProjectPath(projectFolder); + return projectPathToProjectName(projectPath); +} + +//------------------------------------------------------------------- /*! Gets all project folder names and put them in the passed vector \b names. \note All previous data contained in \b names are lost.*/ @@ -988,12 +1024,7 @@ TProjectP TProjectManager::loadSceneProject(const TFilePath &scenePath) { is.matchEndTag(); projectPath = makeAbsolute(folder, projectFolderPath); - TFilePath path; - for (int i = 0; i < prjSuffixCount; ++i) { - path = - projectPath + (projectPath.getWideName() + prjSuffix[i] + xmlExt); - if (TFileStatus(path).doesExist()) break; - } + TFilePath path = getProjectFile(projectPath); projectPath = path;