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