Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tdoubleparam.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/tstageobject.h"
Toshihiro Shimizu 890ddd
#include "toonz/tobjecthandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/doubleparamcmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonz/stageobjectutil.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// TStageObjectValues
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TStageObjectValues::Channel::Channel(TStageObject::Channel actionId)
Shinya Kitaoka 120a6e
    : m_actionId(actionId)
Shinya Kitaoka 120a6e
    , m_value(0)  //, m_isKeyframe(false)
Shinya Kitaoka 120a6e
{}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TStageObjectValues::TStageObjectValues()
Shinya Kitaoka 120a6e
    : m_objectId(TStageObjectId::NoneId), m_frame(-1) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TStageObjectValues::TStageObjectValues(TStageObjectId id,
Shinya Kitaoka 120a6e
                                       TStageObject::Channel a0)
Shinya Kitaoka 120a6e
    : m_objectId(id), m_frame(-1) {
Shinya Kitaoka 120a6e
  add(a0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TStageObjectValues::TStageObjectValues(TStageObjectId id,
Shinya Kitaoka 120a6e
                                       TStageObject::Channel a0,
Shinya Kitaoka 120a6e
                                       TStageObject::Channel a1)
Shinya Kitaoka 120a6e
    : m_objectId(id), m_frame(-1) {
Shinya Kitaoka 120a6e
  add(a0);
Shinya Kitaoka 120a6e
  add(a1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectValues::add(TStageObject::Channel actionId) {
Shinya Kitaoka 120a6e
  bool isFound = false;
Shinya Kitaoka 120a6e
  std::vector<channel>::iterator it;</channel>
Shinya Kitaoka 120a6e
  for (it = m_channels.begin(); it != m_channels.end(); ++it) {
Shinya Kitaoka 120a6e
    TStageObjectValues::Channel ch = *it;
Shinya Kitaoka 120a6e
    if (ch.m_actionId == actionId) {
Shinya Kitaoka 120a6e
      isFound = true;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (!isFound) m_channels.push_back(Channel(actionId));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectValues::updateValues() {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  if (m_objectId == TStageObjectId::NoneId)
Shinya Kitaoka 120a6e
    m_objectId = m_objectHandle->getObjectId();
Shinya Kitaoka 120a6e
  m_frame      = m_frameHandle->getFrame();
Shinya Kitaoka 120a6e
  std::vector<channel>::iterator it;</channel>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (it = m_channels.begin(); it != m_channels.end(); ++it) {
Shinya Kitaoka 120a6e
    TDoubleParam *param =
Shinya Kitaoka 120a6e
        xsh->getStageObject(m_objectId)->getParam(it->m_actionId);
Shinya Kitaoka 120a6e
    it->setValue(param->getValue(m_frame));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
TStageObject *getAncestor(TStageObjectTree *tree, TStageObject *obj) {
Shinya Kitaoka 120a6e
  TStageObjectId parentId = obj->getParent();
Shinya Kitaoka 120a6e
  TStageObject *root      = obj;
Shinya Kitaoka 120a6e
  while (parentId != TStageObjectId::NoneId && parentId.isColumn()) {
Shinya Kitaoka 120a6e
    root     = tree->getStageObject(parentId);
Shinya Kitaoka 120a6e
    parentId = root->getParent();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return root;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------
Shinya Kitaoka 120a6e
void TStageObjectValues::applyValues(bool undoEnabled) const {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  std::vector<channel>::const_iterator it;</channel>
Shinya Kitaoka 120a6e
  for (it = m_channels.begin(); it != m_channels.end(); ++it) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = xsh->getStageObject(m_objectId);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TDoubleParam *param =
Shinya Kitaoka 120a6e
        pegbar->getParam((TStageObject::Channel)it->m_actionId);
Shinya Kitaoka 120a6e
    if (!param->isKeyframe(m_frame)) {
Shinya Kitaoka 120a6e
      KeyframeSetter setter(param, -1,
Shinya Kitaoka 120a6e
                            undoEnabled);  // Deve essere registrato l'undo
Shinya Kitaoka 120a6e
      setter.createKeyframe(m_frame);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    int indexKeyframe = param->getClosestKeyframe(m_frame);
Shinya Kitaoka 120a6e
    KeyframeSetter setter(param, indexKeyframe,
Shinya Kitaoka 120a6e
                          false);  // Non deve essere registrato l'undo
Shinya Kitaoka 120a6e
    setter.setValue(it->getValue());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  //--- Permette l'undo per l'interpolazione con la cinematica inversa
Shinya Kitaoka 120a6e
  TStageObjectTree *tree = xsh->getStageObjectTree();
Shinya Kitaoka 120a6e
  if (tree) {
Shinya Kitaoka 120a6e
    TStageObject *root = getAncestor(tree, tree->getStageObject(m_objectId));
Shinya Kitaoka 120a6e
    if (root) root->invalidate();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  //---
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectValues::Channel::setValue(double value) {
Shinya Kitaoka 120a6e
  if (m_actionId == TStageObject::T_ScaleX ||
Shinya Kitaoka 120a6e
      m_actionId == TStageObject::T_ScaleY) {
Shinya Kitaoka 120a6e
    const double eps             = 1.e-8;
Shinya Kitaoka 120a6e
    if (fabs(value) < eps) value = value < 0 ? -eps : eps;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_value = value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectValues::setValue(double v) { m_channels[0].setValue(v); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectValues::setValues(double v0, double v1) {
Shinya Kitaoka 120a6e
  m_channels[0].setValue(v0);
Shinya Kitaoka 120a6e
  m_channels[1].setValue(v1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
double TStageObjectValues::getValue(int index) const {
Shinya Kitaoka 120a6e
  assert(0 <= index && index < (int)m_channels.size());
Shinya Kitaoka 120a6e
  return m_channels[index].getValue();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectValues::setGlobalKeyframe() {
Shinya Kitaoka 120a6e
  TXsheet *xsh              = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObject *stageObject = xsh->getStageObject(m_objectId);
Shinya Kitaoka 120a6e
  stageObject->setKeyframeWithoutUndo(m_frame);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*-- HistoryViewerに、動かしたObject/Channel名・フレーム番号の文字列を返す --*/
Shinya Kitaoka 120a6e
QString TStageObjectValues::getStringForHistory() {
Shinya Kitaoka 120a6e
  /*-- どのチャンネルを動かしたか --*/
Shinya Kitaoka 120a6e
  QString channelStr;
Shinya Kitaoka 120a6e
  if (m_channels.size() > 1) /*--複数チャンネルを動かした場合--*/
Shinya Kitaoka 120a6e
    channelStr = QObject::tr("Move");
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    switch (m_channels.at(0).m_actionId) {
Shinya Kitaoka 120a6e
    case TStageObject::T_Angle:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit Rotation");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_X:
c7649c
      channelStr = QObject::tr("Move X");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_Y:
c7649c
      channelStr = QObject::tr("Move Y");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_Z:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Move Z");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_SO:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit Stack Order");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_ScaleX:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit Scale W");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_ScaleY:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit Scale H");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_Scale:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit Scale");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_Path:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit PosPath");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_ShearX:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit Shear X");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    case TStageObject::T_ShearY:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Edit Shear Y");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    default:
Shinya Kitaoka 120a6e
      channelStr = QObject::tr("Move");
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return QObject::tr("%1  %2  Frame : %3")
Shinya Kitaoka 120a6e
      .arg(channelStr)
Shinya Kitaoka 120a6e
      .arg(QString::fromStdString(m_objectId.toString()))
Shinya Kitaoka 120a6e
      .arg(m_frame + 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// UndoSetKeyFrame
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
UndoSetKeyFrame::UndoSetKeyFrame(TStageObjectId objectId, int frame,
Shinya Kitaoka 120a6e
                                 TXsheetHandle *xsheetHandle)
Shinya Kitaoka 120a6e
    : m_objId(objectId), m_frame(frame), m_xsheetHandle(xsheetHandle) {
Shinya Kitaoka 120a6e
  TXsheet *xsh      = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObject *obj = xsh->getStageObject(m_objId);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_key = obj->getKeyframe(frame);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoSetKeyFrame::undo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  assert(xsh->getStageObject(m_objId));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (TStageObject *obj = xsh->getStageObject(m_objId)) {
Shinya Kitaoka 120a6e
    obj->removeKeyframeWithoutUndo(m_frame);
Shinya Kitaoka 120a6e
    if (m_key.m_isKeyframe) obj->setKeyframeWithoutUndo(m_frame, m_key);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoSetKeyFrame::redo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  assert(xsh->getStageObject(m_objId));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (TStageObject *obj = xsh->getStageObject(m_objId))
Shinya Kitaoka 120a6e
    obj->setKeyframeWithoutUndo(m_frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int UndoSetKeyFrame::getSize() const {
Shinya Kitaoka 120a6e
  return 10 << 10;
Shinya Kitaoka 120a6e
}  // Gave up exact calculation. Say ~10 kB?
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// UndoRemoveKeyFrame
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
UndoRemoveKeyFrame::UndoRemoveKeyFrame(TStageObjectId objectId, int frame,
Shinya Kitaoka 120a6e
                                       TStageObject::Keyframe key,
Shinya Kitaoka 120a6e
                                       TXsheetHandle *xsheetHandle)
Shinya Kitaoka 120a6e
    : m_objId(objectId)
Shinya Kitaoka 120a6e
    , m_frame(frame)
Shinya Kitaoka 120a6e
    , m_xsheetHandle(xsheetHandle)
Shinya Kitaoka 120a6e
    , m_key(key) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoRemoveKeyFrame::undo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  assert(xsh->getStageObject(m_objId));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (TStageObject *obj = xsh->getStageObject(m_objId)) {
Shinya Kitaoka 120a6e
    obj->setKeyframeWithoutUndo(m_frame);
Shinya Kitaoka 120a6e
    obj->setKeyframeWithoutUndo(m_frame, m_key);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoRemoveKeyFrame::redo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  assert(xsh->getStageObject(m_objId));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (TStageObject *obj = xsh->getStageObject(m_objId))
Shinya Kitaoka 120a6e
    obj->removeKeyframeWithoutUndo(m_frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int UndoRemoveKeyFrame::getSize() const {
Shinya Kitaoka 120a6e
  return 10 << 10;
Shinya Kitaoka 120a6e
}  // Gave up exact calculation. Say ~10 kB?
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// UndoStageObjectCenterMove
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
UndoStageObjectCenterMove::UndoStageObjectCenterMove(const TStageObjectId &id,
Shinya Kitaoka 120a6e
                                                     int frame,
Shinya Kitaoka 120a6e
                                                     const TPointD &before,
Shinya Kitaoka 120a6e
                                                     const TPointD &after)
Shinya Kitaoka 120a6e
    : m_pid(id), m_frame(frame), m_before(before), m_after(after) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoStageObjectCenterMove::undo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  xsh->setCenter(m_pid, m_frame, m_before);
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoStageObjectCenterMove::redo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  xsh->setCenter(m_pid, m_frame, m_after);
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// UndoStageObjectMove
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
UndoStageObjectMove::UndoStageObjectMove(const TStageObjectValues &before,
Shinya Kitaoka 120a6e
                                         const TStageObjectValues &after)
Shinya Kitaoka 120a6e
    : m_before(before), m_after(after) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoStageObjectMove::undo() const {
Shinya Kitaoka 120a6e
  m_before.applyValues(false);
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoStageObjectMove::redo() const {
Shinya Kitaoka 120a6e
  m_after.applyValues(false);
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// UndoStageObjectPinned
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
UndoStageObjectPinned::UndoStageObjectPinned(const TStageObjectId &id,
Shinya Kitaoka 120a6e
                                             int frame, const bool &before,
Shinya Kitaoka 120a6e
                                             const bool &after)
Shinya Kitaoka 120a6e
    : m_pid(id), m_frame(frame), m_before(before), m_after(after) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoStageObjectPinned::undo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh      = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObject *obj = xsh->getStageObject(m_pid);
Shinya Kitaoka 120a6e
  assert(0);
Shinya Kitaoka 120a6e
  // obj->setIsPinned(m_frame,m_before);
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void UndoStageObjectPinned::redo() const {
Shinya Kitaoka 120a6e
  TXsheet *xsh      = m_xsheetHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObject *obj = xsh->getStageObject(m_pid);
Shinya Kitaoka 120a6e
  assert(0);
Shinya Kitaoka 120a6e
  // obj->setIsPinned(m_frame,m_after);
Shinya Kitaoka 120a6e
  m_objectHandle->notifyObjectIdChanged(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// insertFrame
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// sposto avanti di un frame tutti i keyframes >= frame
Toshihiro Shimizu 890ddd
//
Shinya Kitaoka 120a6e
void insertFrame(TDoubleParam *param, int frame) {
Shinya Kitaoka 120a6e
  std::map<int, tdoublekeyframe=""> keyframes;</int,>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (int i = param->getKeyframeCount() - 1; i >= 0; --i) {
Shinya Kitaoka 120a6e
    TDoubleKeyframe k = param->getKeyframe(i);
Shinya Kitaoka 120a6e
    if (k.m_frame < (double)frame) break;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    k.m_frame += 1.0;
Shinya Kitaoka 120a6e
    keyframes.insert(keyframes.begin(), std::make_pair(i, k));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (!keyframes.empty()) param->setKeyframes(keyframes);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void insertFrame(TStageObject *obj, int frame) {
Shinya Kitaoka 120a6e
  // Move standard TStageObject channels
Shinya Kitaoka 120a6e
  for (int channel = 0; channel != TStageObject::T_ChannelCount; ++channel)
Shinya Kitaoka 120a6e
    insertFrame(obj->getParam((TStageObject::Channel)channel), frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (const SkDP &sd = obj->getPlasticSkeletonDeformation()) {
Shinya Kitaoka 120a6e
    // Move Plastic channels
Shinya Kitaoka 120a6e
    insertFrame(sd->skeletonIdsParam().getPointer(), frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    PlasticSkeletonDeformation::vd_iterator vt, vEnd;
Shinya Kitaoka 120a6e
    sd->vertexDeformations(vt, vEnd);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    for (; vt != vEnd; ++vt) {
Shinya Kitaoka 120a6e
      SkVD *vd = (*vt).second;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      for (int p = 0; p != SkVD::PARAMS_COUNT; ++p)
Shinya Kitaoka 120a6e
        insertFrame(vd->m_params[p].getPointer(), frame);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// removeFrame
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// cancello l'eventuale keyframe = frame;
Toshihiro Shimizu 890ddd
// sposto tutti i successivi indietro di un frame
Toshihiro Shimizu 890ddd
//
Shinya Kitaoka 120a6e
void removeFrame(TDoubleParam *param, int frame) {
Shinya Kitaoka 120a6e
  param->deleteKeyframe((double)frame);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::map<int, tdoublekeyframe=""> keyframes;</int,>
Shinya Kitaoka 120a6e
  int i = 0;
Shinya Kitaoka 120a6e
  while (i < param->getKeyframeCount()) {
Shinya Kitaoka 120a6e
    TDoubleKeyframe k = param->getKeyframe(i);
Shinya Kitaoka 120a6e
    if (k.m_frame < frame) {
Shinya Kitaoka 120a6e
      i++;
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    k.m_frame -= 1;
Shinya Kitaoka 120a6e
    keyframes[i] = k;
Shinya Kitaoka 120a6e
    i++;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (!keyframes.empty()) param->setKeyframes(keyframes);
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void removeFrame(TStageObject *obj, int frame) {
Shinya Kitaoka 120a6e
  for (int channel = 0; channel != TStageObject::T_ChannelCount; ++channel)
Shinya Kitaoka 120a6e
    removeFrame(obj->getParam((TStageObject::Channel)channel), frame);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Plastic keys can be removed through xsheet commands - do so
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (const SkDP &sd = obj->getPlasticSkeletonDeformation()) {
Shinya Kitaoka 120a6e
    removeFrame(sd->skeletonIdsParam().getPointer(), frame);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    SkD::vd_iterator vdt, vdEnd;
Shinya Kitaoka 120a6e
    sd->vertexDeformations(vdt, vdEnd);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    for (; vdt != vdEnd; ++vdt) {
Shinya Kitaoka 120a6e
      SkVD *vd = (*vdt).second;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      for (int p = 0; p != SkVD::PARAMS_COUNT; ++p)
Shinya Kitaoka 120a6e
        removeFrame(vd->m_params[p].getPointer(), frame);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}