1 #pragma once 2 3 #ifndef SKELETON_TOOL_INCLUDED 4 #define SKELETON_TOOL_INCLUDED 5 6 #include "tools/tool.h" 7 #include "tgeometry.h" 8 #include "tproperty.h" 9 #include "toonz/hook.h" 10 #include "toonz/skeleton.h" 11 12 #include <QCoreApplication> 13 14 namespace SkeletonSubtools { 15 16 class DragTool; 17 class CommandHandler; 18 19 class HookData { 20 public: 21 int m_columnIndex; 22 int m_hookId; // 0=center (e.g. B,C,...), 1,2... = hook 23 TPointD m_pos; 24 std::string m_name; // name visualized in the balloons 25 bool m_isPivot; // true if this is the level "pivot", i.e. the current handle 26 HookData(TXsheet *xsh, int columnIndex, int hookId, const TPointD &pos); getHandle()27 std::string getHandle() const { return m_hookId > 0 ? "H" + m_name : m_name; } 28 }; 29 30 class MagicLink { 31 public: 32 HookData m_h0, m_h1; 33 double m_dist2; MagicLink(const HookData & h0,const HookData & h1,double dist2)34 MagicLink(const HookData &h0, const HookData &h1, double dist2) 35 : m_h0(h0), m_h1(h1), m_dist2(dist2) {} 36 bool operator<(const MagicLink &link) const { return m_dist2 < link.m_dist2; } 37 }; 38 } // namespace SkeletonSubtools 39 40 class SkeletonTool : public TTool { 41 Q_DECLARE_TR_FUNCTIONS(SkeletonTool) 42 43 SkeletonSubtools::DragTool *m_dragTool; 44 45 TPointD m_lastPos; 46 TPointD m_curPos; 47 TPointD m_firstPos; 48 TPointD m_curCenter; 49 TPointD m_parentProbe; 50 bool m_parentProbeEnabled; 51 52 bool m_active; 53 bool m_firstTime; 54 int m_device; 55 56 TEnumProperty m_mode; 57 TBoolProperty m_showOnlyActiveSkeleton; 58 TBoolProperty m_globalKeyframes; 59 60 TPropertyGroup m_prop; 61 62 std::vector<SkeletonSubtools::MagicLink> m_magicLinks; 63 64 std::set<int> m_temporaryPinnedColumns; 65 66 int m_currentFrame; 67 68 SkeletonSubtools::CommandHandler *m_commandHandler; 69 70 // column currently selected, during a click&drag operation 71 int m_otherColumn; 72 TRectD m_otherColumnBBox; 73 TAffine m_otherColumnBBoxAff; 74 75 TPointD m_labelPos; 76 std::string m_label; 77 78 public: 79 SkeletonTool(); 80 ~SkeletonTool(); 81 getToolType()82 ToolType getToolType() const override { return TTool::ColumnTool; } 83 84 void updateTranslation() override; // QString localization stuff 85 86 bool doesApply() const; // ritorna vero se posso deformare l'oggetto corrente 87 onEnter()88 void onEnter() override {} 89 void leftButtonDown(const TPointD &pos, const TMouseEvent &) override; 90 void leftButtonDrag(const TPointD &pos, const TMouseEvent &) override; 91 void leftButtonUp(const TPointD &pos, const TMouseEvent &) override; 92 void mouseMove(const TPointD &, const TMouseEvent &e) override; 93 onImageChanged()94 void onImageChanged() override { invalidate(); } 95 reset()96 void reset() override { m_temporaryPinnedColumns.clear(); } 97 98 bool onPropertyChanged(std::string propertyName) override; 99 100 void draw() override; 101 102 void drawSkeleton(const Skeleton &skeleton, int row); 103 void drawLevelBoundingBox(int frame, int columnIndex); 104 void getImageBoundingBox(TRectD &bbox, TAffine &aff, int frame, 105 int columnIndex); 106 void drawIKJoint(const Skeleton::Bone *bone); 107 void drawJoint(const TPointD &p, bool current); 108 void drawBone(const TPointD &a, const TPointD &b, bool selected); 109 void drawIKBone(const TPointD &a, const TPointD &b); 110 void drawMainGadget(const TPointD ¢er); 111 void drawDrawingBrowser(const TXshCell &cell, const TPointD ¢er); 112 setParentProbe(const TPointD & parentProbe)113 void setParentProbe(const TPointD &parentProbe) { 114 m_parentProbe = parentProbe; 115 m_parentProbeEnabled = true; 116 } resetParentProbe()117 void resetParentProbe() { m_parentProbeEnabled = false; } 118 119 void drawHooks(); 120 121 void computeMagicLinks(); 122 123 bool keyDown(QKeyEvent *event) override; 124 125 void onActivate() override; 126 void onDeactivate() override; 127 getMagicLinkCount()128 int getMagicLinkCount() const { return (int)m_magicLinks.size(); } 129 SkeletonSubtools::MagicLink getMagicLink(int index) const; 130 131 void magicLink(int index); 132 133 int getCursorId() const override; 134 135 // TRaster32P getToolIcon() const {return Pixmaps::arrow;} getProperties(int targetType)136 TPropertyGroup *getProperties(int targetType) override { return &m_prop; } 137 updateMatrix()138 void updateMatrix() override { setMatrix(getCurrentObjectParentMatrix()); } 139 void addContextMenuItems(QMenu *menu) override; select(const TSelection *)140 bool select(const TSelection *) { return false; } 141 142 void togglePinnedStatus(int columnIndex, int frame, bool shiftPressed); 143 144 void buildSkeleton(Skeleton &skeleton, int columnIndex); 145 setTemporaryPinnedColumns(const std::set<int> & tmp)146 void setTemporaryPinnedColumns(const std::set<int> &tmp) { 147 m_temporaryPinnedColumns = tmp; 148 } 149 bool isGlobalKeyframesEnabled() const; 150 }; 151 152 #endif 153