| #pragma once |
| |
| #include "tools/tool.h" |
| |
| class ShiftTraceTool final : public TTool { |
| public: |
| enum CurveStatus { |
| NoCurve, |
| TwoPointsCurve, |
| ThreePointsCurve |
| }; |
| |
| enum GadgetId { |
| NoGadget, |
| NoGadget_InBox, |
| CurveP0Gadget, |
| CurveP1Gadget, |
| CurvePmGadget, |
| MoveCenterGadget, |
| RotateGadget, |
| TranslateGadget, |
| ScaleGadget |
| }; |
| inline bool isCurveGadget(GadgetId id) const { |
| return CurveP0Gadget <= id && id <= CurvePmGadget; |
| } |
| |
| private: |
| TPointD m_oldPos, m_startPos; |
| int m_ghostIndex; |
| TPointD m_p0, m_p1, m_p2; |
| |
| CurveStatus m_curveStatus; |
| GadgetId m_gadget; |
| GadgetId m_highlightedGadget; |
| |
| TRectD m_box; |
| TAffine m_dpiAff; |
| int m_row[2]; |
| TAffine m_aff[2]; |
| TPointD m_center[2]; |
| |
| TAffine m_oldAff; |
| |
| public: |
| ShiftTraceTool(); |
| |
| ToolType getToolType() const override { return GenericTool; } |
| |
| void clearData(); |
| void updateData(); |
| void updateBox(); |
| void updateCurveAffs(); |
| void updateGhost(); |
| |
| void reset() override; |
| |
| void mouseMove(const TPointD &, const TMouseEvent &e) override; |
| void leftButtonDown(const TPointD &, const TMouseEvent &) override; |
| void leftButtonDrag(const TPointD &, const TMouseEvent &) override; |
| void leftButtonUp(const TPointD &, const TMouseEvent &) override; |
| void draw() override; |
| |
| TAffine getGhostAff(); |
| GadgetId getGadget(const TPointD &); |
| void drawDot(const TPointD ¢er, double r, |
| const TPixel32 &color = TPixel32::White); |
| void drawControlRect(); |
| void drawCurve(); |
| |
| void onActivate() override; |
| void onDeactivate() override; |
| |
| void onLeave() override; |
| |
| bool isEventAcceptable(QEvent *e) override; |
| |
| int getCursorId() const override; |
| |
| int getCurrentGhostIndex() { return m_ghostIndex; } |
| void setCurrentGhostIndex(int index); |
| }; |