1 #pragma once
2 
3 #ifndef XSHCOLUMNVIEWER_H
4 #define XSHCOLUMNVIEWER_H
5 
6 #include "tapp.h"
7 
8 #include "toonz/tstageobject.h"
9 #include "toonz/txsheethandle.h"
10 #include "toonz/tscenehandle.h"
11 #include "toonz/tcolumnhandle.h"
12 #include "toonz/txsheet.h"
13 
14 #include "../include/tundo.h"
15 #include "../include/historytypes.h"
16 
17 #include <QWidget>
18 #include <QListWidget>
19 #include <QLineEdit>
20 #include <QPoint>
21 #include <QColor>
22 
23 // forward declaration
24 class XsheetViewer;
25 class TObjectHandle;
26 class TXsheetHandle;
27 class TStageObjectId;
28 class TXshColumn;
29 class QComboBox;
30 class Orientation;
31 class TApp;
32 class TXsheet;
33 
34 //=============================================================================
35 namespace XsheetGUI {
36 
37 class DragTool;
38 
39 //=============================================================================
40 // MotionPathMenu
41 //-----------------------------------------------------------------------------
42 
43 class MotionPathMenu final : public QWidget {
44   Q_OBJECT
45 
46   QRect m_mDeleteRect;
47   QRect m_mNormalRect;
48   QRect m_mRotateRect;
49   QPoint m_pos;
50 
51 public:
52 #if QT_VERSION >= 0x050500
53   MotionPathMenu(QWidget *parent = 0, Qt::WindowFlags flags = 0);
54 #else
55   MotionPathMenu(QWidget *parent = 0, Qt::WFlags flags = 0);
56 #endif
57 
58   ~MotionPathMenu();
59 
60 protected:
61   void paintEvent(QPaintEvent *) override;
62   void mousePressEvent(QMouseEvent *event) override;
63   void mouseMoveEvent(QMouseEvent *event) override;
64   void mouseReleaseEvent(QMouseEvent *event) override;
65   void leaveEvent(QEvent *event) override;
66 };
67 
68 //=============================================================================
69 // ChangeParentObjectWidget
70 //-----------------------------------------------------------------------------
71 
72 class ChangeObjectWidget : public QListWidget {
73   Q_OBJECT
74 
75 protected:
76   TObjectHandle *m_objectHandle;
77   TXsheetHandle *m_xsheetHandle;
78   int m_width;
79 
80 public:
81   ChangeObjectWidget(QWidget *parent = 0);
82   ~ChangeObjectWidget();
83 
84   void show(const QPoint &pos);
85   void setObjectHandle(TObjectHandle *objectHandle);
86   void setXsheetHandle(TXsheetHandle *xsheetHandle);
87 
refresh()88   virtual void refresh(){};
89 
90 protected:
91   void mouseMoveEvent(QMouseEvent *event) override;
92   void focusOutEvent(QFocusEvent *e) override;
focusInEvent(QFocusEvent * e)93   void focusInEvent(QFocusEvent *e) override {}
94   void selectCurrent(const QString &text);
95 
96 protected slots:
97   virtual void onTextChanged(const QString &) = 0;
98 };
99 
100 //=============================================================================
101 // ChangeObjectParent
102 //-----------------------------------------------------------------------------
103 
104 class ChangeObjectParent final : public ChangeObjectWidget {
105   Q_OBJECT
106 
107 public:
108   ChangeObjectParent(QWidget *parent = 0);
109   ~ChangeObjectParent();
110 
111   void refresh() override;
112 
113 protected slots:
114   void onTextChanged(const QString &) override;
115 };
116 
117 //=============================================================================
118 // ChangeObjectHandle
119 //-----------------------------------------------------------------------------
120 
121 class ChangeObjectHandle final : public ChangeObjectWidget {
122   Q_OBJECT
123 
124 public:
125   ChangeObjectHandle(QWidget *parent = 0);
126   ~ChangeObjectHandle();
127 
128   void refresh() override;
129 
130 protected slots:
131   void onTextChanged(const QString &) override;
132 };
133 
134 //=============================================================================
135 // RenameColumnField
136 //-----------------------------------------------------------------------------
137 
138 class RenameColumnField final : public QLineEdit {
139   Q_OBJECT
140 
141   int m_col;
142 
143   TXsheetHandle *m_xsheetHandle;
144 
145 public:
146   RenameColumnField(QWidget *parent, XsheetViewer *viewer);
~RenameColumnField()147   ~RenameColumnField() {}
148 
setXsheetHandle(TXsheetHandle * xsheetHandle)149   void setXsheetHandle(TXsheetHandle *xsheetHandle) {
150     m_xsheetHandle = xsheetHandle;
151   }
152 
153   void show(const QRect &rect, int col);
154 
155 protected:
156   void focusOutEvent(QFocusEvent *) override;
157 
158 protected slots:
159   void renameColumn();
160 };
161 
162 //=============================================================================
163 // CameraColumnSwitchUndo
164 //-----------------------------------------------------------------------------
165 class CameraColumnSwitchUndo final : public TUndo {
166   int m_oldCameraIndex, m_newCameraIndex;
167   TXsheetHandle *m_xsheetHandle;
168 
169 public:
CameraColumnSwitchUndo(int oldIndex,int newIndex,TXsheetHandle * xshHandle)170   CameraColumnSwitchUndo(int oldIndex, int newIndex, TXsheetHandle *xshHandle)
171       : m_oldCameraIndex(oldIndex)
172       , m_newCameraIndex(newIndex)
173       , m_xsheetHandle(xshHandle) {}
~CameraColumnSwitchUndo()174   ~CameraColumnSwitchUndo() {}
175 
undo()176   void undo() const override {
177     m_xsheetHandle->getXsheet()->setCameraColumnIndex(m_oldCameraIndex);
178     TApp::instance()->getCurrentScene()->notifySceneChanged();
179     TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
180     TApp::instance()->getCurrentColumn()->notifyColumnIndexSwitched();
181   }
182 
redo()183   void redo() const override {
184     m_xsheetHandle->getXsheet()->setCameraColumnIndex(m_newCameraIndex);
185     TApp::instance()->getCurrentScene()->notifySceneChanged();
186     TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
187     TApp::instance()->getCurrentColumn()->notifyColumnIndexSwitched();
188   }
189 
getSize()190   int getSize() const override { return sizeof(*this); }
191 
getHistoryString()192   QString getHistoryString() override {
193     TStageObjectId objId = TStageObjectId::CameraId(m_newCameraIndex);
194     TStageObject *obj    = m_xsheetHandle->getXsheet()->getStageObject(objId);
195     std::string objName  = obj->getName();
196     QString str          = QObject::tr("Camera Column Switch :  ") +
197                   QString::fromStdString(objName);
198     return str;
199   }
200 
getHistoryType()201   int getHistoryType() override { return HistoryType::Xsheet; }
202 };
203 
204 //=============================================================================
205 // ColumnArea
206 //-----------------------------------------------------------------------------
207 
208 class ColumnTransparencyPopup final : public QWidget {
209   Q_OBJECT
210 
211   QSlider *m_slider;
212   QLineEdit *m_value;
213   TXshColumn *m_column;
214 
215   QComboBox *m_filterColorCombo;
216 
217 public:
218   ColumnTransparencyPopup(QWidget *parent);
219   void setColumn(TXshColumn *column);
220 
221 protected:
222   // void mouseMoveEvent ( QMouseEvent * e );
223   void mouseReleaseEvent(QMouseEvent *e) override;
224 
225 protected slots:
226   void onSliderReleased();
227   void onSliderChange(int val);
228   void onSliderValueChanged(int);
229   void onValueChanged(const QString &);
230 
231   void onFilterColorChanged(int id);
232 };
233 
234 class SoundColumnPopup final : public QWidget {
235   Q_OBJECT
236 
237   QSlider *m_slider;
238   QLineEdit *m_value;
239   TXshColumn *m_column;
240 
241 public:
242   SoundColumnPopup(QWidget *parent);
243   void setColumn(TXshColumn *column);
244 
245 protected:
246   // void mouseMoveEvent ( QMouseEvent * e );
247   void mouseReleaseEvent(QMouseEvent *e) override;
248 
249 protected slots:
250   void onSliderReleased();
251   void onSliderChange(int val);
252   void onSliderValueChanged(int);
253   void onValueChanged(const QString &);
254 };
255 
256 //! The class in charge of the region showing layer headers
257 class ColumnArea final : public QWidget {
258   Q_OBJECT
259 
260   enum {
261     ToggleTransparency = 1,
262     ToggleAllTransparency,
263     TogglePreviewVisible,
264     ToggleAllPreviewVisible,
265     ToggleLock,
266     ToggleAllLock,
267     OpenSettings
268   };
269 
270   ColumnTransparencyPopup *m_columnTransparencyPopup;
271   SoundColumnPopup *m_soundColumnPopup;
272   QTimer *m_transparencyPopupTimer;
273   int m_doOnRelease;
274   XsheetViewer *m_viewer;
275   int m_col;
276   QRect m_indexBox;
277   QRect m_tabBox;
278   QRect m_nameBox;
279   QRect m_linkBox;
280 
281   bool m_isPanning;
282 
283   QPoint m_pos;
284   QString m_tooltip;
285 
286   RenameColumnField *m_renameColumnField;
287 #ifndef LINETEST
288   ChangeObjectParent *m_changeObjectParent;
289   ChangeObjectHandle *m_changeObjectHandle;
290 #else
291   MotionPathMenu *m_motionPathMenu;
292 #endif
293 
294   QAction *m_subsampling1;
295   QAction *m_subsampling2;
296   QAction *m_subsampling3;
297   QAction *m_subsampling4;
298 
299   DragTool *getDragTool() const;
300   void setDragTool(DragTool *dragTool);
301   void startTransparencyPopupTimer(QMouseEvent *e);
302 
303   // extracted all variables of drawSomething methods
304   class DrawHeader {
305     ColumnArea *area;
306     QPainter &p;
307     int col;
308     XsheetViewer *m_viewer;
309     const Orientation *o;
310     TApp *app;
311     TXsheet *xsh;
312     bool isEmpty, isCurrent;
313     TXshColumn *column;
314     QPoint orig;
315 
316   public:
317     DrawHeader(ColumnArea *area, QPainter &p, int col);
318 
319     void prepare() const;
320 
321     void levelColors(QColor &columnColor, QColor &dragColor) const;
322     void soundColors(QColor &columnColor, QColor &dragColor) const;
323     void paletteColors(QColor &columnColor, QColor &dragColor) const;
324 
325     void drawBaseFill(const QColor &columnColor, const QColor &dragColor) const;
326     void drawEye() const;
327     void drawPreviewToggle(int opacity) const;
328     void drawLock() const;
329     void drawConfig() const;
330     void drawColumnNumber() const;
331     void drawColumnName() const;
332     void drawThumbnail(QPixmap &iconPixmap) const;
333     void drawPegbarName() const;
334     void drawParentHandleName() const;
335     void drawFilterColor() const;
336 
337     void drawSoundIcon(bool isPlaying) const;
338     void drawVolumeControl(double volume) const;
339   };
340 
341 public:
342 #if QT_VERSION >= 0x050500
343   ColumnArea(XsheetViewer *parent, Qt::WindowFlags flags = 0);
344 #else
345   ColumnArea(XsheetViewer *parent, Qt::WFlags flags = 0);
346 #endif
347   ~ColumnArea();
348 
349   void onControlPressed(bool pressed);
350   const bool isControlPressed();
351 
352   void drawFoldedColumnHead(QPainter &p, int col);
353   void drawLevelColumnHead(QPainter &p, int col);
354   void drawSoundColumnHead(QPainter &p, int col);
355   void drawPaletteColumnHead(QPainter &p, int col);
356   void drawSoundTextColumnHead(QPainter &p, int col);
357 
358   QPixmap getColumnIcon(int columnIndex);
359 
360   class Pixmaps {
361   public:
362     static const QPixmap &sound();
363     static const QPixmap &soundPlaying();
364   };
365 
366 protected:
367   void select(int columnIndex, QMouseEvent *event);
368 
369   void paintEvent(QPaintEvent *) override;
370 
371   void mousePressEvent(QMouseEvent *event) override;
372   void mouseMoveEvent(QMouseEvent *event) override;
373   void mouseReleaseEvent(QMouseEvent *event) override;
374   void mouseDoubleClickEvent(QMouseEvent *event) override;
375   void contextMenuEvent(QContextMenuEvent *event) override;
376   bool event(QEvent *event) override;
377 
378 protected slots:
379   void onSubSampling(QAction *);
380   void openTransparencyPopup();
381   void openSoundColumnPopup();
382   void openCameraColumnPopup(QPoint pos);
383   void onCameraColumnChangedTriggered();
384   void onXsheetCameraChange(int);
385   void onSetMask(int);
386 };
387 
388 //-----------------------------------------------------------------------------
389 }  // namespace XsheetGUI;
390 //-----------------------------------------------------------------------------
391 
392 #endif  // XSHCOLUMNVIEWER_H
393