1 #pragma once
2 
3 #ifndef HOOK_SELECTION
4 #define HOOK_SELECTION
5 
6 #include "toonzqt/selection.h"
7 #include "toonzqt/dvmimedata.h"
8 #include "toonz/txshlevel.h"
9 #include "toonz/hook.h"
10 #include "tundo.h"
11 
12 #include <set>
13 
14 //=============================================================================
15 // HookUndo
16 //-----------------------------------------------------------------------------
17 
18 class HookUndo final : public TUndo {
19   HookSet m_oldHooks, m_newHooks;
20   TXshLevelP m_level;
21 
22 public:
23   HookUndo(const TXshLevelP &level);
24   ~HookUndo();
25 
26   void onAdd() override;
27   void assignHookSet(const HookSet &src) const;
28 
29   void undo() const override;
30   void redo() const override;
31 
32   int getSize() const override;
33 };
34 
35 //=============================================================================
36 // HooksData
37 //-----------------------------------------------------------------------------
38 
39 class HooksData final : public DvMimeData {
40   struct HookPosition {
41     int m_id;
42     TPointD m_aPos, m_bPos;
43 
HookPositionHookPosition44     HookPosition(int id, const TPointD &aPos, const TPointD &bPos)
45         : m_id(id), m_aPos(aPos), m_bPos(bPos) {}
46   };
47 
48   std::vector<HookPosition> m_hookPositions;
49   TXshLevelP m_level;
50 
51 public:
52   HooksData(const TXshLevelP &level);
53   ~HooksData();
54 
55   HooksData *clone() const override;
56   void storeHookPositions(const std::vector<int> &ids);
57   void restoreHookPositions() const;
58 };
59 
60 //=============================================================================
61 // HookSelection
62 //
63 // Derived from TSelection. Control which hooks are currently selected
64 // Note that a hook is made of two different parts (used e.g. to "pass the hook"
65 // between the feet in a walking cycle) that can be independently selected
66 // (1=A,2=B)
67 //-----------------------------------------------------------------------------
68 
69 class HookSelection final : public TSelection {
70   TXshLevelP m_level;
71   std::set<std::pair<int, int>> m_hooks;  // hookId, side : 1=A 2=B
72 
73 public:
74   HookSelection();
75   ~HookSelection();
76 
77   TSelection *clone() const;
setLevel(const TXshLevelP & level)78   void setLevel(const TXshLevelP &level) { m_level = level; }
79   void select(int id, int side);
80   void unselect(int id, int side);
81   bool isSelected(int id, int side) const;
82   void invertSelection(int id, int side);
83   bool isEmpty() const override;
selectNone()84   void selectNone() override { m_hooks.clear(); }
85   HookSet *getHookSet() const;
86   bool select(const TSelection *s);
87   void enableCommands() override;
88 
89   // commands
90   void deleteSelectedHooks();
91   void copySelectedHooks();
92   void cutSelectedHooks();
93   void pasteSelectedHooks();
94 };
95 
96 #endif  // HOOK_SELECTION
97