Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "keyframeselection.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Tnz6 includes
Toshihiro Shimizu 890ddd
#include "keyframedata.h"
Toshihiro Shimizu 890ddd
#include "cellkeyframedata.h"
Toshihiro Shimizu 890ddd
#include "tapp.h"
Toshihiro Shimizu 890ddd
#include "menubarcommandids.h"
manongjohn b248d8
#include "xsheetviewer.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tobjecthandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/stageobjectutil.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcolumn.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qapplication></qapplication>
Toshihiro Shimizu 890ddd
#include <qclipboard></qclipboard>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct PegbarArgument {
Shinya Kitaoka 120a6e
  TStageObject *m_stageObject;
Shinya Kitaoka 120a6e
  std::set<int> m_frames;</int>
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
manongjohn b248d8
bool shiftKeyframesWithoutUndo(int r0, int r1, int c0, int c1, bool cut,
manongjohn b248d8
                               bool shiftFollowing) {
Shinya Kitaoka 120a6e
  int delta = cut ? -(r1 - r0 + 1) : r1 - r0 + 1;
Shinya Kitaoka 120a6e
  if (delta == 0) return false;
Shinya Kitaoka 120a6e
  TXsheet *xsh   = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
  bool isShifted = false;
Shinya Kitaoka 120a6e
  int x;
Shinya Kitaoka 120a6e
  for (x = c0; x <= c1; x++) {
Shinya Kitaoka 120a6e
    TStageObject *stObj = xsh->getStageObject(
John Dancel c323ac
        x >= 0 ? TStageObjectId::ColumnId(x)
John Dancel c323ac
               : TStageObjectId::CameraId(xsh->getCameraColumnIndex()));
Shinya Kitaoka 120a6e
    std::set<int> keyToShift;</int>
Shinya Kitaoka 120a6e
    int kr0, kr1;
Shinya Kitaoka 120a6e
    stObj->getKeyframeRange(kr0, kr1);
Shinya Kitaoka 120a6e
    int i = r0;
Shinya Kitaoka 120a6e
    while (i <= kr1) {
manongjohn b248d8
      if (stObj->isKeyframe(i)) {
manongjohn b248d8
        keyToShift.insert(i);
manongjohn b248d8
        if (!shiftFollowing) break;
manongjohn b248d8
      }
Shinya Kitaoka 120a6e
      i++;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    isShifted = stObj->moveKeyframes(keyToShift, delta);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return isShifted;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void copyKeyframesWithoutUndo(
Shinya Kitaoka 120a6e
    std::set<tkeyframeselection::position> *positions) {</tkeyframeselection::position>
Shinya Kitaoka 120a6e
  QClipboard *clipboard = QApplication::clipboard();
Shinya Kitaoka 120a6e
  TXsheet *xsh          = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
  TKeyframeData *data   = new TKeyframeData();
Shinya Kitaoka 120a6e
  data->setKeyframes(*positions, xsh);
Shinya Kitaoka 120a6e
  clipboard->setMimeData(data, QClipboard::Clipboard);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool pasteKeyframesWithoutUndo(
Shinya Kitaoka 120a6e
    const TKeyframeData *data,
Shinya Kitaoka 120a6e
    std::set<tkeyframeselection::position> *positions) {</tkeyframeselection::position>
Shinya Kitaoka 120a6e
  if (!data || positions->empty()) return false;
Shinya Kitaoka 120a6e
  TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
  if (!data->getKeyframes(*positions, xsh)) return false;
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool deleteKeyframesWithoutUndo(
Shinya Kitaoka 120a6e
    std::set<tkeyframeselection::position> *positions) {</tkeyframeselection::position>
Shinya Kitaoka 120a6e
  TApp *app = TApp::instance();
Shinya Kitaoka 120a6e
  assert(app);
John Dancel c323ac
  TXsheet *xsh = app->getCurrentXsheet()->getXsheet();
John Dancel c323ac
  TStageObjectId cameraId =
John Dancel c323ac
      TStageObjectId::CameraId(xsh->getCameraColumnIndex());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (positions->empty()) return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::set<tkeyframeselection::position>::iterator it = positions->begin();</tkeyframeselection::position>
Shinya Kitaoka 120a6e
  bool areAllColumnLocked                             = true;
Shinya Kitaoka 120a6e
  for (; it != positions->end(); ++it) {
Shinya Kitaoka 120a6e
    int row              = it->first;
Shinya Kitaoka 120a6e
    int col              = it->second;
Shinya Kitaoka 120a6e
    TStageObject *pegbar = xsh->getStageObject(
Shinya Kitaoka 120a6e
        col >= 0 ? TStageObjectId::ColumnId(col) : cameraId);
manongjohn 4334db
    if (xsh->getColumn(col) && xsh->getColumn(col)->isLocked()) continue;
Shinya Kitaoka 120a6e
    areAllColumnLocked = false;
Shinya Kitaoka 120a6e
    assert(pegbar);
Shinya Kitaoka 120a6e
    pegbar->removeKeyframeWithoutUndo(row);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (areAllColumnLocked) return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  positions->clear();
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
//  PasteKeyframesUndo
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class PasteKeyframesUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TKeyframeSelection *m_selection;
Shinya Kitaoka 120a6e
  QMimeData *m_newData;
Shinya Kitaoka 120a6e
  QMimeData *m_oldData;
Shinya Kitaoka 120a6e
  int m_r0, m_r1, m_c0, m_c1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  PasteKeyframesUndo(TKeyframeSelection *selection, QMimeData *newData,
Shinya Kitaoka 120a6e
                     QMimeData *oldData, int r0, int r1, int c0, int c1)
Shinya Kitaoka 120a6e
      : m_selection(selection)
Shinya Kitaoka 120a6e
      , m_newData(newData)
Shinya Kitaoka 120a6e
      , m_oldData(oldData)
Shinya Kitaoka 120a6e
      , m_r0(r0)
Shinya Kitaoka 120a6e
      , m_r1(r1)
Shinya Kitaoka 120a6e
      , m_c0(c0)
Shinya Kitaoka 120a6e
      , m_c1(c1) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~PasteKeyframesUndo() {
Shinya Kitaoka 120a6e
    delete m_selection;
Shinya Kitaoka 120a6e
    delete m_newData;
Shinya Kitaoka 120a6e
    delete m_oldData;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // data->xsh
Shinya Kitaoka 120a6e
  void setXshFromData(QMimeData *data) const {
Shinya Kitaoka 120a6e
    const TKeyframeData *keyframeData = dynamic_cast<tkeyframedata *="">(data);</tkeyframedata>
manongjohn 9c3f7d
    if (keyframeData) {
manongjohn 9c3f7d
      TKeyframeSelection *selection =
manongjohn 9c3f7d
          new TKeyframeSelection(m_selection->getSelection());
manongjohn 9c3f7d
      pasteKeyframesWithoutUndo(keyframeData, &selection->getSelection());
manongjohn 9c3f7d
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    // Delete merged data
manongjohn 9c3f7d
    TKeyframeSelection *selection =
manongjohn 9c3f7d
        new TKeyframeSelection(m_selection->getSelection());
manongjohn 9c3f7d
    deleteKeyframesWithoutUndo(&selection->getSelection());
Shinya Kitaoka 120a6e
    if (-(m_r1 - m_r0 + 1) != 0)
manongjohn b248d8
      shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true, true);
Shinya Kitaoka 120a6e
    if (m_oldData) setXshFromData(m_oldData);
Shinya Kitaoka 120a6e
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    if (m_r1 - m_r0 + 1 != 0)
manongjohn b248d8
      shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false, true);
Shinya Kitaoka 120a6e
    // Delete merged data
Shinya Kitaoka 120a6e
    setXshFromData(m_newData);
Shinya Kitaoka 120a6e
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof(*this); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 38fd86
  QString getHistoryString() override {
Shinya Kitaoka 38fd86
    return QObject::tr("Paste Key Frames");
Shinya Kitaoka 38fd86
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
//  DeleteKeyframesUndo
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class DeleteKeyframesUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TKeyframeSelection *m_selection;
Shinya Kitaoka 120a6e
  QMimeData *m_data;
Shinya Kitaoka 120a6e
  int m_r0, m_r1, m_c0, m_c1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  DeleteKeyframesUndo(TKeyframeSelection *selection, QMimeData *data, int r0,
Shinya Kitaoka 120a6e
                      int r1, int c0, int c1)
Shinya Kitaoka 120a6e
      : m_selection(selection)
Shinya Kitaoka 120a6e
      , m_data(data)
Shinya Kitaoka 120a6e
      , m_r0(r0)
Shinya Kitaoka 120a6e
      , m_r1(r1)
Shinya Kitaoka 120a6e
      , m_c0(c0)
Shinya Kitaoka 120a6e
      , m_c1(c1) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~DeleteKeyframesUndo() {
Shinya Kitaoka 120a6e
    delete m_selection;
Shinya Kitaoka 120a6e
    delete m_data;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    const TKeyframeData *keyframeData = dynamic_cast<tkeyframedata *="">(m_data);</tkeyframedata>
Shinya Kitaoka 120a6e
    if (m_r1 - m_r0 + 1 != 0)
manongjohn b248d8
      shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, false, true);
Shinya Kitaoka 120a6e
    if (keyframeData)
Shinya Kitaoka 120a6e
      pasteKeyframesWithoutUndo(keyframeData, &m_selection->getSelection());
Shinya Kitaoka 120a6e
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
John Dancel c323ac
    TKeyframeSelection *tempSelection =
John Dancel c323ac
        new TKeyframeSelection(m_selection->getSelection());
John Dancel c323ac
    deleteKeyframesWithoutUndo(&tempSelection->getSelection());
Shinya Kitaoka 120a6e
    if (m_r1 - m_r0 + 1 != 0)
manongjohn b248d8
      shiftKeyframesWithoutUndo(m_r0, m_r1, m_c0, m_c1, true, true);
Shinya Kitaoka 120a6e
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof(*this); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 38fd86
  QString getHistoryString() override {
Shinya Kitaoka 38fd86
    return QObject::tr("Delete Key Frames");
Shinya Kitaoka 38fd86
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
manongjohn b248d8
//=============================================================================
manongjohn b248d8
//  ShiftKeyframesUndo
manongjohn b248d8
//-----------------------------------------------------------------------------
manongjohn b248d8
manongjohn b248d8
class ShiftKeyframesUndo final : public TUndo {
manongjohn b248d8
  int m_r0, m_r1, m_c0, m_c1;
manongjohn b248d8
  bool m_shiftFollowing;
manongjohn b248d8
manongjohn b248d8
public:
manongjohn b248d8
  ShiftKeyframesUndo(int r0, int r1, int c0, int c1, bool shiftFollowing)
manongjohn b248d8
      : m_r0(r0)
manongjohn b248d8
      , m_r1(r1)
manongjohn b248d8
      , m_c0(c0)
manongjohn b248d8
      , m_c1(c1)
manongjohn b248d8
      , m_shiftFollowing(shiftFollowing) {}
manongjohn b248d8
manongjohn b248d8
  ~ShiftKeyframesUndo() {}
manongjohn b248d8
  void undo() const override {
manongjohn b248d8
    if (m_r0 != m_r1) {
manongjohn b248d8
      int r1adj  = m_r0 < m_r1 ? m_r1 - 1 : m_r0 + (m_r0 - m_r1) - 1;
manongjohn b248d8
      int rshift = m_r0 < m_r1 ? 0 : -(r1adj - m_r0 + 1);
manongjohn b248d8
      bool cut   = m_r0 < m_r1 ? true : false;
manongjohn b248d8
manongjohn b248d8
      shiftKeyframesWithoutUndo(m_r0 + rshift, r1adj + rshift, m_c0, m_c1, cut,
manongjohn b248d8
                                m_shiftFollowing);
manongjohn b248d8
    }
manongjohn b248d8
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
manongjohn b248d8
  }
manongjohn b248d8
  void redo() const override {
manongjohn b248d8
    if (m_r0 != m_r1) {
manongjohn b248d8
      int r1adj = m_r0 < m_r1 ? m_r1 - 1 : m_r0 + (m_r0 - m_r1) - 1;
manongjohn b248d8
      bool cut  = m_r0 < m_r1 ? false : true;
manongjohn b248d8
manongjohn b248d8
      shiftKeyframesWithoutUndo(m_r0, r1adj, m_c0, m_c1, cut, m_shiftFollowing);
manongjohn b248d8
    }
manongjohn b248d8
    TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
manongjohn b248d8
  }
manongjohn b248d8
  int getSize() const override { return sizeof(*this); }
manongjohn b248d8
manongjohn b248d8
  QString getHistoryString() override {
manongjohn b248d8
    if (m_r0 < m_r1) return QObject::tr("Shift Key Frames Down");
manongjohn b248d8
    return QObject::tr("Shift Key Frames Up");
manongjohn b248d8
  }
manongjohn b248d8
};
manongjohn b248d8
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TKeyframeSelection
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::enableCommands() {
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Copy, &TKeyframeSelection::copyKeyframes);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Paste, &TKeyframeSelection::pasteKeyframes);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Cut, &TKeyframeSelection::cutKeyframes);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Clear, &TKeyframeSelection::deleteKeyframes);
manongjohn b248d8
  enableCommand(this, MI_ShiftKeyframesDown,
manongjohn b248d8
                &TKeyframeSelection::shiftKeyframesDown);
manongjohn b248d8
  enableCommand(this, MI_ShiftKeyframesUp,
manongjohn b248d8
                &TKeyframeSelection::shiftKeyframesUp);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int TKeyframeSelection::getFirstRow() const {
Shinya Kitaoka 120a6e
  if (isEmpty()) return 0;
Shinya Kitaoka 120a6e
  return m_positions.begin()->first;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::unselectLockedColumn() {
Shinya Kitaoka 120a6e
  TApp *app = TApp::instance();
Shinya Kitaoka 120a6e
  assert(app);
Shinya Kitaoka 120a6e
  TXsheet *xsh = app->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
  std::set<position> positions;</position>
Shinya Kitaoka 120a6e
  std::set<position>::iterator it;</position>
manongjohn 4334db
Shinya Kitaoka 120a6e
  for (it = m_positions.begin(); it != m_positions.end(); ++it) {
Shinya Kitaoka 120a6e
    int col = it->second;
manongjohn 4334db
    if (xsh->getColumn(col) && xsh->getColumn(col)->isLocked()) continue;
Shinya Kitaoka 120a6e
    positions.insert(*it);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_positions.swap(positions);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool TKeyframeSelection::select(const TSelection *s) {
Shinya Kitaoka 120a6e
  if (const TKeyframeSelection *ss =
Shinya Kitaoka 120a6e
          dynamic_cast<const *="" tkeyframeselection="">(s)) {</const>
Shinya Kitaoka 120a6e
    std::set<position> pos(ss->m_positions);</position>
Shinya Kitaoka 120a6e
    m_positions.swap(pos);
Shinya Kitaoka 120a6e
    makeCurrent();
Shinya Kitaoka 120a6e
    return true;
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::setKeyframes() {
Shinya Kitaoka 120a6e
  TApp *app                   = TApp::instance();
Shinya Kitaoka 120a6e
  TXsheetHandle *xsheetHandle = app->getCurrentXsheet();
Shinya Kitaoka 120a6e
  TXsheet *xsh                = xsheetHandle->getXsheet();
John Dancel c323ac
  TStageObjectId cameraId =
John Dancel c323ac
      TStageObjectId::CameraId(xsh->getCameraColumnIndex());
Shinya Kitaoka 120a6e
  if (isEmpty()) return;
Shinya Kitaoka 120a6e
  Position pos         = *m_positions.begin();
Shinya Kitaoka 120a6e
  int row              = pos.first;
Shinya Kitaoka 120a6e
  int col              = pos.second;
Shinya Kitaoka 120a6e
  TStageObjectId id    = col < 0 ? cameraId : TStageObjectId::ColumnId(col);
Shinya Kitaoka 120a6e
  TStageObject *pegbar = xsh->getStageObject(id);
Shinya Kitaoka 120a6e
  if (!pegbar) return;
Shinya Kitaoka 120a6e
  if (pegbar->isKeyframe(row)) {
Shinya Kitaoka 120a6e
    TStageObject::Keyframe key = pegbar->getKeyframe(row);
Shinya Kitaoka 120a6e
    pegbar->removeKeyframeWithoutUndo(row);
Shinya Kitaoka 120a6e
    UndoRemoveKeyFrame *undo =
Shinya Kitaoka 120a6e
        new UndoRemoveKeyFrame(id, row, key, xsheetHandle);
Shinya Kitaoka 120a6e
    undo->setObjectHandle(app->getCurrentObject());
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(undo);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    pegbar->setKeyframeWithoutUndo(row);
Shinya Kitaoka 120a6e
    UndoSetKeyFrame *undo = new UndoSetKeyFrame(id, row, xsheetHandle);
Shinya Kitaoka 120a6e
    undo->setObjectHandle(app->getCurrentObject());
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(undo);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentObject()->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::copyKeyframes() {
Shinya Kitaoka 120a6e
  if (isEmpty()) return;
Shinya Kitaoka 120a6e
  copyKeyframesWithoutUndo(&m_positions);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::pasteKeyframes() {
manongjohn 92bdfa
  pasteKeyframesWithShift(0, 0, 0, -1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::deleteKeyframes() {
Shinya Kitaoka 120a6e
  deleteKeyframesWithShift(0, -1, 0, -1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::cutKeyframes() {
Shinya Kitaoka 120a6e
  copyKeyframes();
Shinya Kitaoka 120a6e
  deleteKeyframesWithShift(0, -1, 0, -1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
manongjohn b248d8
void TKeyframeSelection::shiftKeyframes(int direction) {
manongjohn b248d8
  copyKeyframes();
manongjohn b248d8
  if (isEmpty()) return;
manongjohn b248d8
manongjohn b248d8
  std::set<position> positions = m_positions;</position>
manongjohn b248d8
manongjohn b248d8
  int r0 = positions.begin()->first;
manongjohn b248d8
  int c0 = positions.begin()->second;
manongjohn b248d8
manongjohn b248d8
  TXsheet *xsh = TApp::instance()->getCurrentXsheet()->getXsheet();
manongjohn b248d8
  TKeyframeData *data = new TKeyframeData();
manongjohn b248d8
  data->setKeyframes(positions, xsh);
manongjohn b248d8
manongjohn b248d8
  TUndoManager::manager()->beginBlock();
manongjohn b248d8
manongjohn b248d8
  XsheetViewer *viewer = TApp::instance()->getCurrentXsheetViewer();
manongjohn b248d8
  TKeyframeSelection *selection = viewer->getKeyframeSelection();
manongjohn b248d8
  selection->selectNone();
manongjohn b248d8
manongjohn b248d8
  std::set<position>::iterator it = positions.begin(), itEnd = positions.end();</position>
manongjohn b248d8
  for(; it != itEnd; ++it) {
manongjohn b248d8
    Position position = *it;
manongjohn b248d8
    int r = position.first;
manongjohn b248d8
    int c = position.second;
manongjohn b248d8
manongjohn b248d8
	TXshColumn *column = xsh->getColumn(c);
manongjohn b248d8
	if (!column || column->isLocked()) continue;
manongjohn b248d8
manongjohn b248d8
    shiftKeyframes(r, r + direction, c, c, false);
manongjohn b248d8
	selection->select(r + direction, c);
manongjohn b248d8
  }
manongjohn b248d8
manongjohn b248d8
  TUndoManager::manager()->endBlock();
manongjohn b248d8
}
manongjohn b248d8
manongjohn b248d8
//-----------------------------------------------------------------------------
manongjohn b248d8
Shinya Kitaoka 120a6e
void TKeyframeSelection::pasteKeyframesWithShift(int r0, int r1, int c0,
Shinya Kitaoka 120a6e
                                                 int c1) {
Shinya Kitaoka 120a6e
  unselectLockedColumn();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Retrieve keyframes to paste
Shinya Kitaoka 120a6e
  QClipboard *clipboard = QApplication::clipboard();
Shinya Kitaoka 120a6e
  const TKeyframeData *data =
Shinya Kitaoka 120a6e
      dynamic_cast<const *="" tkeyframedata="">(clipboard->mimeData());</const>
Shinya Kitaoka 120a6e
  if (!data) {
Shinya Kitaoka 120a6e
    const TCellKeyframeData *cellKeyframeData =
Shinya Kitaoka 120a6e
        dynamic_cast<const *="" tcellkeyframedata="">(clipboard->mimeData());</const>
Shinya Kitaoka 120a6e
    if (cellKeyframeData) data = cellKeyframeData->getKeyframeData();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (!data) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Retrieve corresponding old keyframes
Shinya Kitaoka 120a6e
  std::set<tkeyframeselection::position> positions(m_positions);</tkeyframeselection::position>
Shinya Kitaoka 120a6e
  data->getKeyframes(positions);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TKeyframeData *oldData = new TKeyframeData();
Shinya Kitaoka 120a6e
  TXsheet *xsh           = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
  oldData->setKeyframes(positions, xsh);
Shinya Kitaoka 120a6e
manongjohn b248d8
  bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, false, true);
Shinya Kitaoka 120a6e
  bool isPaste = pasteKeyframesWithoutUndo(data, &m_positions);
Shinya Kitaoka 120a6e
  if (!isPaste && !isShift) {
Shinya Kitaoka 120a6e
    delete oldData;
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TKeyframeData *newData = new TKeyframeData();
Shinya Kitaoka 120a6e
  newData->setKeyframes(m_positions, xsh);
Shinya Kitaoka 120a6e
  TKeyframeSelection *selection = new TKeyframeSelection(m_positions);
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new PasteKeyframesUndo(selection, newData, oldData, r0, r1, c0, c1));
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TKeyframeSelection::deleteKeyframesWithShift(int r0, int r1, int c0,
Shinya Kitaoka 120a6e
                                                  int c1) {
Shinya Kitaoka 120a6e
  unselectLockedColumn();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TKeyframeData *data = new TKeyframeData();
Shinya Kitaoka 120a6e
  TXsheet *xsh        = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
  data->setKeyframes(m_positions, xsh);
Shinya Kitaoka 120a6e
  if (m_positions.empty()) {
Shinya Kitaoka 120a6e
    delete data;
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TKeyframeSelection *selection = new TKeyframeSelection(m_positions);
Shinya Kitaoka 120a6e
  bool deleteKeyFrame           = deleteKeyframesWithoutUndo(&m_positions);
manongjohn b248d8
  bool isShift = shiftKeyframesWithoutUndo(r0, r1, c0, c1, true, true);
Shinya Kitaoka 120a6e
  if (!deleteKeyFrame && !isShift) {
Shinya Kitaoka 120a6e
    delete selection;
Shinya Kitaoka 120a6e
    delete data;
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new DeleteKeyframesUndo(selection, data, r0, r1, c0, c1));
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
manongjohn b248d8
manongjohn b248d8
//-----------------------------------------------------------------------------
manongjohn b248d8
manongjohn b248d8
void TKeyframeSelection::shiftKeyframes(int r0, int r1, int c0, int c1,
manongjohn b248d8
                                        bool shiftFollowing) {
manongjohn b248d8
  unselectLockedColumn();
manongjohn b248d8
manongjohn b248d8
  int r1adj = r0 < r1 ? r1 - 1 : r0 + (r0 - r1) - 1;
manongjohn b248d8
  bool cut  = r0 < r1 ? false : true;
manongjohn b248d8
manongjohn b248d8
  bool isShift =
manongjohn b248d8
      shiftKeyframesWithoutUndo(r0, r1adj, c0, c1, cut, shiftFollowing);
manongjohn b248d8
  if (!isShift) return;
manongjohn b248d8
manongjohn b248d8
  TUndoManager::manager()->add(
manongjohn b248d8
      new ShiftKeyframesUndo(r0, r1, c0, c1, shiftFollowing));
manongjohn b248d8
  TApp::instance()->getCurrentScene()->setDirtyFlag(true);
manongjohn b248d8
  TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
manongjohn b248d8
}