1 #pragma once 2 3 #ifndef DVDIRTREEVIEW_H 4 #define DVDIRTREEVIEW_H 5 6 // Tnz6 includes 7 #include "dvitemview.h" 8 #include "versioncontrol.h" 9 #include "filebrowsermodel.h" 10 11 // TnzQt includes 12 #include "toonzqt/selection.h" 13 #include "toonzqt/lineedit.h" 14 15 // TnzCore includes 16 #include "tfilepath.h" 17 18 // Qt includes 19 #include <QTreeView> 20 #include <QItemDelegate> 21 #include <QWidget> 22 23 //============================================================== 24 25 // Forward declarations 26 27 class DvDirModel; 28 class DvDirModelNode; 29 class DvDirVersionControlNode; 30 class DvDirTreeView; 31 class QFileSystemWatcher; 32 33 //============================================================== 34 35 class MyFileSystemWatcher : public QObject { // singleton 36 Q_OBJECT 37 38 QStringList m_watchedPath; 39 QFileSystemWatcher *m_watcher; 40 MyFileSystemWatcher(); 41 42 public: instance()43 static MyFileSystemWatcher *instance() { 44 static MyFileSystemWatcher _instance; 45 return &_instance; 46 } 47 48 void addPaths(const QStringList &paths, bool onlyNewPath = false); 49 void removePaths(const QStringList &paths); 50 void removeAllPaths(); 51 52 signals: 53 void directoryChanged(const QString &path); 54 }; 55 56 //********************************************************************************** 57 // DvDirTreeView declaration 58 //********************************************************************************** 59 60 // StyledTreeView is inherited by DvDirTreeView and ExportSceneTreeView 61 // ( see exportscenepopup.h ) 62 63 class StyledTreeView : public QTreeView { 64 Q_OBJECT 65 66 QColor m_textColor; // text color (black) 67 QColor m_selectedTextColor; // selected item text color (white) 68 QColor m_folderTextColor; // folder item text color (blue) 69 QColor m_selectedFolderTextColor; // selected folder item text color (yellow) 70 QColor m_selectedItemBackground; // selected item background color (0,0,128) 71 72 Q_PROPERTY(QColor TextColor READ getTextColor WRITE setTextColor) Q_PROPERTY(QColor SelectedTextColor READ getSelectedTextColor WRITE setSelectedTextColor)73 Q_PROPERTY(QColor SelectedTextColor READ getSelectedTextColor WRITE 74 setSelectedTextColor) 75 Q_PROPERTY( 76 QColor FolderTextColor READ getFolderTextColor WRITE setFolderTextColor) 77 Q_PROPERTY(QColor SelectedFolderTextColor READ getSelectedFolderTextColor 78 WRITE setSelectedFolderTextColor) 79 Q_PROPERTY(QColor SelectedItemBackground READ getSelectedItemBackground WRITE 80 setSelectedItemBackground) 81 public: 82 StyledTreeView(QWidget *parent = 0) : QTreeView(parent) {} 83 setTextColor(const QColor & color)84 void setTextColor(const QColor &color) { m_textColor = color; } getTextColor()85 QColor getTextColor() const { return m_textColor; } setSelectedTextColor(const QColor & color)86 void setSelectedTextColor(const QColor &color) { 87 m_selectedTextColor = color; 88 } getSelectedTextColor()89 QColor getSelectedTextColor() const { return m_selectedTextColor; } setFolderTextColor(const QColor & color)90 void setFolderTextColor(const QColor &color) { m_folderTextColor = color; } getFolderTextColor()91 QColor getFolderTextColor() const { return m_folderTextColor; } setSelectedFolderTextColor(const QColor & color)92 void setSelectedFolderTextColor(const QColor &color) { 93 m_selectedFolderTextColor = color; 94 } getSelectedFolderTextColor()95 QColor getSelectedFolderTextColor() const { 96 return m_selectedFolderTextColor; 97 } setSelectedItemBackground(const QColor & color)98 void setSelectedItemBackground(const QColor &color) { 99 m_selectedItemBackground = color; 100 } getSelectedItemBackground()101 QColor getSelectedItemBackground() const { return m_selectedItemBackground; } 102 }; 103 104 class DvDirTreeView final : public StyledTreeView, public TSelection { 105 Q_OBJECT 106 107 public: 108 DvDirTreeView(QWidget *parent = 0); 109 110 TFilePath getCurrentPath() 111 const; //!< Returns the path of currently selected file or folder, 112 //! or an empty one in case it couldn't be extracted. 113 DvDirModelNode *getCurrentNode() const; getCurrentDropNode()114 DvDirModelNode *getCurrentDropNode() const { return m_currentDropItem; } 115 116 // From TSelection isEmpty()117 bool isEmpty() const override { return false; } selectNone()118 void selectNone() override {} 119 void enableCommands() override; 120 enableGlobalSelection(bool enabled)121 void enableGlobalSelection(bool enabled) { 122 if (!enabled) makeNotCurrent(); 123 m_globalSelectionEnabled = enabled; 124 } 125 126 void refreshVersionControl(DvDirVersionControlNode *node, 127 const QStringList &files = QStringList()); 128 setRefreshVersionControlEnabled(bool value)129 void setRefreshVersionControlEnabled(bool value) { 130 m_refreshVersionControlEnabled = value; 131 } refreshVersionControlEnabled()132 bool refreshVersionControlEnabled() const { 133 return m_refreshVersionControlEnabled; 134 } 135 136 DvItemListModel::Status getItemVersionControlStatus( 137 DvDirVersionControlNode *node, const TFilePath &fp); 138 139 signals: 140 141 void currentNodeChanged(); //!< Emitted when user selectes a different node. 142 143 public slots: 144 145 void deleteFolder(); //!< Deletes the selected folder. 146 147 void setCurrentNode( 148 DvDirModelNode *node); //!< Sets the current node, make it visible. 149 void setCurrentNode(const TFilePath &fp, bool expandNode = false); 150 void resizeToConts(void); 151 152 void cleanupVersionControl(DvDirVersionControlNode *node); 153 void purgeVersionControl(DvDirVersionControlNode *node); 154 void deleteVersionControl(DvDirVersionControlNode *node); 155 void putVersionControl(DvDirVersionControlNode *node); 156 void updateVersionControl(DvDirVersionControlNode *node); 157 158 void listVersionControl(DvDirVersionControlNode *lastExistingNode, 159 const QString &relativePath); 160 161 // Only for tnz "special folder" and project folder (working in this case on 162 // project settings xml file) 163 void editCurrentVersionControlNode(); 164 void unlockCurrentVersionControlNode(); 165 void revertCurrentVersionControlNode(); 166 167 void updateCurrentVersionControlNode(); 168 void putCurrentVersionControlNode(); 169 void deleteCurrentVersionControlNode(); 170 void refreshCurrentVersionControlNode(); 171 void cleanupCurrentVersionControlNode(); 172 void purgeCurrentVersionControlNode(); 173 174 void onInfoDone(const QString &); 175 void onListDone(const QString &); 176 177 void onCheckPartialLockError(const QString &); 178 void onCheckPartialLockDone(const QString &); 179 180 void onCheckOutError(const QString &); 181 void onCheckOutDone(const QString &); 182 183 void onRefreshStatusDone(const QString &); 184 void onRefreshStatusError(const QString &); 185 186 void onExpanded(const QModelIndex &); 187 void onCollapsed(const QModelIndex &); 188 void onMonitoredDirectoryChanged(const QString &); 189 void onPreferenceChanged(const QString &); 190 191 protected: 192 QSize sizeHint() const override; 193 194 void currentChanged(const QModelIndex ¤t, 195 const QModelIndex &previous) override; 196 bool edit(const QModelIndex &index, EditTrigger trigger, QEvent *ev) override; 197 void resizeEvent(QResizeEvent *) override; 198 199 void dragEnterEvent(QDragEnterEvent *event) override; 200 void dragLeaveEvent(QDragLeaveEvent *event) override; 201 void dragMoveEvent(QDragMoveEvent *event) override; 202 void dropEvent(QDropEvent *event) override; 203 204 void contextMenuEvent(QContextMenuEvent *event) override; 205 206 void createMenuAction(QMenu &menu, QString name, const char *slot, 207 bool enable = true); 208 209 void checkPartialLock(const QString &workingDir, const QStringList &files); 210 211 private: 212 bool m_globalSelectionEnabled; 213 DvDirModelNode *m_currentDropItem; 214 VersionControlThread m_thread; 215 216 bool m_refreshVersionControlEnabled; 217 218 // Temporary variable used while retrieving list of missing directories 219 QString m_getSVNListRelativePath; 220 221 // Using for version control node refreshing 222 DvDirVersionControlNode *m_currentRefreshedNode; 223 224 /*- Refresh monitoring paths according to expand/shrink state of the folder 225 * tree -*/ 226 void addPathsToWatcher(); 227 void getExpandedPathsRecursive(const QModelIndex &, QStringList &); 228 }; 229 230 //********************************************************************************** 231 // DvDirTreeViewDelegate declaration 232 //********************************************************************************** 233 234 class DvDirTreeViewDelegate final : public QItemDelegate { 235 Q_OBJECT 236 237 public: 238 DvDirTreeViewDelegate(DvDirTreeView *parent); 239 ~DvDirTreeViewDelegate(); 240 241 QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, 242 const QModelIndex &index) const override; 243 244 bool editorEvent(QEvent *event, QAbstractItemModel *model, 245 const QStyleOptionViewItem &option, 246 const QModelIndex &index) override; 247 void paint(QPainter *painter, const QStyleOptionViewItem &option, 248 const QModelIndex &index) const override; 249 250 void setEditorData(QWidget *editor, const QModelIndex &index) const override; 251 void setModelData(QWidget *editor, QAbstractItemModel *model, 252 const QModelIndex &index) const override; 253 254 QSize sizeHint(const QStyleOptionViewItem &option, 255 const QModelIndex &index) const override; 256 void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, 257 const QModelIndex &index) const override; 258 259 private: 260 DvDirTreeView *m_treeView; 261 262 private slots: 263 264 void commitAndCloseEditor(); 265 }; 266 267 //********************************************************************************** 268 // NodeEditor declaration 269 //********************************************************************************** 270 271 class NodeEditor final : public QWidget { 272 Q_OBJECT 273 274 public: 275 NodeEditor(QWidget *parent = 0, QRect rect = QRect(), int leftMargin = 0); 276 setText(QString value)277 void setText(QString value) { m_lineEdit->setText(value); } getText()278 QString getText() const { return m_lineEdit->text(); } 279 280 signals: 281 282 void editingFinished(); 283 284 protected: 285 void focusInEvent(QFocusEvent *event) override; 286 287 protected slots: 288 289 void emitFinished(); 290 291 private: 292 DVGui::LineEdit *m_lineEdit; 293 }; 294 295 #endif // DVDIRTREEVIEW_H 296