Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef KEYFRAMEMOVER_H
Toshihiro Shimizu 890ddd
#define KEYFRAMEMOVER_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "xsheetdragtool.h"
Toshihiro Shimizu 890ddd
#include "keyframeselection.h"
Toshihiro Shimizu 890ddd
#include "keyframedata.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcell.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TXsheet;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// KeyframeMover
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class KeyframeMover {
Shinya Kitaoka 120a6e
  //! Bitmask of qualifiers that change the behaviour of the Mover
Shinya Kitaoka 120a6e
  int m_qualifiers;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  typedef std::pair<int, int=""> KeyframePosition;  // row, col</int,>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Start Selected keyframes
Shinya Kitaoka 120a6e
  std::set<keyframeposition> m_startSelectedKeyframes;</keyframeposition>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Store all keyframes position in selected StageObject.
Shinya Kitaoka 120a6e
  std::set<keyframeposition> m_lastKeyframes;</keyframeposition>
Shinya Kitaoka 120a6e
  //! Store all keyframes in selected stageObject.
Shinya Kitaoka 120a6e
  TKeyframeData *m_lastKeyframeData;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Helper method: returns the current xsheet
Shinya Kitaoka 120a6e
  TXsheet *getXsheet() const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // m_lastKeyframes and m_lastKeyframeData -> xsheet
Shinya Kitaoka 120a6e
  void setKeyframes();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // m_lastKeyframes and m_lastKeyframeData <- xsheet
Shinya Kitaoka 120a6e
  void getKeyframes();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  KeyframeMover();
Shinya Kitaoka 120a6e
  ~KeyframeMover();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  enum Qualifier {
Shinya Kitaoka 120a6e
    eCopyKeyframes =
Shinya Kitaoka 120a6e
        0x1,  // leaves a copy of Keyframes block at the starting point
Shinya Kitaoka 120a6e
    eMoveKeyframes =
Shinya Kitaoka 120a6e
        0x2,  // move keyframes only (if the destination keyframes are empty)
Shinya Kitaoka 120a6e
    eInsertKeyframes    = 0x4,
Shinya Kitaoka 120a6e
    eOverwriteKeyframes = 0x8
Shinya Kitaoka 120a6e
  };
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void start(TKeyframeSelection *selection, int qualifiers);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int getQualifiers() const { return m_qualifiers; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool moveKeyframes(int dr,
Shinya Kitaoka 120a6e
                     std::set<tkeyframeselection::position> &newPositions,</tkeyframeselection::position>
Shinya Kitaoka 120a6e
                     TKeyframeSelection *selection = 0);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void undoMoveKeyframe() { setKeyframes(); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// KeyframeMoverTool
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class KeyframeMoverTool final : public XsheetGUI::DragTool {
Shinya Kitaoka 120a6e
  TKeyframeSelection m_startSelection;
Shinya Kitaoka 120a6e
  int m_offset;
Shinya Kitaoka 120a6e
  int m_firstRow, m_firstCol;
Shinya Kitaoka 120a6e
  bool m_selecting;
Shinya Kitaoka 120a6e
  bool m_justMovement;
Shinya Kitaoka 120a6e
  TPointD m_startPos, m_curPos;
Shinya Kitaoka 120a6e
  KeyframeMover *m_mover;
Shinya Kitaoka 120a6e
  bool m_firstKeyframeMovement;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Helper method: returns the current keyframe selection
Shinya Kitaoka 120a6e
  TKeyframeSelection *getSelection();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void ctrlSelect(int row, int col);
Shinya Kitaoka 120a6e
  void shiftSelect(int row, int col);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void rectSelect(int row, int col);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  KeyframeMoverTool(XsheetViewer *viewer, bool justMovement = false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool canMove(const TPoint &pos);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void onCellChange(int row, int col);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void onClick(const QMouseEvent *event) override;
Shinya Kitaoka 473e70
  void onDrag(const QMouseEvent *event) override;
Jaroslav 203cc8
  void onRelease(const CellPosition &pos) override;
Shinya Kitaoka 473e70
  void drawCellsArea(QPainter &p) override;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif