Blob Blame History Raw


#ifndef XSHCELLMOVER_H
#define XSHCELLMOVER_H

#include "tgeometry.h"
#include "toonz/txshcell.h"
#include "toonz/txshcolumn.h"
#include "tundo.h"
#include <QMap>
#include "xsheetdragtool.h"

#include <set>

class StageObjectsData;
class TXsheet;
class LevelMoverUndo;

class CellsMover
{
	// range of the moved cells
	int m_rowCount, m_colCount;
	// current and start top-left corner of the moved cells
	// (x=column, y=row)
	TPoint m_pos, m_startPos;
	// moved cells and cells currently overwritten
	std::vector<TXshCell> m_cells, m_oldCells;
	// columns data of the moved cells
	StageObjectsData *m_columnsData;

	// bitmask of qualifiers that change the behaviour of the Mover
	int m_qualifiers;

	// helper method
	TXsheet *getXsheet() const;

	// cells[] <- xhseet (all the cells block; cells are stored column by column)
	void getCells(std::vector<TXshCell> &cells, int r, int c) const;

	// cells[] -> xsheet (possibly inserting, according to m_qualifiers)
	void setCells(const std::vector<TXshCell> &cells, int r, int c) const;

	// m_columnsData <- xsheet columns data
	void getColumnsData(int c0, int c1);

public:
	enum Qualifier {
		eCopyCells = 0x1, // leaves a copy of cells block at the starting point
		eInsertCells = 0x2,
		eOverwriteCells = 0x4,
		eMoveColumns = 0x8 // move columns only (if the destination columns are empty)
	};

	CellsMover();
	~CellsMover();

	// porcata da aggiustare
	int m_uffa;

	// initialize the Mover
	void start(int r0, int c0, int r1, int c1, int qualifiers);

	int getQualifiers() const { return m_qualifiers; }
	TPoint getStartPos() const { return m_startPos; }
	TPoint getPos() const { return m_pos; }
	int getColumnCount() const { return m_colCount; }
	int getRowCount() const { return m_rowCount; }

	void setPos(const TPoint &p) { m_pos = p; }
	void setPos(int r, int c) { setPos(TPoint(c, r)); }

	void saveCells();
	void moveCells(const TPoint &pos) const;
	void moveCells() const { moveCells(m_pos); }
	void undoMoveCells(const TPoint &pos) const;
	void undoMoveCells() const { undoMoveCells(m_pos); }
	bool canMoveCells(const TPoint &pos);

	void restoreColumns(int c) const;
	void emptyColumns(int c) const;
	TXshColumn::ColumnType getColumnTypeFromCell(int index) const;

private:
	// not implemented
	CellsMover(const CellsMover &);
	const CellsMover &operator=(const CellsMover &);
};

class LevelMoverTool : public XsheetGUI::DragTool
{
protected:
	TPoint m_grabOffset;
	TPoint m_startPos, m_lastPos, m_aimedPos;
	TDimension m_range;

	int m_qualifiers;
	bool m_validPos;
	LevelMoverUndo *m_undo;
	bool m_moved;
	bool m_columnsMoved;

	bool isTotallyEmptyColumn(int col) const;
	virtual bool canMove(const TPoint &pos);
	bool canMoveColumns(const TPoint &pos);

public:
	LevelMoverTool(XsheetViewer *viewer);
	~LevelMoverTool();

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

#endif