From 4db981e3ecde83362fa7fe4dd4f705735e04b3ba Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Fri, 25 Sep 2020 22:55:03 -0600 Subject: [PATCH] Add current project to File Browser (#221) * Add current project to File Browser * ready for testing * Collapse other projects --- toonz/sources/toonz/dvdirtreeview.cpp | 9 ++++ toonz/sources/toonz/filebrowsermodel.cpp | 58 +++++++++++++++++------- toonz/sources/toonz/filebrowsermodel.h | 5 ++ 3 files changed, 55 insertions(+), 17 deletions(-) diff --git a/toonz/sources/toonz/dvdirtreeview.cpp b/toonz/sources/toonz/dvdirtreeview.cpp index f788954a..7338a0d4 100644 --- a/toonz/sources/toonz/dvdirtreeview.cpp +++ b/toonz/sources/toonz/dvdirtreeview.cpp @@ -349,6 +349,15 @@ DvDirTreeView::DvDirTreeView(QWidget *parent) ret = ret && connect(this->model(), SIGNAL(layoutChanged()), this, SLOT(resizeToConts())); + ret = ret && connect(dynamic_cast(this->model()), + &DvDirModel::projectAdded, [=]() { + collapseAll(); + setCurrentNode(TProjectManager::instance() + ->getCurrentProjectPath() + .getParentDir(), + true); + }); + if (Preferences::instance()->isWatchFileSystemEnabled()) { ret = ret && connect(this, SIGNAL(expanded(const QModelIndex &)), this, SLOT(onExpanded(const QModelIndex &))); diff --git a/toonz/sources/toonz/filebrowsermodel.cpp b/toonz/sources/toonz/filebrowsermodel.cpp index 0debce25..e6cd8b7f 100644 --- a/toonz/sources/toonz/filebrowsermodel.cpp +++ b/toonz/sources/toonz/filebrowsermodel.cpp @@ -1075,27 +1075,27 @@ void DvDirModelRootNode::refreshChildren() { addChild(new DvDirModelHistoryNode(this)); - TProjectManager *pm = TProjectManager::instance(); - // std::vector projectRoots; - // pm->getProjectRoots(projectRoots); - - // int i; - // for (i = 0; i < (int)projectRoots.size(); i++) { - // TFilePath projectRoot = projectRoots[i]; - // std::wstring roothDir = projectRoot.getWideString(); - // DvDirModelSpecialFileFolderNode *projectRootNode = - // new DvDirModelSpecialFileFolderNode( - // this, L"Project root (" + roothDir + L")", projectRoot); - // projectRootNode->setPixmap(QPixmap(recolorPixmap(svgToPixmap( - // getIconThemePath("actions/18/folder_project_root.svg"))))); - // m_projectRootNodes.push_back(projectRootNode); - // addChild(projectRootNode); - // } - + TProjectManager *pm = TProjectManager::instance(); TFilePath sandboxProjectPath = pm->getSandboxProjectFolder(); m_sandboxProjectNode = new DvDirModelProjectNode(this, sandboxProjectPath); addChild(m_sandboxProjectNode); + TFilePath projectPath = pm->getCurrentProjectPath().getParentDir(); + if (projectPath != pm->getSandboxProjectFolder()) { + m_currentProjectNode = new DvDirModelProjectNode(this, projectPath); + m_projectPaths.insert(projectPath); + addChild(m_currentProjectNode); + } + + if (m_projectPaths.size() > 1) { + for (auto i : m_projectPaths) { + if (i == projectPath) continue; + DvDirModelProjectNode *addedProjectNode = + new DvDirModelProjectNode(this, projectPath); + addChild(addedProjectNode); + } + } + // SVN Repositories QList repositories = VersionControl::instance()->getRepositories(); @@ -1117,6 +1117,17 @@ void DvDirModelRootNode::refreshChildren() { m_sceneFolderNode = new DvDirModelSceneFolderNode(this, L"Scene Folder", TFilePath()); m_sceneFolderNode->setPixmap(QPixmap(":Resources/clapboard.png")); + } else { + TProjectManager *pm = TProjectManager::instance(); + TFilePath projectPath = pm->getCurrentProjectPath().getParentDir(); + if (projectPath != pm->getSandboxProjectFolder() && + (m_projectPaths.find(projectPath) == m_projectPaths.end())) { + std::string rootString = projectPath.getQString().toStdString(); + m_currentProjectNode = new DvDirModelProjectNode(this, projectPath); + m_projectPaths.insert(projectPath); + addChild(m_currentProjectNode); + updateSceneFolderNodeVisibility(); + } } } @@ -1173,6 +1184,10 @@ DvDirModelNode *DvDirModelRootNode::getNodeByPath(const TFilePath &path) { if (node) return node; } + if (m_projectPaths.size() > 0 && m_currentProjectNode && + m_currentProjectNode->getPath() == path) + return m_currentProjectNode; + // or it could be the sandbox project or in the sandbox project if (m_sandboxProjectNode && m_sandboxProjectNode->getPath() == path) return m_sandboxProjectNode; @@ -1475,6 +1490,15 @@ DvDirModel *DvDirModel::instance() { void DvDirModel::onSceneSwitched() { DvDirModelRootNode *rootNode = dynamic_cast(m_root); if (rootNode) { + int projectPaths = rootNode->getProjectPathsSize(); + m_root->refreshChildren(); + if (rootNode->getProjectPathsSize() != projectPaths) { + TProjectManager *pm = TProjectManager::instance(); + TFilePath projectPath = pm->getCurrentProjectPath().getParentDir(); + QModelIndex index = getIndexByPath(projectPath); + refresh(index); + emit(projectAdded()); + } ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); if (scene) { if (scene->isUntitled()) diff --git a/toonz/sources/toonz/filebrowsermodel.h b/toonz/sources/toonz/filebrowsermodel.h index 56805911..8a5e8a7b 100644 --- a/toonz/sources/toonz/filebrowsermodel.h +++ b/toonz/sources/toonz/filebrowsermodel.h @@ -310,6 +310,8 @@ class DvDirModelRootNode final : public DvDirModelNode { DvDirModelMyComputerNode *m_myComputerNode; DvDirModelNetworkNode *m_networkNode; DvDirModelProjectNode *m_sandboxProjectNode; + DvDirModelProjectNode *m_currentProjectNode; + std::set m_projectPaths; DvDirModelSceneFolderNode *m_sceneFolderNode; std::vector m_specialNodes; @@ -318,6 +320,7 @@ class DvDirModelRootNode final : public DvDirModelNode { public: DvDirModelRootNode(); void refreshChildren() override; + int getProjectPathsSize() { return m_projectPaths.size(); } DvDirModelNode *getNodeByPath(const TFilePath &path) override; // QPixmap getPixmap(bool isOpen) const; @@ -381,6 +384,8 @@ public: emit beginInsertRows(parent, first, last); } void notifyEndInsertRows() { emit endInsertRows(); } +signals: + void projectAdded(); protected slots: // when the scene switched, update the path of the scene location node