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 ¶m) 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