#pragma once #include "tools/tool.h" class ShiftTraceTool final : public TTool { public: enum CurveStatus { NoCurve, TwoPointsCurve, // just during the first click&drag 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); };