1 #pragma once
2 
3 #ifndef FILEBROWSERMODEL_INCLUDED
4 #define FILEBROWSERMODEL_INCLUDED
5 
6 #include <QAbstractItemModel>
7 #include <QPixmap>
8 #include <QMap>
9 #include "tfilepath.h"
10 #include "toonz/toonzfolders.h"
11 
12 #include "versioncontrol.h"
13 
14 class FileBrowser;
15 class DvDirVersionControlRootNode;
16 
17 //-----------------------------------------------------------------------------
18 
19 class DvDirModelNode {
20   DvDirModelNode *m_parent;
21   int m_row;
22   bool m_renameEnabled;
23 
24 protected:
25   std::wstring m_name;
26   std::wstring m_oldName;  // Used for temporary Name
27   std::string m_nodeType;
28   std::vector<DvDirModelNode *> m_children;
29   bool m_childrenValid;
30 
31 public:
32   DvDirModelNode(DvDirModelNode *parent, std::wstring name);
33   virtual ~DvDirModelNode();
34 
getParent()35   DvDirModelNode *getParent() const { return m_parent; }
getName()36   std::wstring getName() const { return m_name; }
setName(std::wstring newName)37   virtual bool setName(std::wstring newName) { return false; }
38 
39   void setTemporaryName(const std::wstring &newName);
40   void restoreName();
41 
getRow()42   int getRow() const { return m_row; }
setRow(int row)43   void setRow(int row) { m_row = row; }
44 
45   void removeChildren(int row, int count);
46   void addChild(DvDirModelNode *child);
visualizeContent(FileBrowser * browser)47   virtual void visualizeContent(FileBrowser *browser) {}  // ?????????????
48 
49   virtual QPixmap getPixmap(bool isOpen) const;
50 
51   int getChildCount();
52   DvDirModelNode *getChild(int index);
53 
54   virtual void refreshChildren() = 0;
55   virtual bool hasChildren();
56 
rowByName(const std::wstring & name)57   virtual int rowByName(const std::wstring &name) const {
58     return -1;
59   }  // ?????????????
60 
enableRename(bool enabled)61   void enableRename(bool enabled) { m_renameEnabled = enabled; }
isRenameEnabled()62   bool isRenameEnabled() const { return m_renameEnabled; }
63 
isFolder(const TFilePath & folderPath)64   virtual bool isFolder(const TFilePath &folderPath) const {
65     return false;
66   }  // ?????????????
isFolder()67   virtual bool isFolder() const { return false; }
68 
areChildrenValid()69   bool areChildrenValid() const { return m_childrenValid; }  // ?????????????
70 
getNodeType()71   std::string getNodeType() const { return m_nodeType; }
72 
getNodeByPath(const TFilePath & path)73   virtual DvDirModelNode *getNodeByPath(const TFilePath &path) { return 0; }
74 
getVersionControlRootNode()75   virtual DvDirVersionControlRootNode *getVersionControlRootNode() { return 0; }
76 };
77 
78 //-----------------------------------------------------------------------------
79 
80 class DvDirModelFileFolderNode : public DvDirModelNode {
81 protected:
82   TFilePath m_path;                //!< The folder path
83   bool m_isProjectFolder;          //!< Whether this is a project folder
84   bool m_existsChecked, m_exists;  //!< Whether the folder exists on the file
85                                    //! system (a node could exist
86   //!< on a remote version control repository, without an actual copy on disk).
87   bool m_hasChildren;  //!< Cached info about sub-folders existence
88   bool m_peeks;        //!< Whether this folder allows peeking (typically
89                        //!< to gather additional data on sub-folders existence)
90 public:
91   DvDirModelFileFolderNode(DvDirModelNode *parent, std::wstring name,
92                            const TFilePath &path);
93   DvDirModelFileFolderNode(DvDirModelNode *parent, const TFilePath &path);
94 
95   QPixmap getPixmap(bool isOpen) const override;
getPath()96   TFilePath getPath() const { return m_path; }
97   void visualizeContent(FileBrowser *browser) override;  //?????????????
98 
99   void refreshChildren() override;
100   bool hasChildren() override;
101   virtual void getChildrenNames(std::vector<std::wstring> &names) const;
102   virtual DvDirModelNode *makeChild(std::wstring name);
103   int rowByName(const std::wstring &name) const override;  //?????
104 
105   bool setName(std::wstring newName) override;  // chiamarlo rename ????
isFolder(const TFilePath & folderPath)106   bool isFolder(const TFilePath &folderPath) const override {
107     return folderPath == m_path;
108   }
isFolder()109   bool isFolder() const override { return !m_path.isEmpty(); }
110 
111   static DvDirModelFileFolderNode *createNode(DvDirModelNode *parent,
112                                               const TFilePath &path);
113 
114   DvDirModelNode *getNodeByPath(const TFilePath &path) override;
115 
isProjectFolder()116   bool isProjectFolder() const { return m_isProjectFolder; }
setIsProjectFolder(bool yes)117   void setIsProjectFolder(bool yes) { m_isProjectFolder = yes; }
118 
119   bool exists();
setExists(bool yes)120   void setExists(bool yes) { m_existsChecked = true, m_exists = yes; }
121 
peeks()122   bool peeks() const { return m_peeks; }
setPeeking(bool yes)123   void setPeeking(bool yes) { m_peeks = yes; }
124 };
125 
126 //-----------------------------------------------------------------------------
127 
128 class DvDirModelSpecialFileFolderNode : public DvDirModelFileFolderNode {
129   QPixmap m_pixmap;
130 
131 public:
132   DvDirModelSpecialFileFolderNode(DvDirModelNode *parent, std::wstring name,
133                                   const TFilePath &localPath);
134   QPixmap getPixmap(bool isOpen) const override;
135   void setPixmap(const QPixmap &pixmap);
136 };
137 
138 //-----------------------------------------------------------------------------
139 
140 class DvDirModelSceneFolderNode final : public DvDirModelSpecialFileFolderNode {
141 public:
DvDirModelSceneFolderNode(DvDirModelNode * parent,std::wstring name,const TFilePath & localPath)142   DvDirModelSceneFolderNode(DvDirModelNode *parent, std::wstring name,
143                             const TFilePath &localPath)
144       : DvDirModelSpecialFileFolderNode(parent, name, localPath) {}
setPath(const TFilePath & path)145   void setPath(const TFilePath &path) {
146     m_path = path;
147     refreshChildren();
148   }
149 };
150 
151 //-----------------------------------------------------------------------------
152 
153 class DvDirVersionControlNode : public DvDirModelFileFolderNode {
154 private:
155   QPixmap m_pixmap;
156   bool m_isSynched;
157   bool m_isUnversioned;
158   bool m_isUnderVersionControl;
159 
160   // items contained in the folder: Filename, Version Control Status
161   QMap<QString, SVNStatus> m_statusMap;
162 
163   std::wstring m_oldName;
164 
165 public:
166   DvDirVersionControlNode(DvDirModelNode *parent, std::wstring name,
167                           const TFilePath &path);
168 
169   DvDirModelNode *makeChild(std::wstring name) override;
170   QPixmap getPixmap(bool isOpen) const override;
171 
172   void getChildrenNames(std::vector<std::wstring> &names) const override;
173 
174   QList<TFilePath> getMissingFiles() const;
175   QStringList getMissingFiles(const QRegExp &filter) const;
176   QList<TFilePath> getMissingFolders() const;
177 
178   void insertVersionControlStatus(const QString &fileName, SVNStatus status);
179   SVNStatus getVersionControlStatus(const QString &fileName);
180 
181   // Refresh the status map
182   // Return the list of files that needs to be check against partialLock
183   // properties
184   // Update the synched and isUnderVersionControl boolean values
185   QStringList refreshVersionControl(const QList<SVNStatus> &status);
186 
187   // Also enable/disable rename
188   void setIsUnderVersionControl(bool value);
isUnderVersionControl()189   bool isUnderVersionControl() const { return m_isUnderVersionControl; }
190 
setIsSynched(bool value)191   void setIsSynched(bool value) { m_isSynched = value; }
isSynched()192   bool isSynched() const { return m_isSynched; }
193 
setIsUnversioned(bool value)194   void setIsUnversioned(bool value) { m_isUnversioned = value; }
isUnversioned()195   bool isUnversioned() const { return m_isUnversioned; }
196 
197   DvDirVersionControlRootNode *getVersionControlRootNode() override;
198 };
199 
200 //-----------------------------------------------------------------------------
201 
202 class DvDirVersionControlRootNode final : public DvDirVersionControlNode {
203   QPixmap m_pixmap;
204   std::wstring m_repositoryPath;
205   std::wstring m_localPath;
206   std::wstring m_userName;
207   std::wstring m_password;
208 
209 public:
210   DvDirVersionControlRootNode(DvDirModelNode *parent, std::wstring name,
211                               const TFilePath &localPath);
212   void refreshChildren() override;
213 
getPixmap(bool isOpen)214   QPixmap getPixmap(bool isOpen) const override { return m_pixmap; }
setPixmap(const QPixmap & pixmap)215   void setPixmap(const QPixmap &pixmap) { m_pixmap = pixmap; }
216 
setLocalPath(const std::wstring & localPath)217   void setLocalPath(const std::wstring &localPath) { m_localPath = localPath; }
getLocalPath()218   std::wstring getLocalPath() { return m_localPath; }
setRepositoryPath(const std::wstring & repoPath)219   void setRepositoryPath(const std::wstring &repoPath) {
220     m_repositoryPath = repoPath;
221   }
getRepositoryPath()222   std::wstring getRepositoryPath() { return m_repositoryPath; }
223 
setUserName(const std::wstring & userName)224   void setUserName(const std::wstring &userName) { m_userName = userName; }
getUserName()225   std::wstring getUserName() const { return m_userName; }
226 
setPassword(const std::wstring & password)227   void setPassword(const std::wstring &password) { m_password = password; }
getPassword()228   std::wstring getPassword() const { return m_password; }
229 
getVersionControlRootNode()230   DvDirVersionControlRootNode *getVersionControlRootNode() override {
231     return this;
232   }
233 };
234 
235 //-----------------------------------------------------------------------------
236 
237 class DvDirVersionControlProjectNode final : public DvDirVersionControlNode {
238 public:
239   DvDirVersionControlProjectNode(DvDirModelNode *parent, std::wstring name,
240                                  const TFilePath &path);
241   TFilePath getProjectPath() const;
242   bool isCurrent() const;
243   void makeCurrent();
244   QPixmap getPixmap(bool isOpen) const override;
245   void refreshChildren() override;
246   void getChildrenNames(std::vector<std::wstring> &names) const override;
247   // DvDirModelNode *makeChild(std::wstring name);
248 };
249 
250 //-----------------------------------------------------------------------------
251 
252 class DvDirModelProjectNode final : public DvDirModelFileFolderNode {
253 public:
254   DvDirModelProjectNode(DvDirModelNode *parent, const TFilePath &path);
255   TFilePath getProjectPath() const;
256   bool isCurrent() const;
257   void makeCurrent();
258   QPixmap getPixmap(bool isOpen) const override;
259   void refreshChildren() override;
260   void getChildrenNames(std::vector<std::wstring> &names) const override;
261   DvDirModelNode *makeChild(std::wstring name) override;
262 };
263 
264 //-----------------------------------------------------------------------------
265 
266 class DvDirModelDayNode final : public DvDirModelNode {
267   std::string m_dayDateString;
268 
269 public:
270   DvDirModelDayNode(DvDirModelNode *parent, std::wstring dayDateString);
refreshChildren()271   void refreshChildren() override {}
272   void visualizeContent(FileBrowser *browser) override;  //??????????????????
273   QPixmap getPixmap(bool isOpen) const override;
274 };
275 
276 //-----------------------------------------------------------------------------
277 
278 class DvDirModelHistoryNode final : public DvDirModelNode {
279 public:
280   DvDirModelHistoryNode(DvDirModelNode *parent);
281   void refreshChildren() override;
282   QPixmap getPixmap(bool isOpen) const override;
283 };
284 
285 //-----------------------------------------------------------------------------
286 
287 class DvDirModelMyComputerNode final : public DvDirModelNode {
288 public:
289   DvDirModelMyComputerNode(DvDirModelNode *parent);
290   void refreshChildren() override;
291   QPixmap getPixmap(bool isOpen) const override;
isFolder()292   bool isFolder() const override { return true; }
293 };
294 
295 //-----------------------------------------------------------------------------
296 
297 class DvDirModelNetworkNode final : public DvDirModelNode {
298 public:
299   DvDirModelNetworkNode(DvDirModelNode *parent);
300   void refreshChildren() override;
301   QPixmap getPixmap(bool isOpen) const override;
isFolder()302   bool isFolder() const override { return true; }
303 };
304 
305 //-----------------------------------------------------------------------------
306 
307 class DvDirModelRootNode final : public DvDirModelNode {
308   std::vector<DvDirModelFileFolderNode *> m_projectRootNodes;
309   std::vector<DvDirModelFileFolderNode *> m_versionControlNodes;
310   DvDirModelMyComputerNode *m_myComputerNode;
311   DvDirModelNetworkNode *m_networkNode;
312   DvDirModelProjectNode *m_sandboxProjectNode;
313   DvDirModelSceneFolderNode *m_sceneFolderNode;
314   std::vector<DvDirModelSpecialFileFolderNode *> m_specialNodes;
315 
316   void add(std::wstring name, const TFilePath &path);
317 
318 public:
319   DvDirModelRootNode();
320   void refreshChildren() override;
321 
322   DvDirModelNode *getNodeByPath(const TFilePath &path) override;
323   // QPixmap getPixmap(bool isOpen) const;
324 
325   // set the path of sceneLocationNode
326   void setSceneLocation(const TFilePath &path);
327   void updateSceneFolderNodeVisibility(bool forceHide = false);
328 };
329 
330 //=============================================================================
331 
332 // singleton
333 class DvDirModel final : public QAbstractItemModel,
334                          public FolderListenerManager::Listener {
335   Q_OBJECT
336 
337   DvDirModelNode *m_root;
338 
339 public:
340   DvDirModel();
341   ~DvDirModel();
342 
343   static DvDirModel *instance();
344 
345   void onFolderChanged(const TFilePath &path) override;
346 
347   DvDirModelNode *getNode(const QModelIndex &index) const;
348 
349   QModelIndex index(int row, int column,
350                     const QModelIndex &parent) const override;
351   QModelIndex parent(const QModelIndex &index) const override;
352 
353   QModelIndex getIndexByPath(const TFilePath &path) const;
354   QModelIndex getIndexByNode(DvDirModelNode *node) const;
355 
356   QModelIndex childByName(const QModelIndex &parent,
357                           const std::wstring &name) const;
358 
columnCount(const QModelIndex & parent)359   int columnCount(const QModelIndex &parent) const override { return 1; }
360   QVariant data(const QModelIndex &index,
361                 int role = Qt::DisplayRole) const override;
362   Qt::ItemFlags flags(const QModelIndex &index) const override;
363   bool setData(const QModelIndex &index, const QVariant &value,
364                int role = Qt::EditRole) override;
365   int rowCount(const QModelIndex &parent = QModelIndex()) const override;
366   bool hasChildren(const QModelIndex &parent = QModelIndex()) const override;
367   void refresh(const QModelIndex &index);
368   void refreshFolder(const TFilePath &folderPath,
369                      const QModelIndex &i = QModelIndex());
370   void refreshFolderChild(const QModelIndex &i = QModelIndex());
371   bool removeRows(int row, int count,
372                   const QModelIndex &parent = QModelIndex()) override;
373 
374   QModelIndex getCurrentProjectIndex() const;
375 
notifyBeginRemoveRows(const QModelIndex & parent,int first,int last)376   void notifyBeginRemoveRows(const QModelIndex &parent, int first, int last) {
377     emit beginRemoveRows(parent, first, last);
378   }
notifyEndRemoveRows()379   void notifyEndRemoveRows() { emit endRemoveRows(); }
notifyBeginInsertRows(const QModelIndex & parent,int first,int last)380   void notifyBeginInsertRows(const QModelIndex &parent, int first, int last) {
381     emit beginInsertRows(parent, first, last);
382   }
notifyEndInsertRows()383   void notifyEndInsertRows() { emit endInsertRows(); }
384 
385 protected slots:
386   // when the scene switched, update the path of the scene location node
387   void onSceneSwitched();
388   void onPreferenceChanged(const QString &);
389 };
390 
391 #endif
392