Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef HOOK_SELECTION
Toshihiro Shimizu 890ddd
#define HOOK_SELECTION
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/selection.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvmimedata.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/hook.h"
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <set></set>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// HookUndo
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HookUndo : public TUndo
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	HookSet m_oldHooks, m_newHooks;
Toshihiro Shimizu 890ddd
	TXshLevelP m_level;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HookUndo(const TXshLevelP &level);
Toshihiro Shimizu 890ddd
	~HookUndo();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onAdd();
Toshihiro Shimizu 890ddd
	void assignHookSet(const HookSet &src) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void undo() const;
Toshihiro Shimizu 890ddd
	void redo() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getSize() const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// HooksData
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HooksData : public DvMimeData
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct HookPosition {
Toshihiro Shimizu 890ddd
		int m_id;
Toshihiro Shimizu 890ddd
		TPointD m_aPos, m_bPos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		HookPosition(int id, const TPointD &aPos, const TPointD &bPos)
Toshihiro Shimizu 890ddd
			: m_id(id), m_aPos(aPos), m_bPos(bPos) {}
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<hookposition> m_hookPositions;</hookposition>
Toshihiro Shimizu 890ddd
	TXshLevelP m_level;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HooksData(const TXshLevelP &level);
Toshihiro Shimizu 890ddd
	~HooksData();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	HooksData *clone() const;
Shinya Kitaoka 3bfa54
	void storeHookPositions(const std::vector<int> &ids);</int>
Toshihiro Shimizu 890ddd
	void restoreHookPositions() const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// HookSelection
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// Derived from TSelection. Control which hooks are currently selected
Toshihiro Shimizu 890ddd
// Note that a hook is made of two different parts (used e.g. to "pass the hook"
Toshihiro Shimizu 890ddd
// between the feet in a walking cycle) that can be independently selected (1=A,2=B)
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HookSelection : public TSelection
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TXshLevelP m_level;
Toshihiro Shimizu 890ddd
	std::set<std::pair<int, int="">> m_hooks; // hookId, side : 1=A 2=B</std::pair<int,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HookSelection();
Toshihiro Shimizu 890ddd
	~HookSelection();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSelection *clone() const;
Toshihiro Shimizu 890ddd
	void setLevel(const TXshLevelP &level) { m_level = level; }
Toshihiro Shimizu 890ddd
	void select(int id, int side);
Toshihiro Shimizu 890ddd
	void unselect(int id, int side);
Toshihiro Shimizu 890ddd
	bool isSelected(int id, int side) const;
Toshihiro Shimizu 890ddd
	void invertSelection(int id, int side);
Toshihiro Shimizu 890ddd
	bool isEmpty() const;
Toshihiro Shimizu 890ddd
	void selectNone() { m_hooks.clear(); }
Toshihiro Shimizu 890ddd
	HookSet *getHookSet() const;
Toshihiro Shimizu 890ddd
	bool select(const TSelection *s);
Toshihiro Shimizu 890ddd
	void enableCommands();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//commands
Toshihiro Shimizu 890ddd
	void deleteSelectedHooks();
Toshihiro Shimizu 890ddd
	void copySelectedHooks();
Toshihiro Shimizu 890ddd
	void cutSelectedHooks();
Toshihiro Shimizu 890ddd
	void pasteSelectedHooks();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif //HOOK_SELECTION