#pragma once #ifndef RASTERSELECTIONTOOL_INCLUDED #define RASTERSELECTIONTOOL_INCLUDED #include "selectiontool.h" #include "setsaveboxtool.h" #include "tools/rasterselection.h" // forward declaration class RasterSelectionTool; class VectorFreeDeformer; //============================================================================= // RasterFreeDeformer //----------------------------------------------------------------------------- class RasterFreeDeformer final : public FreeDeformer { TRasterP m_ras; TRasterP m_newRas; bool m_noAntialiasing; public: RasterFreeDeformer(TRasterP ras); ~RasterFreeDeformer(); /*! Set \b index point to \b p, with index from 0 to 3. */ void setPoint(int index, const TPointD &p) override; /*! Helper function. */ void setPoints(const TPointD &p0, const TPointD &p1, const TPointD &p2, const TPointD &p3) override; TRasterP getImage() const { return m_newRas; } void deformImage() override; void setNoAntialiasing(bool value) { m_noAntialiasing = value; } }; //============================================================================= // DragSelectionTool //----------------------------------------------------------------------------- namespace DragSelectionTool { //============================================================================= // UndoRasterDeform //----------------------------------------------------------------------------- class UndoRasterDeform final : public TUndo { static int m_id; RasterSelectionTool *m_tool; std::string m_oldFloatingImageId, m_newFloatingImageId; std::vector m_newStrokes; std::vector m_oldStrokes; DragSelectionTool::DeformValues m_oldDeformValues, m_newDeformValues; FourPoints m_oldBBox, m_newBBox; TPointD m_oldCenter, m_newCenter; TDimension m_dim; int m_pixelSize; public: UndoRasterDeform(RasterSelectionTool *tool); ~UndoRasterDeform(); void registerRasterDeformation(); void undo() const override; void redo() const override; int getSize() const override; QString getHistoryString() override { return QObject::tr("Deform Raster"); } }; //============================================================================= // UndoRasterTransform //----------------------------------------------------------------------------- class UndoRasterTransform final : public TUndo { RasterSelectionTool *m_tool; TAffine m_oldTransform, m_newTransform; TPointD m_oldCenter, m_newCenter; FourPoints m_oldBbox, m_newBbox; DragSelectionTool::DeformValues m_oldDeformValues, m_newDeformValues; public: UndoRasterTransform(RasterSelectionTool *tool); void setChangedValues(); void undo() const override; void redo() const override; int getSize() const override { return sizeof(*this); } QString getHistoryString() override { return QObject::tr("Transform Raster"); } }; //============================================================================= // RasterDeformTool //----------------------------------------------------------------------------- class RasterDeformTool : public DeformTool { protected: TAffine m_transform; UndoRasterTransform *m_transformUndo; UndoRasterDeform *m_deformUndo; //! It's true when use RasterFreeDeformer bool m_isFreeDeformer; void applyTransform(FourPoints bbox) override; void applyTransform(TAffine aff, bool modifyCenter); void addTransformUndo() override; void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override{}; void draw() override{}; public: RasterDeformTool(RasterSelectionTool *tool, bool freeDeformer); }; //============================================================================= // RasterRotationTool //----------------------------------------------------------------------------- class RasterRotationTool final : public RasterDeformTool { Rotation *m_rotation; public: RasterRotationTool(RasterSelectionTool *tool); void transform(TAffine aff, double angle) override; void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; void draw() override; }; //============================================================================= // RasterFreeDeformTool //----------------------------------------------------------------------------- class RasterFreeDeformTool final : public RasterDeformTool { FreeDeform *m_freeDeform; public: RasterFreeDeformTool(RasterSelectionTool *tool); void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; }; //============================================================================= // RasterMoveSelectionTool //----------------------------------------------------------------------------- class RasterMoveSelectionTool final : public RasterDeformTool { MoveSelection *m_moveSelection; public: RasterMoveSelectionTool(RasterSelectionTool *tool); void transform(TAffine aff) override; void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override; void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; }; //============================================================================= // RasterScaleTool //----------------------------------------------------------------------------- class RasterScaleTool final : public RasterDeformTool { Scale *m_scale; public: RasterScaleTool(RasterSelectionTool *tool, ScaleType type); /*! Return scale value. */ TPointD transform(int index, TPointD newPos) override; void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override; void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override; }; } // namespace DragSelectionTool //============================================================================= // RasterSelectionTool //----------------------------------------------------------------------------- class RasterSelectionTool final : public SelectionTool { Q_DECLARE_TR_FUNCTIONS(RasterSelectionTool) RasterSelection m_rasterSelection; int m_transformationCount; //! Used in ToonzRasterImage to switch from selection tool to modify savebox //! tool. TBoolProperty m_modifySavebox; SetSaveboxTool *m_setSaveboxTool; TBoolProperty m_noAntialiasing; //! Used to deform bbox strokes. VectorFreeDeformer *m_selectionFreeDeformer; void modifySelectionOnClick(TImageP image, const TPointD &pos, const TMouseEvent &e) override; void drawFloatingSelection(); public: RasterSelectionTool(int targetType); void setBBox(const DragSelectionTool::FourPoints &points, int index = 0) override; void setNewFreeDeformer() override; VectorFreeDeformer *getSelectionFreeDeformer() const; bool isFloating() const override; void leftButtonDown(const TPointD &pos, const TMouseEvent &) override; void mouseMove(const TPointD &pos, const TMouseEvent &e) override; void leftButtonDrag(const TPointD &pos, const TMouseEvent &) override; void leftButtonUp(const TPointD &pos, const TMouseEvent &) override; void leftButtonDoubleClick(const TPointD &, const TMouseEvent &e) override; void draw() override; TSelection *getSelection() override; bool isSelectionEmpty() override; void computeBBox() override; void doOnActivate() override; void doOnDeactivate() override; void onImageChanged() override; void transformFloatingSelection(const TAffine &affine, const TPointD ¢er, const DragSelectionTool::FourPoints &points); void increaseTransformationCount(); void decreaseTransformationCount(); void onActivate() override; TBoolProperty *getModifySaveboxProperty() { if (m_targetType & ToonzImage) return &m_modifySavebox; return 0; } bool onPropertyChanged(std::string propertyName) override; bool getNoAntialiasingValue() { return m_noAntialiasing.getValue(); } bool isSelectionEditable() override { return m_rasterSelection.isEditable(); } protected: void updateTranslation() override; }; #endif // RASTERSELECTIONTOOL_INCLUDED