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 &current,
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