#pragma once #ifndef CONTROLPOINTEDITORTOOL_H #define CONTROLPOINTEDITORTOOL_H #include "toonzqt/selection.h" #include "tool.h" #include "tstroke.h" #include "tcurves.h" #include "tproperty.h" #include "controlpointselection.h" #include "toonz/strokegenerator.h" // For Qt translation support #include class TUndo; //============================================================================= // ControlPointEditorTool //----------------------------------------------------------------------------- class ControlPointEditorTool final : public TTool { Q_DECLARE_TR_FUNCTIONS(ControlPointEditorTool) bool m_draw; bool m_isMenuViewed; int m_lastPointSelected; bool m_isImageChanged; ControlPointSelection m_selection; ControlPointEditorStroke m_controlPointEditorStroke; std::pair m_moveSegmentLimitation; // Indici dei punti di controllo // che limitano la curva da // muovere ControlPointEditorStroke m_moveControlPointEditorStroke; // Usate per muovere // la curva durante // il drag. TRectD m_selectingRect; TPointD m_pos; TPropertyGroup m_prop; TEnumProperty m_selectType; TBoolProperty m_autoSelectDrawing; // Consente di scegliere se swichare tra i livelli. TBoolProperty m_snap; TEnumProperty m_snapSensitivity; double m_snapMinDistance; bool m_foundSnap; TPointD m_snapPoint; TPointD m_firstPos; // The first point inserted in m_track StrokeGenerator m_track; // Lazo selection generator. TStroke* m_stroke; // Stores the stroke generated by m_track. enum Action { NONE, RECT_SELECTION, FREEHAND_SELECTION, CP_MOVEMENT, SEGMENT_MOVEMENT, IN_SPEED_MOVEMENT, OUT_SPEED_MOVEMENT }; Action m_action; enum CursorType { NORMAL, ADD, EDIT_SPEED, EDIT_SEGMENT, NO_ACTIVE }; CursorType m_cursorType; TUndo* m_undo; void selectRegion(TStroke* stroke); void startFreehand(const TPointD& pos); void freehandDrag(const TPointD& pos); void closeFreehand(const TPointD& pos); public: ControlPointEditorTool(); ToolType getToolType() const override { return TTool::LevelWriteTool; } void updateTranslation() override; TPropertyGroup* getProperties(int targetType) override { return &m_prop; } // da TSelectionOwner: chiamato quando la selezione corrente viene cambiata void onSelectionChanged() { invalidate(); } // da TSelectionOwner: chiamato quando si vuole ripristinare una vecchia // selezione // attualmente non usato bool select(const TSelection*) { return false; } ControlPointEditorStroke getControlPointEditorStroke() { return m_controlPointEditorStroke; }; void initUndo(); void getNearestStrokeColumnIndexes(std::vector& indexes, TPointD pos); void drawMovingSegment(); void drawControlPoint(); void draw() override; void mouseMove(const TPointD& pos, const TMouseEvent& e) override; void leftButtonDown(const TPointD& pos, const TMouseEvent& e) override; void rightButtonDown(const TPointD& pos, const TMouseEvent&) override; void moveControlPoints(const TPointD& delta); void moveSpeed(const TPointD& delta, bool isIn); void moveSegment(const TPointD& delta, bool dragging, bool isShiftPressed); void leftButtonDrag(const TPointD& pos, const TMouseEvent& e) override; void leftButtonUp(const TPointD& pos, const TMouseEvent& e) override; void addContextMenuItems(QMenu* menu) override; void linkSpeedInOut(int index); void unlinkSpeedInOut(int pointIndex); bool keyDown(QKeyEvent* event) override; void onEnter() override; void onLeave() override; bool onPropertyChanged(std::string propertyName) override; void onActivate() override; void onDeactivate() override; void onImageChanged() override; int getCursorId() const override; // returns true if the pressed key is recognized and processed. bool isEventAcceptable(QEvent* e) override; TPointD calculateSnap(TPointD pos); void drawSnap(); TPointD getSnap(TPointD pos); void resetSnap(); bool isBusy() { return m_undo != nullptr; } }; #endif // CONTROLPOINTEDITORTOOL_H