Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef FUNCTIONPANELTOOLS_H
Toshihiro Shimizu 890ddd
#define FUNCTIONPANELTOOLS_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/functionpanel.h"
Toshihiro Shimizu 890ddd
#include "tdoublekeyframe.h"
Toshihiro Shimizu 890ddd
#include "toonz/doubleparamcmd.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// class QMouseEvent;
Toshihiro Shimizu 890ddd
class KeyframeSetter;
Toshihiro Shimizu 890ddd
class TDoubleParam;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DragTool() {}
Toshihiro Shimizu 890ddd
	virtual ~DragTool() {}
Toshihiro Shimizu 890ddd
	virtual void click(QMouseEvent *e) {}
Toshihiro Shimizu 890ddd
	virtual void drag(QMouseEvent *e) {}
Toshihiro Shimizu 890ddd
	virtual void release(QMouseEvent *e) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void draw(QPainter &p) {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MoveFrameDragTool : public FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FunctionPanel *m_panel;
Toshihiro Shimizu 890ddd
	TFrameHandle *m_frameHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MoveFrameDragTool(FunctionPanel *panel, TFrameHandle *frameHandle);
Toshihiro Shimizu 890ddd
	void drag(QMouseEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class PanDragTool : public FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FunctionPanel *m_panel;
Toshihiro Shimizu 890ddd
	QPoint m_oldPos;
Toshihiro Shimizu 890ddd
	bool m_xLocked, m_yLocked;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	PanDragTool(FunctionPanel *panel, bool xLocked, bool yLocked);
Toshihiro Shimizu 890ddd
	void click(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void drag(QMouseEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ZoomDragTool : public FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FunctionPanel *m_panel;
Toshihiro Shimizu 890ddd
	QPoint m_startPos, m_oldPos;
Toshihiro Shimizu 890ddd
	int m_zoomType;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	enum ZoomType { FrameZoom = 1,
Toshihiro Shimizu 890ddd
					ValueZoom = 2 };
Toshihiro Shimizu 890ddd
	ZoomDragTool(FunctionPanel *panel, ZoomType zoomType) : m_panel(panel), m_zoomType((int)zoomType) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void click(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void drag(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void release(QMouseEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class RectSelectTool : public FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FunctionPanel *m_panel;
Toshihiro Shimizu 890ddd
	TDoubleParam *m_curve;
Toshihiro Shimizu 890ddd
	QPoint m_startPos;
Toshihiro Shimizu 890ddd
	QRect m_rect;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	RectSelectTool(FunctionPanel *panel, TDoubleParam *curve) : m_panel(panel), m_curve(curve) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void click(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void drag(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void release(QMouseEvent *e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void draw(QPainter &painter);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MovePointDragTool : public FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FunctionPanel *m_panel;
Toshihiro Shimizu 890ddd
	QPoint m_startPos, m_oldPos;
Toshihiro Shimizu 890ddd
	double m_deltaFrame;
Toshihiro Shimizu 890ddd
	// length and kIndex of speedinout handles which can change because of point moving
Toshihiro Shimizu 890ddd
	double m_speed0Length;
Toshihiro Shimizu 890ddd
	int m_speed0Index;
Toshihiro Shimizu 890ddd
	double m_speed1Length;
Toshihiro Shimizu 890ddd
	int m_speed1Index;
Toshihiro Shimizu 890ddd
	std::vector<KeyframeSetter *> m_setters;
Toshihiro Shimizu 890ddd
	bool m_groupEnabled;
Toshihiro Shimizu 890ddd
	FunctionSelection *m_selection;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MovePointDragTool(
Toshihiro Shimizu 890ddd
		FunctionPanel *panel,
Toshihiro Shimizu 890ddd
		TDoubleParam *curve);
Toshihiro Shimizu 890ddd
	~MovePointDragTool();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void addKeyframe2(int kIndex);
Toshihiro Shimizu 890ddd
	// void addKeyframe(int kIndex) {m_setter->selectKeyframe(kIndex);}
Toshihiro Shimizu 890ddd
	void createKeyframe(double frame);
Toshihiro Shimizu 890ddd
	void selectKeyframes(double frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setSelection(FunctionSelection *selection);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void click(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void drag(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void release(QMouseEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MoveHandleDragTool : public FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef FunctionPanel::Handle Handle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	FunctionPanel *m_panel;
Toshihiro Shimizu 890ddd
	TDoubleParam *m_curve;
Toshihiro Shimizu 890ddd
	QPoint m_startPos; //, m_oldPos;
Toshihiro Shimizu 890ddd
	double m_deltaFrame;
Toshihiro Shimizu 890ddd
	Handle m_handle;
Toshihiro Shimizu 890ddd
	int m_kIndex;
Toshihiro Shimizu 890ddd
	TDoubleKeyframe m_keyframe;
Toshihiro Shimizu 890ddd
	KeyframeSetter m_setter;
Toshihiro Shimizu 890ddd
	double m_segmentWidth;
Toshihiro Shimizu 890ddd
	QPointF m_nSpeed; // speedInOut constraint
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FunctionTreeModel::ChannelGroup *m_channelGroup;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	MoveHandleDragTool(
Toshihiro Shimizu 890ddd
		FunctionPanel *panel,
Toshihiro Shimizu 890ddd
		TDoubleParam *curve,
Toshihiro Shimizu 890ddd
		int kIndex,
Toshihiro Shimizu 890ddd
		Handle handle);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void click(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void drag(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void release(QMouseEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MoveGroupHandleDragTool : public FunctionPanel::DragTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef FunctionPanel::Handle Handle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	FunctionPanel *m_panel;
Toshihiro Shimizu 890ddd
	double m_keyframePosition;
Toshihiro Shimizu 890ddd
	Handle m_handle;
Toshihiro Shimizu 890ddd
	std::vector<std::pair<TDoubleKeyframe, KeyframeSetter *>> m_setters;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MoveGroupHandleDragTool(
Toshihiro Shimizu 890ddd
		FunctionPanel *panel,
Toshihiro Shimizu 890ddd
		double keyframePosition,
Toshihiro Shimizu 890ddd
		Handle handle);
Toshihiro Shimizu 890ddd
	~MoveGroupHandleDragTool();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void click(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void drag(QMouseEvent *e);
Toshihiro Shimizu 890ddd
	void release(QMouseEvent *e);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif