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 ¢er, 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