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