1 #pragma once
2 
3 #ifndef SWATCHVIEWER_H
4 #define SWATCHVIEWER_H
5 
6 #ifdef _MSC_VER
7 #pragma warning(disable : 4251)
8 #endif
9 
10 #include "tcommon.h"
11 #include <QWidget>
12 #include "tfx.h"
13 #include "tparamset.h"
14 #include "trenderer.h"
15 #include "tthreadmessage.h"
16 #include "tthread.h"
17 #include "trop.h"
18 
19 #include <QTouchDevice>
20 
21 using namespace TThread;
22 
23 #undef DVAPI
24 #undef DVVAR
25 #ifdef TOONZQT_EXPORTS
26 #define DVAPI DV_EXPORT_API
27 #define DVVAR DV_EXPORT_VAR
28 #else
29 #define DVAPI DV_IMPORT_API
30 #define DVVAR DV_IMPORT_VAR
31 #endif
32 
33 //-----------------------------------------------------------------------------
34 
35 //  Forward declarations
36 
37 class QTouchEvent;
38 class QGestureEvent;
39 
40 //=============================================================================
41 
42 class DVAPI BgPainter {
43   std::string m_name;
44 
45 public:
BgPainter(std::string name)46   BgPainter(std::string name) : m_name(name) {}
~BgPainter()47   virtual ~BgPainter() {}
getName()48   std::string getName() const { return m_name; }
49   virtual void paint(const TRaster32P &ras) = 0;
50 };
51 
52 //=============================================================================
53 
54 class DVAPI SolidColorBgPainter final : public BgPainter {
55   TPixel32 m_color;
56 
57 public:
SolidColorBgPainter(std::string name,TPixel32 color)58   SolidColorBgPainter(std::string name, TPixel32 color)
59       : BgPainter(name), m_color(color) {}
60 
paint(const TRaster32P & ras)61   void paint(const TRaster32P &ras) override { ras->fill(m_color); }
62 };
63 
64 //=============================================================================
65 
66 class DVAPI CheckboardBgPainter final : public BgPainter {
67   TPixel32 m_c0, m_c1;
68 
69 public:
CheckboardBgPainter(std::string name,TPixel32 c0,TPixel32 c1)70   CheckboardBgPainter(std::string name, TPixel32 c0, TPixel32 c1)
71       : BgPainter(name), m_c0(c0), m_c1(c1) {}
72 
paint(const TRaster32P & ras)73   void paint(const TRaster32P &ras) override {
74     int n = 4, min = 4;
75     TDimensionD d(std::max(min, ras->getLx() / n),
76                   std::max(min, ras->getLy() / n));
77     d.lx = d.ly = std::max(d.lx, d.ly);
78     TRop::checkBoard(ras, m_c0, m_c1, d, TPointD());
79   }
80 };
81 
82 //=============================================================================
83 /*! \brief SwatchViewer.
84 
85                 Inherits \b QWidget.
86 */
87 class DVAPI SwatchViewer final : public QWidget {
88   Q_OBJECT
89 
90   //! La classe \b Point gestisce un punto che e' collegato a parametri \b
91   //! TPointParam.
92   /*!Questo tipo di punti consentono di modificare alcuni parametri dell'effetto
93   corrente e
94   sono editabili dall'utente direttamente nello SwatchViewer*/
95   class Point {
96   public:
97     int m_index;
98     TPointParamP m_param;
99     bool m_pairFlag;
Point(int index,const TPointParamP & param)100     Point(int index, const TPointParamP &param)
101         : m_index(index), m_param(param), m_pairFlag(false) {}
102   };
103 
104   TFxP m_fx;
105   TFxP m_actualFxClone;
106 
107   TRaster32P m_raster;
108   TRaster32P m_content;
109   TAffine m_aff;
110   TAffine m_fxAff;
111   TAffine m_contentAff;
112 
113   bool m_cameraMode;
114   TRect m_cameraRect;
115 
116   Qt::MouseButton m_mouseButton;
117 
118   std::vector<Point> m_points;
119   std::vector<std::pair<int, int>> m_pointPairs;
120 
121   int m_selectedPoint;
122   TPointD m_pointPosDelta;
123 
124   bool m_enabled;
125   bool m_firstEnabled;
126   int m_frame;
127   TThread::Executor m_executor;
128   TThread::Mutex m_mutex;
129 
130   TRenderer m_renderer;
131 
132   BgPainter *m_bgPainter;
133 
134   TRaster32P m_crossIcon;
135 
136   TPoint m_pos;
137   TPoint m_firstPos;
138   TRaster32P m_oldContent, m_curContent;
139 
140   bool m_computing;
141 
142   bool m_touchActive                     = false;
143   bool m_gestureActive                   = false;
144   QTouchDevice::DeviceType m_touchDevice = QTouchDevice::TouchScreen;
145   bool m_zooming                         = false;
146   bool m_panning                         = false;
147   double m_scaleFactor;  // used for zoom gesture
148 
149   bool m_stylusUsed = false;
150 
151   friend class ContentRender;
152 
153 public:
154   class ContentRender final : public TThread::Runnable {
155   public:
156     TRasterFxP m_fx;
157     TRasterP m_raster;
158     int m_frame;
159     TDimension m_size;
160     TAffine m_aff;
161     SwatchViewer *m_viewer;
162     bool m_started;
163 
164     ContentRender(TRasterFx *fx, int frame, const TDimension &size,
165                   SwatchViewer *viewer);
166     ~ContentRender();
167 
168     void run() override;
169     int taskLoad() override;
170 
171     void onStarted(TThread::RunnableP task) override;
172     void onFinished(TThread::RunnableP task) override;
173     void onCanceled(TThread::RunnableP task) override;
174   };
175 
176 #if QT_VERSION >= 0x050500
177   SwatchViewer(QWidget *parent = 0, Qt::WindowFlags flags = 0);
178 #else
179   SwatchViewer(QWidget *parent = 0, Qt::WFlags flags = 0);
180 #endif
181   ~SwatchViewer();
182 
183   static void suspendRendering(bool suspend, bool blocking = true);
184 
setCameraMode(bool enabled)185   void setCameraMode(bool enabled) { m_cameraMode = enabled; }
getCameraMode()186   bool getCameraMode() const { return m_cameraMode; }
187 
188   void setCameraSize(const TDimension &cameraSize);
getCameraSize()189   TDimension getCameraSize() const { return m_cameraRect.getSize(); }
190 
191   void setFx(const TFxP &fx, const TFxP &actualFx, int frame);
192 
193   void updateFrame(int frame);
194 
isEnabled()195   bool isEnabled() { return m_enabled; }
196 
197 public slots:
198   void setEnable(bool enabled);
199   void updateSize(const QSize &size);
200   void setBgPainter(TPixel32 color1, TPixel32 color2 = TPixel32());
201   void resetView();
202   void fitView();
203 
204 protected:
205   void computeContent();
206   TPoint world2win(const TPointD &p) const;
207   TPointD win2world(const TPoint &p) const;
208   void zoom(const TPoint &pos, double factor);
209   void zoom(bool forward, bool reset);
210   void pan(const TPoint &delta);
211 
212   void updateRaster();
213 
getContent()214   const TRaster32P &getContent() const { return m_content; }
215   void setContent(const TRaster32P &content, const TAffine &contentAff);
216 
217   void setAff(const TAffine &aff);
218 
219   void contextMenuEvent(QContextMenuEvent *event) override;
220   void paintEvent(QPaintEvent *event) override;
221   void mousePressEvent(QMouseEvent *event) override;
222   void mouseMoveEvent(QMouseEvent *event) override;
223   void mouseReleaseEvent(QMouseEvent *event) override;
224   void wheelEvent(QWheelEvent *) override;
225   void keyPressEvent(QKeyEvent *event) override;
226   void resizeEvent(QResizeEvent *event) override;
227   void hideEvent(QHideEvent *event) override;
228 
229   void mouseDoubleClickEvent(QMouseEvent *event) override;
230   void tabletEvent(QTabletEvent *e) override;
231   void touchEvent(QTouchEvent *e, int type);
232   void gestureEvent(QGestureEvent *e);
233   bool event(QEvent *e) override;
234 
235 private:
236   QPointF m_firstPanPoint;
237 
238 signals:
239   void pointPositionChanged(int index, const TPointD &p);
240 };
241 
242 #endif  // SWATCHVIEWER_H
243