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 &center);
111   void drawDrawingBrowser(const TXshCell &cell, const TPointD &center);
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