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