| #pragma once |
| |
| #ifndef CONTROLPOINT_SELECTION_INCLUDED |
| #define CONTROLPOINT_SELECTION_INCLUDED |
| |
| #include "toonzqt/selection.h" |
| #include "tool.h" |
| #include "tstroke.h" |
| #include "tcurves.h" |
| |
| |
| |
| |
| |
| |
| class ControlPointEditorStroke |
| { |
| private: |
| |
| class ControlPoint |
| { |
| public: |
| int m_indexPoint; |
| TPointD m_speedIn; |
| TPointD m_speedOut; |
| bool m_isCusp; |
| |
| ControlPoint(int i, TPointD speedIn, TPointD speedOut, bool isCusp = true) |
| : m_indexPoint(i), m_speedIn(speedIn), m_speedOut(speedOut), m_isCusp(isCusp) {} |
| ControlPoint() |
| { |
| } |
| }; |
| |
| vector<ControlPoint> m_controlPoints; |
| TStroke *m_stroke; |
| int m_strokeIndex; |
| |
| |
| |
| |
| void updateControlPoints(); |
| |
| |
| void setCusp(ControlPoint &p); |
| |
| void setSpeedIn(ControlPoint &cp, const TPointD &p) |
| { |
| cp.m_speedIn = m_stroke->getControlPoint(cp.m_indexPoint) - p; |
| } |
| void setSpeedOut(ControlPoint &cp, const TPointD &p) |
| { |
| cp.m_speedOut = p - m_stroke->getControlPoint(cp.m_indexPoint); |
| } |
| |
| |
| |
| |
| void insertPoint(int indexA, int indexB); |
| |
| |
| |
| |
| void adjustChunkParity(); |
| |
| |
| void moveSingleControlPoint(int indexPoint, const TPointD &delta); |
| |
| |
| |
| |
| |
| void movePrecControlPoints(int indexPoint, const TPointD &delta, bool moveSpeed); |
| |
| |
| |
| |
| |
| void moveNextControlPoints(int indexPoint, const TPointD &delta, bool moveSpeed); |
| |
| public: |
| ControlPointEditorStroke() |
| : m_stroke(0), m_strokeIndex(-1) {} |
| |
| |
| |
| |
| |
| |
| void setStroke(TStroke *stroke, int strokeIndex); |
| |
| void setStrokeIndex(int strokeIndex) { m_strokeIndex = strokeIndex; } |
| int getStrokeIndex() { return m_strokeIndex; } |
| |
| TThickPoint getControlPoint(int index) const |
| { |
| assert(m_stroke && 0 <= index && index < (int)m_controlPoints.size()); |
| return m_stroke->getControlPoint(m_controlPoints[index].m_indexPoint); |
| } |
| TThickPoint getSpeedIn(int index) const |
| { |
| assert(m_stroke && 0 <= index && index < (int)m_controlPoints.size()); |
| return m_controlPoints[index].m_speedIn; |
| } |
| TThickPoint getSpeedOut(int index) const |
| { |
| assert(m_stroke && 0 <= index && index < (int)m_controlPoints.size()); |
| return m_controlPoints[index].m_speedOut; |
| } |
| |
| int getControlPointCount() const |
| { |
| return m_controlPoints.size(); |
| } |
| |
| |
| bool getIsCusp(int index) const |
| { |
| assert(m_stroke && 0 <= index && index < (int)getControlPointCount()); |
| return m_controlPoints[index].m_isCusp; |
| } |
| |
| |
| void linkUnlinkSpeeds(int index, bool isCusp) |
| { |
| m_controlPoints[index].m_isCusp = isCusp; |
| } |
| |
| |
| |
| void moveControlPoint(int index, const TPointD &delta); |
| |
| |
| void deleteControlPoint(int index); |
| |
| |
| |
| int addControlPoint(const TPointD &pos); |
| |
| |
| |
| |
| int getClosestControlPoint(const TPointD &pos, double &distance2) const; |
| |
| |
| bool isCloseTo(const TPointD &pos, double pixelSize) const; |
| |
| |
| |
| |
| |
| int getClosestSpeed(const TPointD &pos, double &minDistance2, bool &isIn) const; |
| |
| |
| |
| void moveSpeed(int index, const TPointD &delta, bool isIn, double pixelSize); |
| |
| |
| |
| bool setLinear(int index, bool isLinear); |
| |
| void setLinearSpeedIn(int index); |
| void setLinearSpeedOut(int index); |
| |
| bool isSpeedInLinear(int index); |
| bool isSpeedOutLinear(int index); |
| |
| bool isSelfLoop() |
| { |
| return m_stroke->isSelfLoop(); |
| } |
| }; |
| |
| |
| |
| |
| |
| class ControlPointSelection : public QObject, public TSelection |
| { |
| Q_OBJECT |
| |
| private: |
| std::set<int> m_selectedPoints; |
| ControlPointEditorStroke *m_controlPointEditorStroke; |
| |
| public: |
| ControlPointSelection() : m_controlPointEditorStroke(0) {} |
| |
| void setControlPointEditorStroke(ControlPointEditorStroke *controlPointEditorStroke) |
| { |
| m_controlPointEditorStroke = controlPointEditorStroke; |
| } |
| |
| bool isEmpty() const { return m_selectedPoints.empty(); } |
| |
| void selectNone() { m_selectedPoints.clear(); } |
| bool isSelected(int index) const; |
| void select(int index); |
| void unselect(int index); |
| |
| void deleteControlPoints(); |
| |
| void addMenuItems(QMenu *menu); |
| |
| void enableCommands(); |
| |
| protected slots: |
| void setLinear(); |
| void setUnlinear(); |
| }; |
| |
| #endif |