Blob Blame Raw


#ifndef KEYFRAMEMOVER_H
#define KEYFRAMEMOVER_H

#include "xsheetdragtool.h"
#include "keyframeselection.h"
#include "keyframedata.h"
#include "toonz/txshcell.h"

class TXsheet;

//=============================================================================
// KeyframeMover
//-----------------------------------------------------------------------------

class KeyframeMover
{
	//! Bitmask of qualifiers that change the behaviour of the Mover
	int m_qualifiers;

	typedef std::pair<int, int> KeyframePosition; // row, col

	//! Start Selected keyframes
	std::set<KeyframePosition> m_startSelectedKeyframes;

	//! Store all keyframes position in selected StageObject.
	std::set<KeyframePosition> m_lastKeyframes;
	//! Store all keyframes in selected stageObject.
	TKeyframeData *m_lastKeyframeData;

	//! Helper method: returns the current xsheet
	TXsheet *getXsheet() const;

	// m_lastKeyframes and m_lastKeyframeData -> xsheet
	void setKeyframes();

	// m_lastKeyframes and m_lastKeyframeData <- xsheet
	void getKeyframes();

public:
	KeyframeMover();
	~KeyframeMover();

	enum Qualifier {
		eCopyKeyframes = 0x1, // leaves a copy of Keyframes block at the starting point
		eMoveKeyframes = 0x2, // move keyframes only (if the destination keyframes are empty)
		eInsertKeyframes = 0x4,
		eOverwriteKeyframes = 0x8
	};

	void start(TKeyframeSelection *selection, int qualifiers);

	int getQualifiers() const { return m_qualifiers; }

	bool moveKeyframes(int dr, std::set<TKeyframeSelection::Position> &newPositions, TKeyframeSelection *selection = 0);

	void undoMoveKeyframe() { setKeyframes(); }
};

//=============================================================================
// KeyframeMoverTool
//-----------------------------------------------------------------------------

class KeyframeMoverTool : public XsheetGUI::DragTool
{
	TKeyframeSelection m_startSelection;
	int m_offset;
	int m_firstRow, m_firstCol;
	bool m_selecting;
	bool m_justMovement;
	TPointD m_startPos, m_curPos;
	KeyframeMover *m_mover;
	bool m_firstKeyframeMovement;

	//! Helper method: returns the current keyframe selection
	TKeyframeSelection *getSelection();

	void ctrlSelect(int row, int col);
	void shiftSelect(int row, int col);

	void rectSelect(int row, int col);

public:
	KeyframeMoverTool(XsheetViewer *viewer, bool justMovement = false);

	bool canMove(const TPoint &pos);

	void onCellChange(int row, int col);

	void onClick(const QMouseEvent *event);
	void onDrag(const QMouseEvent *event);
	void onRelease(int row, int col);
	void drawCellsArea(QPainter &p);
};

#endif