1 #pragma once
2 
3 #ifndef RASTERSELECTIONTOOL_INCLUDED
4 #define RASTERSELECTIONTOOL_INCLUDED
5 
6 #include "selectiontool.h"
7 #include "setsaveboxtool.h"
8 #include "tools/rasterselection.h"
9 
10 // forward declaration
11 class RasterSelectionTool;
12 class VectorFreeDeformer;
13 
14 //=============================================================================
15 // RasterFreeDeformer
16 //-----------------------------------------------------------------------------
17 
18 class RasterFreeDeformer final : public FreeDeformer {
19   TRasterP m_ras;
20   TRasterP m_newRas;
21   bool m_noAntialiasing;
22 
23 public:
24   RasterFreeDeformer(TRasterP ras);
25   ~RasterFreeDeformer();
26 
27   /*! Set \b index point to \b p, with index from 0 to 3. */
28   void setPoint(int index, const TPointD &p) override;
29   /*! Helper function. */
30   void setPoints(const TPointD &p0, const TPointD &p1, const TPointD &p2,
31                  const TPointD &p3) override;
getImage()32   TRasterP getImage() const { return m_newRas; }
33   void deformImage() override;
setNoAntialiasing(bool value)34   void setNoAntialiasing(bool value) { m_noAntialiasing = value; }
35 };
36 
37 //=============================================================================
38 // DragSelectionTool
39 //-----------------------------------------------------------------------------
40 
41 namespace DragSelectionTool {
42 
43 //=============================================================================
44 // UndoRasterDeform
45 //-----------------------------------------------------------------------------
46 
47 class UndoRasterDeform final : public TUndo {
48   static int m_id;
49   RasterSelectionTool *m_tool;
50   std::string m_oldFloatingImageId, m_newFloatingImageId;
51   std::vector<TStroke> m_newStrokes;
52   std::vector<TStroke> m_oldStrokes;
53   DragSelectionTool::DeformValues m_oldDeformValues, m_newDeformValues;
54   FourPoints m_oldBBox, m_newBBox;
55   TPointD m_oldCenter, m_newCenter;
56 
57   TDimension m_dim;
58   int m_pixelSize;
59 
60 public:
61   UndoRasterDeform(RasterSelectionTool *tool);
62   ~UndoRasterDeform();
63 
64   void registerRasterDeformation();
65 
66   void undo() const override;
67   void redo() const override;
68 
69   int getSize() const override;
70 
getHistoryString()71   QString getHistoryString() override { return QObject::tr("Deform Raster"); }
72 };
73 
74 //=============================================================================
75 // UndoRasterTransform
76 //-----------------------------------------------------------------------------
77 
78 class UndoRasterTransform final : public TUndo {
79   RasterSelectionTool *m_tool;
80   TAffine m_oldTransform, m_newTransform;
81   TPointD m_oldCenter, m_newCenter;
82   FourPoints m_oldBbox, m_newBbox;
83   DragSelectionTool::DeformValues m_oldDeformValues, m_newDeformValues;
84 
85 public:
86   UndoRasterTransform(RasterSelectionTool *tool);
87   void setChangedValues();
88   void undo() const override;
89   void redo() const override;
90 
getSize()91   int getSize() const override { return sizeof(*this); }
92 
getHistoryString()93   QString getHistoryString() override {
94     return QObject::tr("Transform Raster");
95   }
96 };
97 
98 //=============================================================================
99 // RasterDeformTool
100 //-----------------------------------------------------------------------------
101 
102 class RasterDeformTool : public DeformTool {
103 protected:
104   TAffine m_transform;
105   UndoRasterTransform *m_transformUndo;
106   UndoRasterDeform *m_deformUndo;
107 
108   //! It's true when use RasterFreeDeformer
109   bool m_isFreeDeformer;
110 
111   void applyTransform(FourPoints bbox) override;
112   void applyTransform(TAffine aff, bool modifyCenter);
113   void addTransformUndo() override;
114 
leftButtonDrag(const TPointD & pos,const TMouseEvent & e)115   void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override{};
draw()116   void draw() override{};
117 
118 public:
119   RasterDeformTool(RasterSelectionTool *tool, bool freeDeformer);
120 };
121 
122 //=============================================================================
123 // RasterRotationTool
124 //-----------------------------------------------------------------------------
125 
126 class RasterRotationTool final : public RasterDeformTool {
127   Rotation *m_rotation;
128 
129 public:
130   RasterRotationTool(RasterSelectionTool *tool);
131   void transform(TAffine aff, double angle) override;
132   void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
133   void draw() override;
134 };
135 
136 //=============================================================================
137 // RasterFreeDeformTool
138 //-----------------------------------------------------------------------------
139 
140 class RasterFreeDeformTool final : public RasterDeformTool {
141   FreeDeform *m_freeDeform;
142 
143 public:
144   RasterFreeDeformTool(RasterSelectionTool *tool);
145   void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
146 };
147 
148 //=============================================================================
149 // RasterMoveSelectionTool
150 //-----------------------------------------------------------------------------
151 
152 class RasterMoveSelectionTool final : public RasterDeformTool {
153   MoveSelection *m_moveSelection;
154 
155 public:
156   RasterMoveSelectionTool(RasterSelectionTool *tool);
157   void transform(TAffine aff) override;
158   void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override;
159   void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
160 };
161 
162 //=============================================================================
163 // RasterScaleTool
164 //-----------------------------------------------------------------------------
165 
166 class RasterScaleTool final : public RasterDeformTool {
167   Scale *m_scale;
168 
169 public:
170   RasterScaleTool(RasterSelectionTool *tool, ScaleType type);
171   /*! Return scale value. */
172   TPointD transform(int index, TPointD newPos) override;
173   void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override;
174   void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override;
175 };
176 
177 }  // namespace DragSelectionTool
178 
179 //=============================================================================
180 // RasterSelectionTool
181 //-----------------------------------------------------------------------------
182 
183 class RasterSelectionTool final : public SelectionTool {
184   Q_DECLARE_TR_FUNCTIONS(RasterSelectionTool)
185 
186   RasterSelection m_rasterSelection;
187   int m_transformationCount;
188 
189   //! Used in ToonzRasterImage to switch from selection tool to modify savebox
190   //! tool.
191   TBoolProperty m_modifySavebox;
192   SetSaveboxTool *m_setSaveboxTool;
193   TBoolProperty m_noAntialiasing;
194 
195   //! Used to deform bbox strokes.
196   VectorFreeDeformer *m_selectionFreeDeformer;
197 
198   void modifySelectionOnClick(TImageP image, const TPointD &pos,
199                               const TMouseEvent &e) override;
200 
201   void drawFloatingSelection();
202 
203 public:
204   RasterSelectionTool(int targetType);
205 
206   void setBBox(const DragSelectionTool::FourPoints &points,
207                int index = 0) override;
208 
209   void setNewFreeDeformer() override;
210   VectorFreeDeformer *getSelectionFreeDeformer() const;
211 
212   bool isFloating() const override;
213 
214   void leftButtonDown(const TPointD &pos, const TMouseEvent &) override;
215   void mouseMove(const TPointD &pos, const TMouseEvent &e) override;
216   void leftButtonDrag(const TPointD &pos, const TMouseEvent &) override;
217   void leftButtonUp(const TPointD &pos, const TMouseEvent &) override;
218   void leftButtonDoubleClick(const TPointD &, const TMouseEvent &e) override;
219 
220   void draw() override;
221 
222   TSelection *getSelection() override;
223   bool isSelectionEmpty() override;
224 
225   void computeBBox() override;
226 
227   void doOnActivate() override;
228   void doOnDeactivate() override;
229 
230   void onImageChanged() override;
231 
232   void transformFloatingSelection(const TAffine &affine, const TPointD &center,
233                                   const DragSelectionTool::FourPoints &points);
234   void increaseTransformationCount();
235   void decreaseTransformationCount();
236 
237   void onActivate() override;
getModifySaveboxProperty()238   TBoolProperty *getModifySaveboxProperty() {
239     if (m_targetType & ToonzImage) return &m_modifySavebox;
240     return 0;
241   }
242   bool onPropertyChanged(std::string propertyName) override;
getNoAntialiasingValue()243   bool getNoAntialiasingValue() { return m_noAntialiasing.getValue(); }
244 
isSelectionEditable()245   bool isSelectionEditable() override { return m_rasterSelection.isEditable(); }
246 
247 protected:
248   void updateTranslation() override;
249 };
250 
251 #endif  // RASTERSELECTIONTOOL_INCLUDED
252