1 
2 
3 #include "toonz/toonzfolders.h"
4 #include "tsystem.h"
5 #include "tenv.h"
6 #include "tconvert.h"
7 #include "toonz/preferences.h"
8 #include <QStandardPaths>
9 #include <QDir>
10 
11 using namespace TEnv;
12 
13 //-------------------------------------------------------------------
14 namespace {
getMyDocumentsPath()15 TFilePath getMyDocumentsPath() {
16   QString documentsPath =
17       QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0];
18   return TFilePath(documentsPath);
19 }
20 
21 // Desktop Path
getDesktopPath()22 TFilePath getDesktopPath() {
23   QString desktopPath =
24       QStandardPaths::standardLocations(QStandardPaths::DesktopLocation)[0];
25   return TFilePath(desktopPath);
26 }
27 }  // namespace
28 //-------------------------------------------------------------------
29 
getModulesDir()30 TFilePath ToonzFolder::getModulesDir() {
31   return getProfileFolder() + "layouts";
32 }
33 
getProjectsFolders()34 TFilePathSet ToonzFolder::getProjectsFolders() {
35   int location = Preferences::instance()->getProjectRoot();
36   QString path = Preferences::instance()->getCustomProjectRoot();
37   TFilePathSet fps;
38   int projectPaths = Preferences::instance()->getProjectRoot();
39   bool stuff       = projectPaths & 0x08;
40   bool documents   = projectPaths & 0x04;
41   bool desktop     = projectPaths & 0x02;
42   bool custom      = projectPaths & 0x01;
43 
44   // make sure at least something is there
45   if (!desktop && !custom && !documents) stuff = 1;
46   TFilePathSet tempFps =
47       getSystemVarPathSetValue(getSystemVarPrefix() + "PROJECTS");
48   if (stuff) {
49     for (TFilePath tempPath : tempFps) {
50       if (TSystem::doesExistFileOrLevel(TFilePath(tempPath))) {
51         fps.push_back(TFilePath(tempPath));
52       }
53     }
54     if (tempFps.size() == 0)
55       fps.push_back(TEnv::getStuffDir() +
56                     TEnv::getSystemPathMap().at("PROJECTS"));
57   }
58   if (documents) {
59     fps.push_back(getMyDocumentsPath() + "OpenToonz");
60     if (!TSystem::doesExistFileOrLevel(getMyDocumentsPath() + "OpenToonz")) {
61       TSystem::mkDir(getMyDocumentsPath() + "OpenToonz");
62     }
63   }
64   if (desktop) {
65     fps.push_back(getDesktopPath() + "OpenToonz");
66     if (!TSystem::doesExistFileOrLevel(getDesktopPath() + "OpenToonz")) {
67       TSystem::mkDir(getDesktopPath() + "OpenToonz");
68     }
69   }
70   if (custom) {
71     QStringList paths = path.split("**");
72     for (QString tempPath : paths) {
73       if (TSystem::doesExistFileOrLevel(TFilePath(tempPath))) {
74         fps.push_back(TFilePath(tempPath));
75       }
76     }
77   }
78   return fps;
79 }
80 
getFirstProjectsFolder()81 TFilePath ToonzFolder::getFirstProjectsFolder() {
82   TFilePathSet fps = getProjectsFolders();
83   if (fps.empty())
84     return TFilePath();
85   else
86     return *fps.begin();
87 }
88 
getLibraryFolder()89 TFilePath ToonzFolder::getLibraryFolder() {
90   TFilePath fp = getSystemVarPathValue(getSystemVarPrefix() + "LIBRARY");
91   if (fp == TFilePath())
92     fp = getStuffDir() + TEnv::getSystemPathMap().at("LIBRARY");
93   return fp;
94 }
95 
getStudioPaletteFolder()96 TFilePath ToonzFolder::getStudioPaletteFolder() {
97   TFilePath fp = getSystemVarPathValue(getSystemVarPrefix() + "STUDIOPALETTE");
98   if (fp == TFilePath())
99     fp = getStuffDir() + TEnv::getSystemPathMap().at("STUDIOPALETTE");
100   return fp;
101 }
102 
getFxPresetFolder()103 TFilePath ToonzFolder::getFxPresetFolder() {
104   TFilePath fp = getSystemVarPathValue(getSystemVarPrefix() + "FXPRESETS");
105   if (fp == TFilePath())
106     fp = getStuffDir() + TEnv::getSystemPathMap().at("FXPRESETS");
107   return fp;
108 }
109 
getCacheRootFolder()110 TFilePath ToonzFolder::getCacheRootFolder() {
111   static enum STATE { FIRSTTIME, OK, NG } state = FIRSTTIME;
112   QString cacheDir =
113       QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
114   if (state == FIRSTTIME) {
115     if (QDir(cacheDir).mkpath("."))
116       state = OK;
117     else
118       state = NG;
119   }
120   return (state == OK) ? TFilePath(cacheDir) : TFilePath();
121 }
122 
getProfileFolder()123 TFilePath ToonzFolder::getProfileFolder() {
124   TFilePath fp = getSystemVarPathValue(getSystemVarPrefix() + "PROFILES");
125   if (fp == TFilePath())
126     fp = getStuffDir() + TEnv::getSystemPathMap().at("PROFILES");
127   return fp;
128 }
129 
getReslistPath(bool forCleanup)130 TFilePath ToonzFolder::getReslistPath(bool forCleanup) {
131   return getConfigDir() + (forCleanup ? "cleanupreslist.txt" : "reslist.txt");
132 }
133 
getTemplateModuleDir()134 TFilePath ToonzFolder::getTemplateModuleDir() {
135   // return getModulesDir() + getModuleName();
136   return getModulesDir() + "settings";
137 }
138 
getMyModuleDir()139 TFilePath ToonzFolder::getMyModuleDir() {
140   TFilePath fp(getTemplateModuleDir());
141   return fp.withName(fp.getWideName() + L"." +
142                      TSystem::getUserName().toStdWString());
143 }
144 
getModuleFile(TFilePath filename)145 TFilePath ToonzFolder::getModuleFile(TFilePath filename) {
146   TFilePath fp = getMyModuleDir() + filename;
147   if (TFileStatus(fp).doesExist()) return fp;
148   fp = getTemplateModuleDir() + filename;
149   return fp;
150 }
151 
getModuleFile(std::string fn)152 TFilePath ToonzFolder::getModuleFile(std::string fn) {
153   return ToonzFolder::getModuleFile(TFilePath(fn));
154 }
155 
156 // turtle
getRoomsDir()157 TFilePath ToonzFolder::getRoomsDir() {
158   return getProfileFolder() + "layouts/rooms";
159 }
160 
getTemplateRoomsDir()161 TFilePath ToonzFolder::getTemplateRoomsDir() {
162   return getRoomsDir() +
163          Preferences::instance()->getCurrentRoomChoice().toStdWString();
164   // TFilePath fp(getMyModuleDir() + TFilePath(mySettingsFileName));
165   // return getRoomsDir() + getModuleName();
166 }
167 
getMyRoomsDir()168 TFilePath ToonzFolder::getMyRoomsDir() {
169   // TFilePath fp(getTemplateRoomsDir());
170   TFilePath fp(getProfileFolder());
171   return fp.withName(
172       fp.getWideName() + L"/layouts/personal/" +
173       Preferences::instance()->getCurrentRoomChoice().toStdWString() + L"." +
174       TSystem::getUserName().toStdWString());
175 }
176 
getRoomsFile(TFilePath filename)177 TFilePath ToonzFolder::getRoomsFile(TFilePath filename) {
178   TFilePath fp = getMyRoomsDir() + filename;
179   if (TFileStatus(fp).doesExist()) return fp;
180   fp = getTemplateRoomsDir() + filename;
181   return fp;
182 }
183 
getRoomsFile(std::string fn)184 TFilePath ToonzFolder::getRoomsFile(std::string fn) {
185   return ToonzFolder::getRoomsFile(TFilePath(fn));
186 }
187 
188 //===================================================================
189 
FolderListenerManager()190 FolderListenerManager::FolderListenerManager() {}
191 
192 //-------------------------------------------------------------------
193 
~FolderListenerManager()194 FolderListenerManager::~FolderListenerManager() {}
195 
196 //-------------------------------------------------------------------
197 
instance()198 FolderListenerManager *FolderListenerManager::instance() {
199   static FolderListenerManager _instance;
200   return &_instance;
201 }
202 
203 //-------------------------------------------------------------------
204 
notifyFolderChanged(const TFilePath & path)205 void FolderListenerManager::notifyFolderChanged(const TFilePath &path) {
206   for (std::set<Listener *>::iterator i = m_listeners.begin();
207        i != m_listeners.end(); ++i)
208     (*i)->onFolderChanged(path);
209 }
210 
211 //-------------------------------------------------------------------
212 
addListener(Listener * listener)213 void FolderListenerManager::addListener(Listener *listener) {
214   m_listeners.insert(listener);
215 }
216 
217 //-------------------------------------------------------------------
218 
removeListener(Listener * listener)219 void FolderListenerManager::removeListener(Listener *listener) {
220   m_listeners.erase(listener);
221 }
222