Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectcmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tobjecthandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tfxhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectspline.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnfxset.h"
Toshihiro Shimizu 890ddd
#include "toonz/fxdag.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tdoublekeyframe.h"
Toshihiro Shimizu 890ddd
#include "tfx.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "historytypes.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qmap></qmap>
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
bool canRemoveFx(const std::set<tfx *=""> &leaves, TFx *fx) {</tfx>
Shinya Kitaoka 120a6e
  for (int i = 0; i < fx->getInputPortCount(); i++) {
Shinya Kitaoka 120a6e
    TFx *inputFx = fx->getInputPort(i)->getFx();
Shinya Kitaoka 120a6e
    if (!inputFx) continue;
Shinya Kitaoka 120a6e
    if (leaves.count(inputFx) > 0) continue;
Shinya Kitaoka 120a6e
    if (!canRemoveFx(leaves, inputFx)) return false;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return fx->getInputPortCount() > 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// NewCameraUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class NewCameraUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_cameraId, m_oldCurrentId;
Shinya Kitaoka 120a6e
  TStageObject *m_stageObject;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Shinya Kitaoka 120a6e
  TObjectHandle *m_objHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  NewCameraUndo(const TStageObjectId &cameraId, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                TObjectHandle *objHandle)
Shinya Kitaoka 120a6e
      : m_cameraId(cameraId)
Shinya Kitaoka 120a6e
      , m_stageObject(0)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle)
Shinya Kitaoka 120a6e
      , m_objHandle(objHandle) {
Shinya Kitaoka 120a6e
    assert(cameraId.isCamera());
Shinya Kitaoka 120a6e
    TXsheet *xsh  = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    m_stageObject = xsh->getStageObject(m_cameraId);
Shinya Kitaoka 120a6e
    m_stageObject->addRef();
Shinya Kitaoka 120a6e
    m_oldCurrentId = m_objHandle->getObjectId();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  ~NewCameraUndo() { m_stageObject->release(); }
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    if (m_cameraId == m_objHandle->getObjectId())
Shinya Kitaoka 120a6e
      m_objHandle->setObjectId(m_oldCurrentId);
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->removeStageObject(m_cameraId);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->insertStageObject(m_stageObject);
Shinya Kitaoka 120a6e
    m_objHandle->setObjectId(m_cameraId);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof(*this); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("New Camera  %1")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_cameraId.toString()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  // not implemented
Shinya Kitaoka 120a6e
  NewCameraUndo(const NewCameraUndo &);
Shinya Kitaoka 120a6e
  NewCameraUndo &operator=(const NewCameraUndo &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// NewPegbarUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class NewPegbarUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_id, m_oldCurrentId;
Shinya Kitaoka 120a6e
  TStageObject *m_stageObject;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Shinya Kitaoka 120a6e
  TObjectHandle *m_objHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  NewPegbarUndo(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                TObjectHandle *objHandle)
Shinya Kitaoka 120a6e
      : m_id(id)
Shinya Kitaoka 120a6e
      , m_stageObject(0)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle)
Shinya Kitaoka 120a6e
      , m_objHandle(objHandle) {
Shinya Kitaoka 120a6e
    assert(!id.isTable());
Shinya Kitaoka 120a6e
    TXsheet *xsh  = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    m_stageObject = xsh->getStageObject(m_id);
Shinya Kitaoka 120a6e
    m_stageObject->addRef();
Shinya Kitaoka 120a6e
    m_oldCurrentId = m_objHandle->getObjectId();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~NewPegbarUndo() { m_stageObject->release(); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    if (m_id == m_objHandle->getObjectId())
Shinya Kitaoka 120a6e
      m_objHandle->setObjectId(m_oldCurrentId);
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->removeStageObject(m_id);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->insertStageObject(m_stageObject);
Shinya Kitaoka 120a6e
    m_objHandle->setObjectId(m_id);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof(*this); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("New Pegbar  %1")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_id.toString()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  // not implemented
Shinya Kitaoka 120a6e
  NewPegbarUndo(const NewPegbarUndo &);
Shinya Kitaoka 120a6e
  NewPegbarUndo &operator=(const NewPegbarUndo &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// SetActiveCameraUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class SetActiveCameraUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_oldCameraId, m_newCameraId;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SetActiveCameraUndo(const TStageObjectId &oldCameraId,
Shinya Kitaoka 120a6e
                      const TStageObjectId &newCameraId,
Shinya Kitaoka 120a6e
                      TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : m_oldCameraId(oldCameraId)
Shinya Kitaoka 120a6e
      , m_newCameraId(newCameraId)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->setCurrentCameraId(m_oldCameraId);
Shinya Kitaoka 120a6e
    // make the preview camera same as the final camera
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->setCurrentPreviewCameraId(m_oldCameraId);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->setCurrentCameraId(m_newCameraId);
Shinya Kitaoka 120a6e
    // make the preview camera same as the final camera
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->setCurrentPreviewCameraId(m_newCameraId);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof(*this); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("Set Active Camera  %1 > %2")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_oldCameraId.toString()))
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_newCameraId.toString()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// RemoveSplineUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class RemoveSplineUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_id;
Shinya Kitaoka 120a6e
  TStageObjectSpline *m_spline;
Shinya Kitaoka 120a6e
  std::vector<tstageobjectid> m_ids;</tstageobjectid>
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  RemoveSplineUndo(TStageObjectSpline *spline, TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : m_spline(spline), m_xshHandle(xshHandle) {
Shinya Kitaoka 120a6e
    m_spline->addRef();
Shinya Kitaoka 120a6e
    TStageObjectTree *pegbarTree =
Shinya Kitaoka 120a6e
        m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
    for (int i = 0; i < pegbarTree->getStageObjectCount(); i++) {
Shinya Kitaoka 120a6e
      TStageObject *pegbar = pegbarTree->getStageObject(i);
Shinya Kitaoka 120a6e
      if (pegbar->getSpline() == m_spline) m_ids.push_back(pegbar->getId());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  ~RemoveSplineUndo() { m_spline->release(); }
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->insertSpline(m_spline);
Shinya Kitaoka 120a6e
    for (int i = 0; i < (int)m_ids.size(); i++) {
Shinya Kitaoka 120a6e
      TStageObject *pegbar = xsh->getStageObject(m_ids[i]);
Shinya Kitaoka 120a6e
      assert(pegbar);
Shinya Kitaoka 120a6e
      pegbar->setSpline(m_spline);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    for (int i = 0; i < (int)m_ids.size(); i++) {
Shinya Kitaoka 120a6e
      TStageObject *pegbar = xsh->getStageObject(m_ids[i]);
Shinya Kitaoka 120a6e
      assert(pegbar);
Shinya Kitaoka 120a6e
      pegbar->setSpline(0);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->removeSpline(m_spline);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getSize() const override {
Shinya Kitaoka 120a6e
    return sizeof *this + sizeof(TStageObjectSpline) +
Shinya Kitaoka 120a6e
           sizeof(TStageObjectId) * m_ids.size();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("Remove Spline  %1")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_id.toString()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// NewSplineUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class NewSplineUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_id;
Shinya Kitaoka 120a6e
  TStageObjectSpline *m_spline;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  NewSplineUndo(const TStageObjectId &id, TStageObjectSpline *spline,
Shinya Kitaoka 120a6e
                TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : m_id(id), m_spline(spline), m_xshHandle(xshHandle) {
Shinya Kitaoka 120a6e
    m_spline->addRef();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  ~NewSplineUndo() { m_spline->release(); }
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh         = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    TStageObject *pegbar = xsh->getStageObject(m_id);
Shinya Kitaoka 120a6e
    assert(pegbar);
Shinya Kitaoka 120a6e
    pegbar->setSpline(0);
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->removeSpline(m_spline);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->insertSpline(m_spline);
Shinya Kitaoka 120a6e
    TStageObject *pegbar = xsh->getStageObject(m_id);
Shinya Kitaoka 120a6e
    assert(pegbar);
Shinya Kitaoka 120a6e
    pegbar->setSpline(m_spline);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 38fd86
  int getSize() const override {
Shinya Kitaoka 38fd86
    return sizeof *this + sizeof(TStageObjectSpline);
Shinya Kitaoka 38fd86
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("New Motion Path  %1")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_spline->getName()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// SplineLinkUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class SplineLinkUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_id;
Shinya Kitaoka 120a6e
  TStageObjectSpline *m_spline;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SplineLinkUndo(const TStageObjectId &id, TStageObjectSpline *spline,
Shinya Kitaoka 120a6e
                 TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : m_id(id), m_spline(spline), m_xshHandle(xshHandle) {
Shinya Kitaoka 120a6e
    m_spline->addRef();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~SplineLinkUndo() { m_spline->release(); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TStageObject *object = m_xshHandle->getXsheet()->getStageObject(m_id);
Shinya Kitaoka 120a6e
    object->setSpline(0);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TStageObject *object = m_xshHandle->getXsheet()->getStageObject(m_id);
Shinya Kitaoka 120a6e
    object->setSpline(m_spline);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 38fd86
  int getSize() const override {
Shinya Kitaoka 38fd86
    return sizeof *this + sizeof(TStageObjectSpline);
Shinya Kitaoka 38fd86
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("Link Motion Path  %1 > %2")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_spline->getName()))
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_id.toString()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// DeleteSplineLinkUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class RemoveSplineLinkUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_id;
Shinya Kitaoka 120a6e
  TStageObjectSpline *m_spline;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Shinya Kitaoka 120a6e
  TObjectHandle *m_objHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  RemoveSplineLinkUndo(const TStageObjectId &id, TStageObjectSpline *spline,
Shinya Kitaoka 120a6e
                       TXsheetHandle *xshHandle, TObjectHandle *objHandle)
Shinya Kitaoka 120a6e
      : m_id(id)
Shinya Kitaoka 120a6e
      , m_spline(spline)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle)
Shinya Kitaoka 120a6e
      , m_objHandle(objHandle) {
Shinya Kitaoka 120a6e
    m_spline->addRef();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~RemoveSplineLinkUndo() { m_spline->release(); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh              = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    TStageObjectTree *objTree = xsh->getStageObjectTree();
Shinya Kitaoka 120a6e
    TStageObject *object      = objTree->getStageObject(m_id, false);
Shinya Kitaoka 120a6e
    if (!object) return;
Shinya Kitaoka 120a6e
    object->setSpline(m_spline);
Shinya Kitaoka 120a6e
    if (m_objHandle->getObjectId() == m_id) m_objHandle->setIsSpline(true);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh              = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    TStageObjectTree *objTree = xsh->getStageObjectTree();
Shinya Kitaoka 120a6e
    TStageObject *object      = objTree->getStageObject(m_id, false);
Shinya Kitaoka 120a6e
    if (!object) return;
Shinya Kitaoka 120a6e
    object->setSpline(0);
Shinya Kitaoka 120a6e
    if (m_objHandle->getObjectId() == m_id) m_objHandle->setIsSpline(false);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 38fd86
  int getSize() const override {
Shinya Kitaoka 38fd86
    return sizeof *this + sizeof(TStageObjectSpline);
Shinya Kitaoka 38fd86
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// RemovePegbarNodeUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class RemovePegbarNodeUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_objId;
Shinya Kitaoka 120a6e
  TXshColumnP m_column;
Shinya Kitaoka 120a6e
  TStageObjectParams *m_params;
Shinya Kitaoka 120a6e
  QList<tstageobjectid> m_linkedObj;</tstageobjectid>
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  RemovePegbarNodeUndo(TStageObjectId id, TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : TUndo(), m_objId(id), m_xshHandle(xshHandle), m_column(0) {
Shinya Kitaoka 120a6e
    TXsheet *xsh      = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    TStageObject *obj = xsh->getStageObject(id);
Shinya Kitaoka 120a6e
    assert(obj);
shun-iwasawa 4a3868
    m_params = obj->getParams();
Shinya Kitaoka 120a6e
    if (id.isColumn()) m_column = xsh->getColumn(id.getIndex());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~RemovePegbarNodeUndo() { delete m_params; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setLinkedObjects(const QList<tstageobjectid> &linkedObj) {</tstageobjectid>
Shinya Kitaoka 120a6e
    m_linkedObj = linkedObj;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    // reinsert Object
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    if (m_objId.isColumn() && m_column)
Shinya Kitaoka 120a6e
      xsh->insertColumn(m_objId.getIndex(), m_column.getPointer());
Shinya Kitaoka 120a6e
    TStageObject *obj = xsh->getStageObject(m_objId);
Shinya Kitaoka 120a6e
    obj->assignParams(m_params);
Shinya Kitaoka 120a6e
    obj->setParent(m_params->m_parentId);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    int i, linkCount = m_linkedObj.size();
Shinya Kitaoka 120a6e
    for (i = 0; i < linkCount; i++) {
Shinya Kitaoka 120a6e
      TStageObject *linkedObj = xsh->getStageObject(m_linkedObj[i]);
Shinya Kitaoka 120a6e
      assert(linkedObj);
Shinya Kitaoka 120a6e
      linkedObj->setParent(m_objId);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
shun-iwasawa 4a3868
    xsh->notifyStageObjectAdded(m_objId);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh     = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    int pegbarsCount = xsh->getStageObjectTree()->getStageObjectCount();
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < pegbarsCount; ++i) {
Shinya Kitaoka 120a6e
      TStageObject *other = xsh->getStageObjectTree()->getStageObject(i);
Shinya Kitaoka 120a6e
      if (other->getId() == m_objId) continue;
Shinya Kitaoka 120a6e
      if (other->getParent() == m_objId)
Shinya Kitaoka 120a6e
        other->setParent(xsh->getStageObjectParent(m_objId));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (m_objId.isColumn())
Shinya Kitaoka 120a6e
      xsh->removeColumn(m_objId.getIndex());
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      xsh->getStageObjectTree()->removeStageObject(m_objId);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override {
Shinya Kitaoka 120a6e
    return sizeof *this + sizeof(TStageObjectParams) + sizeof(m_xshHandle);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("Remove Object  %1")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_objId.toString()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// RemoveColumnsUndo
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class RemoveColumnsUndo final : public TUndo {
Shinya Kitaoka 120a6e
  std::vector<tfx *=""> m_deletedFx;</tfx>
Shinya Kitaoka 120a6e
  std::vector<tfx *=""> m_terminalFx;</tfx>
Shinya Kitaoka 120a6e
  QMap<tstageobjectid, *="" qlist<tfxport="">> m_columnFxConnections;</tstageobjectid,>
Shinya Kitaoka 120a6e
  QList<tfx *=""> m_notTerminalColumns;</tfx>
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  RemoveColumnsUndo(
Shinya Kitaoka 120a6e
      const std::vector<tfx *=""> &deletedFx, const std::vector<tfx *=""> &terminalFx,</tfx></tfx>
Shinya Kitaoka 120a6e
      const QMap<tstageobjectid, *="" qlist<tfxport="">> columnFxConnections,</tstageobjectid,>
Shinya Kitaoka 120a6e
      const QList<tfx *=""> ¬TerminalColumns, TXsheetHandle *xshHandle)</tfx>
Shinya Kitaoka 120a6e
      : TUndo()
Shinya Kitaoka 120a6e
      , m_deletedFx(deletedFx)
Shinya Kitaoka 120a6e
      , m_terminalFx(terminalFx)
Shinya Kitaoka 120a6e
      , m_columnFxConnections(columnFxConnections)
Shinya Kitaoka 120a6e
      , m_notTerminalColumns(notTerminalColumns)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle) {
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_deletedFx.size(); i++) m_deletedFx[i]->addRef();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~RemoveColumnsUndo() {
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_deletedFx.size(); i++) m_deletedFx[i]->release();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh        = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    TFxSet *terminalFxs = xsh->getFxDag()->getTerminalFxs();
Shinya Kitaoka 120a6e
    TFxSet *internalFxs = xsh->getFxDag()->getInternalFxs();
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_deletedFx.size(); i++)
Shinya Kitaoka 120a6e
      internalFxs->addFx(m_deletedFx[i]);
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_terminalFx.size(); i++)
Shinya Kitaoka 120a6e
      terminalFxs->addFx(m_terminalFx[i]);
Shinya Kitaoka 120a6e
    QMap<tstageobjectid, *="" qlist<tfxport="">>::const_iterator it;</tstageobjectid,>
Shinya Kitaoka 120a6e
    for (it = m_columnFxConnections.begin(); it != m_columnFxConnections.end();
Shinya Kitaoka 120a6e
         it++) {
Shinya Kitaoka 120a6e
      TStageObjectId id      = it.key();
Shinya Kitaoka 120a6e
      QList<tfxport *=""> ports = it.value();</tfxport>
Shinya Kitaoka 120a6e
      TXshColumnP column     = xsh->getColumn(id.getIndex());
Shinya Kitaoka 120a6e
      assert(column);
Shinya Kitaoka 120a6e
      int j;
Shinya Kitaoka 120a6e
      for (j = 0; j < ports.size(); j++) ports[j]->setFx(column->getFx());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    for (i = 0; i < m_notTerminalColumns.size(); i++)
Shinya Kitaoka 120a6e
      terminalFxs->removeFx(m_notTerminalColumns[i]);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
shun-iwasawa 4a3868
    xsh->notifyFxAdded(m_deletedFx);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TXsheet *xsh        = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    TFxSet *terminalFxs = xsh->getFxDag()->getTerminalFxs();
Shinya Kitaoka 120a6e
    TFxSet *internalFxs = xsh->getFxDag()->getInternalFxs();
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_deletedFx.size(); i++)
Shinya Kitaoka 120a6e
      internalFxs->removeFx(m_deletedFx[i]);
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_terminalFx.size(); i++)
Shinya Kitaoka 120a6e
      terminalFxs->removeFx(m_terminalFx[i]);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override {
Shinya Kitaoka 120a6e
    return sizeof *this + m_deletedFx.size() * sizeof(TFx) +
Shinya Kitaoka 120a6e
           m_terminalFx.size() * sizeof(TFx) +
Shinya Kitaoka 120a6e
           m_columnFxConnections.size() *
Shinya Kitaoka 120a6e
               (sizeof(TStageObjectId) + 10 * sizeof(TFxPort)) +
Shinya Kitaoka 120a6e
           m_notTerminalColumns.size() * sizeof(TFx) + sizeof(TXsheetHandle);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    QString str = QObject::tr("Remove Column  ");
Shinya Kitaoka 120a6e
    QMap<tstageobjectid, *="" qlist<tfxport="">>::const_iterator it;</tstageobjectid,>
Shinya Kitaoka 120a6e
    for (it = m_columnFxConnections.begin(); it != m_columnFxConnections.end();
Shinya Kitaoka 120a6e
         it++) {
Shinya Kitaoka 120a6e
      TStageObjectId id = it.key();
Shinya Kitaoka 120a6e
      if (it != m_columnFxConnections.begin())
Shinya Kitaoka 120a6e
        str += QString::fromStdString(", ");
Shinya Kitaoka 120a6e
      str += QString::fromStdString(id.toString());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    return str;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Schematic; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// UndoGroup
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class UndoGroup final : public TUndo {
Shinya Kitaoka 120a6e
  QList<tstageobjectid> m_ids;</tstageobjectid>
Shinya Kitaoka 120a6e
  int m_groupId;
Shinya Kitaoka 120a6e
  QList<int> m_positions;</int>
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoGroup(const QList<tstageobjectid> &ids, int groupId,</tstageobjectid>
Shinya Kitaoka 120a6e
            const QList<int> &positions, TXsheetHandle *xshHandle)</int>
Shinya Kitaoka 120a6e
      : m_ids(ids)
Shinya Kitaoka 120a6e
      , m_groupId(groupId)
Shinya Kitaoka 120a6e
      , m_positions(positions)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~UndoGroup() {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    assert(m_ids.size() == m_positions.size());
Shinya Kitaoka 120a6e
    TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_ids.size(); i++) {
Shinya Kitaoka 120a6e
      TStageObject *obj = pegTree->getStageObject(m_ids[i], false);
Shinya Kitaoka 120a6e
      if (obj) {
Shinya Kitaoka 120a6e
        obj->removeGroupName(m_positions[i]);
Shinya Kitaoka 120a6e
        obj->removeGroupId(m_positions[i]);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    assert(m_ids.size() == m_positions.size());
Shinya Kitaoka 120a6e
    TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_ids.size(); i++) {
Shinya Kitaoka 120a6e
      TStageObject *obj = pegTree->getStageObject(m_ids[i], false);
Shinya Kitaoka 120a6e
      if (obj) {
Shinya Kitaoka 120a6e
        obj->setGroupId(m_groupId, m_positions[i]);
Shinya Kitaoka 120a6e
        obj->setGroupName(L"Group " + std::to_wstring(m_groupId),
Shinya Kitaoka 120a6e
                          m_positions[i]);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof *this; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// UndoUngroup
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class UndoUngroup final : public TUndo {
Shinya Kitaoka 120a6e
  QList<tstageobjectid> m_objsId;</tstageobjectid>
Shinya Kitaoka 120a6e
  QList<int> m_positions;</int>
Shinya Kitaoka 120a6e
  int m_groupId;
Shinya Kitaoka 120a6e
  std::wstring m_groupName;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoUngroup(const QList<tstageobject *=""> &objs, TXsheetHandle *xshHandle)</tstageobject>
Shinya Kitaoka 120a6e
      : m_xshHandle(xshHandle) {
Shinya Kitaoka 120a6e
    assert(objs.size() > 0);
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < objs.size(); i++) {
Shinya Kitaoka 120a6e
      m_objsId.append(objs[i]->getId());
Shinya Kitaoka 120a6e
      if (i == 0) {
Shinya Kitaoka 120a6e
        m_groupId   = objs[i]->getGroupId();
Shinya Kitaoka 120a6e
        m_groupName = objs[i]->getGroupName(false);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~UndoUngroup() {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setStackPositions(const QList<int> &positions) {</int>
Shinya Kitaoka 120a6e
    m_positions = positions;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    assert(m_objsId.size() == m_positions.size());
Shinya Kitaoka 120a6e
    TStageObjectTree *objTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
    if (!objTree) return;
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_objsId.size(); i++) {
Shinya Kitaoka 120a6e
      TStageObject *obj = objTree->getStageObject(m_objsId[i], false);
Shinya Kitaoka 120a6e
      if (!obj) continue;
Shinya Kitaoka 120a6e
      obj->setGroupId(m_groupId, m_positions[i]);
Shinya Kitaoka 120a6e
      obj->setGroupName(m_groupName, m_positions[i]);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    assert(m_objsId.size() == m_positions.size());
Shinya Kitaoka 120a6e
    TStageObjectTree *objTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
    if (!objTree) return;
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_objsId.size(); i++) {
Shinya Kitaoka 120a6e
      TStageObject *obj = objTree->getStageObject(m_objsId[i], false);
Shinya Kitaoka 120a6e
      if (!obj) continue;
Shinya Kitaoka 120a6e
      obj->removeGroupName(m_positions[i]);
Shinya Kitaoka 120a6e
      obj->removeGroupId(m_positions[i]);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof *this; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// UndoRenameGroup
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class UndoRenameGroup final : public TUndo {
Shinya Kitaoka 120a6e
  QList<tstageobject *=""> m_objs;</tstageobject>
Shinya Kitaoka 120a6e
  QList<int> m_positions;</int>
Shinya Kitaoka 120a6e
  std::wstring m_oldGroupName;
Shinya Kitaoka 120a6e
  std::wstring m_newGroupName;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoRenameGroup(const QList<tstageobject *=""> &objs,</tstageobject>
Shinya Kitaoka 120a6e
                  const QList<int> &positions, const std::wstring &newName,</int>
Shinya Kitaoka 120a6e
                  const std::wstring &oldName, TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : m_objs(objs)
Shinya Kitaoka 120a6e
      , m_newGroupName(newName)
Shinya Kitaoka 120a6e
      , m_oldGroupName(oldName)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle)
Shinya Kitaoka 120a6e
      , m_positions(positions) {
Shinya Kitaoka 120a6e
    assert(objs.size() > 0);
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_objs.size(); i++) m_objs[i]->addRef();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~UndoRenameGroup() {
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_objs.size(); i++) m_objs[i]->release();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    assert(m_objs.size() == m_positions.size());
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_objs.size(); i++) {
Shinya Kitaoka 120a6e
      m_objs[i]->removeGroupName(m_positions[i]);
Shinya Kitaoka 120a6e
      m_objs[i]->setGroupName(m_oldGroupName, m_positions[i]);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    assert(m_objs.size() == m_positions.size());
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_objs.size(); i++) {
Shinya Kitaoka 120a6e
      m_objs[i]->removeGroupName(m_positions[i]);
Shinya Kitaoka 120a6e
      m_objs[i]->setGroupName(m_newGroupName, m_positions[i]);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof *this; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// UndoStatusChange
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class UndoStatusChange final : public TUndo {
Shinya Kitaoka 120a6e
  TStageObject *m_obj;
Shinya Kitaoka 120a6e
  TStageObject::Status m_oldStatus, m_newStatus;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoStatusChange(TStageObject *obj, TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : m_obj(obj), m_xshHandle(xshHandle) {
Shinya Kitaoka 120a6e
    m_obj->addRef();
Shinya Kitaoka 120a6e
    // devo fare addref della spline altimenti crasha in uscita
Shinya Kitaoka 120a6e
    // m_obj non fa addref della spline a lui associata, e quindi crasha perche'
Shinya Kitaoka 120a6e
    // la spline viene distrutta
Shinya Kitaoka 120a6e
    // prima di m_obj... sarebbe piu' corretto fare addref della spline quando
Shinya Kitaoka 120a6e
    // viene settata all'oggetto
Shinya Kitaoka 120a6e
    // piuttosto che farla qui?
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline = m_obj->getSpline();
Shinya Kitaoka 120a6e
    if (spline) spline->addRef();
Shinya Kitaoka 120a6e
    m_oldStatus = m_obj->getStatus();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~UndoStatusChange() {
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline = m_obj->getSpline();
Shinya Kitaoka 120a6e
    m_obj->release();
Shinya Kitaoka 120a6e
    if (spline) spline->release();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void onAdd() override { m_newStatus = m_obj->getStatus(); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    m_obj->setStatus(m_oldStatus);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    m_obj->setStatus(m_newStatus);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof *this; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// removePegbarNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void removeStageObjectNode(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                           TObjectHandle *objHandle, TFxHandle *fxHandle,
Shinya Kitaoka 120a6e
                           bool doUndo = true) {
Shinya Kitaoka 120a6e
  TXsheet *xsh         = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObject *pegbar = xsh->getStageObject(id);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Lacamera corrente e il tavolo non si devono rimuovere
Shinya Kitaoka 120a6e
  if (id.isTable() ||
Shinya Kitaoka 120a6e
      (id.isCamera() && xsh->getStageObjectTree()->getCurrentCameraId() == id))
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
John Dancel c323ac
  if (id.isCamera() && xsh->getCameraColumnIndex() == id.getIndex())
manongjohn 12d839
    xsh->setCameraColumnIndex(
manongjohn 12d839
        xsh->getStageObjectTree()->getCurrentCameraId().getIndex());
John Dancel c323ac
Shinya Kitaoka 120a6e
  // stacco tutti i figli e li attacco al padre
Shinya Kitaoka 120a6e
  QList<tstageobjectid> linkedObjects;</tstageobjectid>
Shinya Kitaoka 120a6e
  int pegbarsCount = xsh->getStageObjectTree()->getStageObjectCount();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < pegbarsCount; ++i) {
Shinya Kitaoka 120a6e
    TStageObject *other = xsh->getStageObjectTree()->getStageObject(i);
Shinya Kitaoka 120a6e
    if (other == pegbar) continue;
Shinya Kitaoka 120a6e
    if (other->getParent() == id) {
Shinya Kitaoka 120a6e
      other->setParent(pegbar->getParent());
Shinya Kitaoka 120a6e
      linkedObjects.push_back(other->getId());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (id == objHandle->getObjectId())
Shinya Kitaoka 120a6e
    objHandle->setObjectId(TStageObjectId::TableId);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  RemovePegbarNodeUndo *undo = new RemovePegbarNodeUndo(id, xshHandle);
Shinya Kitaoka 120a6e
  undo->setLinkedObjects(linkedObjects);
Shinya Kitaoka 120a6e
  if (id.isColumn())
Shinya Kitaoka 120a6e
    xsh->removeColumn(id.getIndex());
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    xsh->getStageObjectTree()->removeStageObject(id);
Shinya Kitaoka 120a6e
  if (doUndo)
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(undo);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    delete undo;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
luz paz f61672
// removeColumns
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
luz paz f61672
void removeColumns(const QVector<int> &columnIndexes, TXsheetHandle *xshHandle,</int>
Shinya Kitaoka 120a6e
                  TObjectHandle *objHandle, TFxHandle *fxHandle,
Shinya Kitaoka 120a6e
                  bool doUndo = true) {
Shinya Kitaoka 120a6e
  TXsheet *xsh = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  QMap<tstageobjectid, *="" qlist<tfxport="">> columnFxConnection;</tstageobjectid,>
Shinya Kitaoka 120a6e
  std::set<tfx *=""> leafesFx;</tfx>
Shinya Kitaoka 120a6e
  QList<tfx *=""> notTerminalColumns;</tfx>
Shinya Kitaoka 120a6e
  for (i = columnIndexes.size() - 1; i >= 0; i--) {
Shinya Kitaoka 120a6e
    TStageObjectId id  = TStageObjectId::ColumnId(columnIndexes[i]);
Shinya Kitaoka 120a6e
    TXshColumnP column = xsh->getColumn(id.getIndex());
Shinya Kitaoka 120a6e
    if (!column) continue;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TFx *columnFx = column->getFx();
Shinya Kitaoka 120a6e
    if (!columnFx) continue;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    int j;
Shinya Kitaoka 120a6e
    for (j = 0; j < columnFx->getOutputConnectionCount(); j++)
Shinya Kitaoka 120a6e
      columnFxConnection[id].append(columnFx->getOutputConnection(j));
Shinya Kitaoka 120a6e
    leafesFx.insert(columnFx);
Shinya Kitaoka 120a6e
    if (!xsh->getFxDag()->getTerminalFxs()->containsFx(columnFx))
Shinya Kitaoka 120a6e
      notTerminalColumns.append(columnFx);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::vector<tfx *=""> fxsToKill;</tfx>
Shinya Kitaoka 120a6e
  std::vector<tfx *=""> terminalFxsToKill;</tfx>
Shinya Kitaoka 120a6e
  TFxSet *fxSet = xsh->getFxDag()->getInternalFxs();
Shinya Kitaoka 120a6e
  for (i = 0; i < fxSet->getFxCount(); i++) {
Shinya Kitaoka 120a6e
    TFx *fx = fxSet->getFx(i);
Shinya Kitaoka 120a6e
    if (canRemoveFx(leafesFx, fx)) {
Shinya Kitaoka 120a6e
      fxsToKill.push_back(fx);
Shinya Kitaoka 120a6e
      if (xsh->getFxDag()->getTerminalFxs()->containsFx(fx))
Shinya Kitaoka 120a6e
        terminalFxsToKill.push_back(fx);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (doUndo) {
Shinya Kitaoka 120a6e
    RemoveColumnsUndo *undo =
Shinya Kitaoka 120a6e
        new RemoveColumnsUndo(fxsToKill, terminalFxsToKill, columnFxConnection,
Shinya Kitaoka 120a6e
                              notTerminalColumns, xshHandle);
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(undo);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (i = 0; i < (int)fxsToKill.size(); i++) {
Shinya Kitaoka 120a6e
    TFx *fx = fxsToKill[i];
Shinya Kitaoka 120a6e
    if (fx == fxHandle->getFx()) fxHandle->setFx(0);
Shinya Kitaoka 120a6e
    if (fx->getLinkedFx() != fx) fx->unlinkParams();
Shinya Kitaoka 120a6e
    int j, outputPortCount = fx->getOutputConnectionCount();
Shinya Kitaoka 120a6e
    for (j = outputPortCount - 1; j >= 0; j--) {
Shinya Kitaoka 120a6e
      TFxPort *port = fx->getOutputConnection(j);
Shinya Kitaoka 120a6e
      std::vector<tfx *="">::iterator it =</tfx>
Shinya Kitaoka 120a6e
          std::find(fxsToKill.begin(), fxsToKill.end(), port->getOwnerFx());
Shinya Kitaoka 120a6e
      std::set<tfx *="">::iterator it2 =</tfx>
Shinya Kitaoka 120a6e
          std::find(leafesFx.begin(), leafesFx.end(), port->getFx());
Shinya Kitaoka 120a6e
      if (it == fxsToKill.end() && it2 == leafesFx.end()) port->setFx(0);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    fxSet->removeFx(fx);
Shinya Kitaoka 120a6e
    xsh->getFxDag()->getTerminalFxs()->removeFx(fx);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (i = columnIndexes.size() - 1; i >= 0; i--)
Shinya Kitaoka 120a6e
    removeStageObjectNode(TStageObjectId::ColumnId(columnIndexes[i]), xshHandle,
Shinya Kitaoka 120a6e
                          objHandle, fxHandle, doUndo);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// removeSpline
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void removeSpline(TStageObjectSpline *spline, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                  TObjectHandle *objHandle, bool doUndo = true) {
Shinya Kitaoka 120a6e
  if (doUndo)
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(new RemoveSplineUndo(spline, xshHandle));
Shinya Kitaoka 120a6e
  TStageObjectTree *pegbarTree = xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  for (int i = 0; i < pegbarTree->getStageObjectCount(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = pegbarTree->getStageObject(i);
Shinya Kitaoka 120a6e
    if (pegbar->getSpline() == spline) {
Shinya Kitaoka 120a6e
      pegbar->setSpline(0);
Shinya Kitaoka 120a6e
      if (pegbar->getId() == objHandle->getObjectId())
Shinya Kitaoka 120a6e
        objHandle->setIsSpline(false);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  pegbarTree->removeSpline(spline);
Shinya Kitaoka 120a6e
  // xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void removeLink(const QPair<tstageobjectid, tstageobjectid=""> &link,</tstageobjectid,>
Shinya Kitaoka 120a6e
                TXsheetHandle *xshHandle, TObjectHandle *objHandle,
Shinya Kitaoka 120a6e
                bool doUndo = true) {
Shinya Kitaoka 120a6e
  TStageObjectTree *objTree = xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  if (link.first ==
Shinya Kitaoka 120a6e
      link.second) {  // is a link connecting a spline with an object
Shinya Kitaoka 120a6e
    TStageObject *object = objTree->getStageObject(link.first, false);
Shinya Kitaoka 120a6e
    if (!object) return;
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline = object->getSpline();
Shinya Kitaoka 120a6e
    assert(spline);
Shinya Kitaoka 120a6e
    object->setSpline(0);
Shinya Kitaoka 120a6e
    if (objHandle->getObjectId() == link.first) objHandle->setIsSpline(false);
Shinya Kitaoka 120a6e
    if (doUndo) {
Shinya Kitaoka 120a6e
      TUndo *undo =
Shinya Kitaoka 120a6e
          new RemoveSplineLinkUndo(link.first, spline, xshHandle, objHandle);
Shinya Kitaoka 120a6e
      TUndoManager::manager()->add(undo);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    TStageObject *object       = objTree->getStageObject(link.first, false);
Shinya Kitaoka 120a6e
    TStageObject *parentObject = objTree->getStageObject(link.second, false);
Shinya Kitaoka 120a6e
    if (!object || !parentObject || object->isGrouped() ||
Shinya Kitaoka 120a6e
        parentObject->isGrouped())
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
    assert(object->getParent() == parentObject->getId());
Shinya Kitaoka 120a6e
    TStageObjectCmd::setParent(object->getId(), TStageObjectId::NoneId, "",
Shinya Kitaoka 120a6e
                               xshHandle, doUndo);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// SetAttributeUndo & sons
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Shinya Kitaoka 120a6e
class SetAttributeUndo : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectId m_id;
Shinya Kitaoka 120a6e
  T m_oldValue, m_newValue;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SetAttributeUndo(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                   T oldValue, T newValue)
Shinya Kitaoka 120a6e
      : m_id(id)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle)
Shinya Kitaoka 120a6e
      , m_oldValue(oldValue)
Shinya Kitaoka 120a6e
      , m_newValue(newValue) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObjectId getId() const { return m_id; }
Shinya Kitaoka 120a6e
  TStageObject *getStageObject() const {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = m_xshHandle->getXsheet()->getStageObject(m_id);
Shinya Kitaoka 120a6e
    assert(pegbar);
Shinya Kitaoka 120a6e
    return pegbar;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  virtual void setAttribute(TStageObject *pegbar, T value) const = 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setAttribute(T value) const {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = getStageObject();
Shinya Kitaoka 120a6e
    if (pegbar) setAttribute(pegbar, value);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    setAttribute(m_oldValue);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    setAttribute(m_newValue);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getSize() const override { return sizeof(*this); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::Unidentified; }
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QString("%1 %2 : %3 -> %4")
Shinya Kitaoka 120a6e
        .arg(getActionName())
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(getId().toString()))
Shinya Kitaoka 120a6e
        .arg(getStringFromValue(m_oldValue))
Shinya Kitaoka 120a6e
        .arg(getStringFromValue(m_newValue));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  virtual QString getActionName() { return QString(); }
Shinya Kitaoka 120a6e
  virtual QString getStringFromValue(T value) { return QString(); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class StageObjectRenameUndo final : public SetAttributeUndo<std::string> {</std::string>
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  StageObjectRenameUndo(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                        std::string oldName, std::string newName)
Shinya Kitaoka 120a6e
      : SetAttributeUndo<std::string>(id, xshHandle, oldName, newName) {}</std::string>
Shinya Kitaoka 473e70
  void setAttribute(TStageObject *pegbar, std::string name) const override {
Shinya Kitaoka 120a6e
    pegbar->setName(name);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  QString getActionName() override { return QString("Rename Object"); }
Shinya Kitaoka 473e70
  QString getStringFromValue(std::string value) override {
Shinya Kitaoka 120a6e
    return QString::fromStdString(value);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class ResetOffsetUndo final : public SetAttributeUndo<tpointd> {</tpointd>
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  ResetOffsetUndo(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                  const TPointD &oldOffset)
Shinya Kitaoka 120a6e
      : SetAttributeUndo<tpointd>(id, xshHandle, oldOffset, TPointD()) {}</tpointd>
Shinya Kitaoka 473e70
  void setAttribute(TStageObject *pegbar, TPointD offset) const override {
Shinya Kitaoka 120a6e
    pegbar->setOffset(offset);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  QString getActionName() override { return QString("Reset Center"); }
Shinya Kitaoka 473e70
  QString getStringFromValue(TPointD value) override {
Shinya Kitaoka 120a6e
    return QString("(%1,%2)")
Shinya Kitaoka 120a6e
        .arg(QString::number(value.x))
Shinya Kitaoka 120a6e
        .arg(QString::number(value.y));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class ResetCenterAndOffsetUndo final : public SetAttributeUndo<tpointd> {</tpointd>
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  ResetCenterAndOffsetUndo(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                           const TPointD &oldOffset)
Shinya Kitaoka 120a6e
      : SetAttributeUndo<tpointd>(id, xshHandle, oldOffset, TPointD()) {}</tpointd>
Shinya Kitaoka 473e70
  void setAttribute(TStageObject *pegbar, TPointD offset) const override {
Shinya Kitaoka 120a6e
    pegbar->setCenterAndOffset(offset, offset);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  QString getActionName() override { return QString("Reset Center"); }
Shinya Kitaoka 473e70
  QString getStringFromValue(TPointD value) override {
Shinya Kitaoka 120a6e
    return QString("(%1,%2)")
Shinya Kitaoka 120a6e
        .arg(QString::number(value.x))
Shinya Kitaoka 120a6e
        .arg(QString::number(value.y));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class SetHandleUndo final : public SetAttributeUndo<std::string> {</std::string>
Shinya Kitaoka 120a6e
  TPointD m_center, m_offset;
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SetHandleUndo(const TStageObjectId &id, std::string oldHandle,
Shinya Kitaoka 120a6e
                std::string newHandle, TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : SetAttributeUndo<std::string>(id, xshHandle, oldHandle, newHandle)</std::string>
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = getStageObject();
Shinya Kitaoka 120a6e
    if (pegbar) pegbar->getCenterAndOffset(m_center, m_offset);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void setAttribute(TStageObject *pegbar, std::string handle) const override {
Shinya Kitaoka 120a6e
    pegbar->setHandle(handle);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    SetAttributeUndo<std::string>::undo();</std::string>
Shinya Kitaoka 120a6e
    TStageObject *pegbar = getStageObject();
Shinya Kitaoka 120a6e
    if (pegbar) pegbar->setCenterAndOffset(m_center, m_offset);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  QString getActionName() override { return QString("Set Handle"); }
Shinya Kitaoka 473e70
  QString getStringFromValue(std::string value) override {
Shinya Kitaoka 120a6e
    return QString::fromStdString(value);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class SetParentHandleUndo final : public SetAttributeUndo<std::string> {</std::string>
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SetParentHandleUndo(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                      std::string oldHandle, std::string newHandle)
Shinya Kitaoka 120a6e
      : SetAttributeUndo<std::string>(id, xshHandle, oldHandle, newHandle) {}</std::string>
Shinya Kitaoka 473e70
  void setAttribute(TStageObject *pegbar, std::string handle) const override {
Shinya Kitaoka 120a6e
    pegbar->setParentHandle(handle);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  QString getActionName() override { return QString("Set Parent Handle"); }
Shinya Kitaoka 473e70
  QString getStringFromValue(std::string value) override {
Shinya Kitaoka 120a6e
    return QString::fromStdString(value);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
typedef std::pair<tstageobjectid, std::string=""> ParentIdAndHandle;</tstageobjectid,>
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class SetParentUndo final : public SetAttributeUndo<parentidandhandle> {</parentidandhandle>
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SetParentUndo(const TStageObjectId &id, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                TStageObjectId oldParentId, std::string oldParentHandle,
Shinya Kitaoka 120a6e
                TStageObjectId newParentId, std::string newParentHandle)
Shinya Kitaoka 120a6e
      : SetAttributeUndo<parentidandhandle>(</parentidandhandle>
Shinya Kitaoka 120a6e
            id, xshHandle, ParentIdAndHandle(oldParentId, oldParentHandle),
Shinya Kitaoka 120a6e
            ParentIdAndHandle(newParentId, newParentHandle)) {}
Shinya Kitaoka 38fd86
  void setAttribute(TStageObject *pegbar,
Shinya Kitaoka 38fd86
                    ParentIdAndHandle parent) const override {
Shinya Kitaoka 120a6e
    pegbar->setParent(parent.first);
Shinya Kitaoka 120a6e
    pegbar->setParentHandle(parent.second);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  QString getActionName() override { return QString("Set Parent Handle"); }
Shinya Kitaoka 473e70
  QString getStringFromValue(ParentIdAndHandle value) override {
Shinya Kitaoka 120a6e
    return QString("(%1,%2)")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(value.first.toString()))
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(value.second));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class ResetPositionUndo final : public TUndo {
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Shinya Kitaoka 120a6e
  TStageObjectId m_id;
Shinya Kitaoka 120a6e
  TPointD m_center, m_offset;
Shinya Kitaoka 120a6e
  std::vector<tdoublekeyframe> m_xKeyframes, m_yKeyframes;</tdoublekeyframe>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void saveKeyframes(std::vector<tdoublekeyframe> &keyframes,</tdoublekeyframe>
Shinya Kitaoka 120a6e
                     const TDoubleParam *param) {
Shinya Kitaoka 120a6e
    int n = param->getKeyframeCount();
Shinya Kitaoka 120a6e
    if (n == 0)
Shinya Kitaoka 120a6e
      keyframes.clear();
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      keyframes.resize(n);
Shinya Kitaoka 120a6e
      for (int i = 0; i < n; i++) keyframes[i] = param->getKeyframe(i);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void deleteAllKeyframes(TDoubleParam *param) const {
Shinya Kitaoka 120a6e
    while (param->getKeyframeCount() > 0)
Shinya Kitaoka 120a6e
      param->deleteKeyframe(param->keyframeIndexToFrame(0));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  void restoreKeyframes(TDoubleParam *param,
Shinya Kitaoka 120a6e
                        const std::vector<tdoublekeyframe> &keyframes) const {</tdoublekeyframe>
Shinya Kitaoka 120a6e
    deleteAllKeyframes(param);
Shinya Kitaoka 120a6e
    for (int i = 0; i < (int)keyframes.size(); i++)
Shinya Kitaoka 120a6e
      param->setKeyframe(keyframes[i]);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObject *getStageObject() const {
Shinya Kitaoka 120a6e
    return m_xshHandle->getXsheet()->getStageObject(m_id);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  ResetPositionUndo(const TStageObjectId &id, TXsheetHandle *xshHandle)
Shinya Kitaoka 120a6e
      : m_xshHandle(xshHandle), m_id(id) {
Shinya Kitaoka 120a6e
    TStageObject *stageObject = getStageObject();
Shinya Kitaoka 120a6e
    if (stageObject) {
Shinya Kitaoka 120a6e
      stageObject->getCenterAndOffset(m_center, m_offset);
Shinya Kitaoka 120a6e
      saveKeyframes(m_xKeyframes, stageObject->getParam(TStageObject::T_X));
Shinya Kitaoka 120a6e
      saveKeyframes(m_yKeyframes, stageObject->getParam(TStageObject::T_Y));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    TStageObject *stageObject = getStageObject();
Shinya Kitaoka 120a6e
    if (!stageObject) return;
Shinya Kitaoka 120a6e
    stageObject->setCenterAndOffset(m_center, m_offset);
Shinya Kitaoka 120a6e
    restoreKeyframes(stageObject->getParam(TStageObject::T_X), m_xKeyframes);
Shinya Kitaoka 120a6e
    restoreKeyframes(stageObject->getParam(TStageObject::T_Y), m_yKeyframes);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    TStageObject *stageObject = getStageObject();
Shinya Kitaoka 120a6e
    if (!stageObject) return;
Shinya Kitaoka 120a6e
    stageObject->setCenterAndOffset(TPointD(0, 0), TPointD(0, 0));
Shinya Kitaoka 120a6e
    deleteAllKeyframes(stageObject->getParam(TStageObject::T_X));
Shinya Kitaoka 120a6e
    deleteAllKeyframes(stageObject->getParam(TStageObject::T_Y));
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getSize() const override {
shun-iwasawa 4a3868
    return sizeof(*this) + sizeof(TDoubleKeyframe) *
shun-iwasawa 4a3868
                               (m_xKeyframes.size() + m_yKeyframes.size());
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// pegbar rename
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::rename(const TStageObjectId &id, std::string name,
Shinya Kitaoka 120a6e
                             TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TStageObject *pegbar = xshHandle->getXsheet()->getStageObject(id);
Shinya Kitaoka 120a6e
  if (!pegbar) return;
Shinya Kitaoka 120a6e
  std::string oldName = pegbar->getName();
Shinya Kitaoka 120a6e
  if (oldName == name) return;
Shinya Kitaoka 120a6e
  pegbar->setName(name);
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new StageObjectRenameUndo(id, xshHandle, oldName, name));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// resetOffset
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::resetOffset(const TStageObjectId &id,
Shinya Kitaoka 120a6e
                                  TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TStageObject *peg = xshHandle->getXsheet()->getStageObject(id);
Shinya Kitaoka 120a6e
  if (!peg) return;
Shinya Kitaoka 120a6e
  TPointD oldOffset = peg->getOffset();
Shinya Kitaoka 120a6e
  peg->setOffset(TPointD());
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(new ResetOffsetUndo(id, xshHandle, oldOffset));
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  // TNotifier::instance()->notify(TStageChange());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// resetCenterAndOffset
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::resetCenterAndOffset(const TStageObjectId &id,
Shinya Kitaoka 120a6e
                                           TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TStageObject *peg = xshHandle->getXsheet()->getStageObject(id);
Shinya Kitaoka 120a6e
  if (!peg) return;
Shinya Kitaoka 120a6e
  TPointD oldOffset = peg->getOffset();
Shinya Kitaoka 120a6e
  peg->setCenterAndOffset(TPointD(), TPointD());
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new ResetCenterAndOffsetUndo(id, xshHandle, oldOffset));
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// resetPosition
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::resetPosition(const TStageObjectId &id,
Shinya Kitaoka 120a6e
                                    TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TStageObject *obj = xshHandle->getXsheet()->getStageObject(id);
Shinya Kitaoka 120a6e
  if (!obj) return;
Shinya Kitaoka 120a6e
  TUndo *undo = new ResetPositionUndo(id, xshHandle);
Shinya Kitaoka 120a6e
  undo->redo();
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(undo);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// setHandle
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::setHandle(const TStageObjectId &id, std::string handle,
Shinya Kitaoka 120a6e
                                TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TStageObject *peg = xshHandle->getXsheet()->getStageObject(id);
Shinya Kitaoka 120a6e
  if (!peg) return;
Shinya Kitaoka 120a6e
  std::string oldHandle = peg->getHandle();
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new SetHandleUndo(id, oldHandle, handle, xshHandle));
Shinya Kitaoka 120a6e
  peg->setHandle(handle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// setParentHandle
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::setParentHandle(const std::vector<tstageobjectid> &ids,</tstageobjectid>
Shinya Kitaoka 120a6e
                                      std::string handle,
Shinya Kitaoka 120a6e
                                      TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  for (int i = 0; i < (int)ids.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObjectId id = ids[i];
Shinya Kitaoka 120a6e
    TStageObject *peg = xshHandle->getXsheet()->getStageObject(id);
Shinya Kitaoka 120a6e
    if (!peg) continue;
Shinya Kitaoka 120a6e
    std::string oldHandle = peg->getParentHandle();
Shinya Kitaoka 120a6e
    peg->setParentHandle(handle);
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
        new SetParentHandleUndo(id, xshHandle, oldHandle, handle));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// setParent
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::setParent(const TStageObjectId &id,
Shinya Kitaoka 120a6e
                                TStageObjectId parentId,
Shinya Kitaoka 120a6e
                                std::string parentHandle,
Shinya Kitaoka 120a6e
                                TXsheetHandle *xshHandle, bool doUndo) {
Shinya Kitaoka 120a6e
  if (parentId == TStageObjectId::NoneId) {
Shinya Kitaoka 120a6e
    if (id.isColumn() || id.isPegbar()) {
Shinya Kitaoka 120a6e
      parentId     = TStageObjectId::TableId;
Shinya Kitaoka 120a6e
      parentHandle = "B";
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObject *stageObject = xshHandle->getXsheet()->getStageObject(id);
Shinya Kitaoka 120a6e
  if (!stageObject) return;
Shinya Kitaoka 120a6e
  TStageObjectId oldParentId = stageObject->getParent();
Shinya Kitaoka 120a6e
  std::string oldParentHandle;
Shinya Kitaoka 120a6e
  if (oldParentId != TStageObjectId::NoneId)
Shinya Kitaoka 120a6e
    oldParentHandle = stageObject->getParentHandle();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  stageObject->setParent(parentId);
Shinya Kitaoka 120a6e
  stageObject->setParentHandle(parentHandle);
Shinya Kitaoka 120a6e
  if (doUndo) {
Shinya Kitaoka 120a6e
    TUndoManager *undoManager = TUndoManager::manager();
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(new SetParentUndo(
Shinya Kitaoka 120a6e
        id, xshHandle, oldParentId, oldParentHandle, parentId, parentHandle));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// setSplineParent
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStageObjectCmd::setSplineParent(TStageObjectSpline *spline,
Shinya Kitaoka 120a6e
                                      TStageObject *parentObj,
Shinya Kitaoka 120a6e
                                      TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new SplineLinkUndo(parentObj->getId(), spline, xshHandle));
Shinya Kitaoka 120a6e
  parentObj->setSpline(spline);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// addNewCamera
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::addNewCamera(TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                                   TObjectHandle *objHandle,
Shinya Kitaoka 120a6e
                                   QPointF initialPos) {
Shinya Kitaoka 120a6e
  TXsheet *xsh           = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
  int cameraIndex        = 0;
Shinya Kitaoka 120a6e
  TStageObjectTree *tree = xsh->getStageObjectTree();
Shinya Kitaoka 120a6e
  TStageObjectId cameraId;
Shinya Kitaoka 120a6e
  for (;;) {
Shinya Kitaoka 120a6e
    cameraId = TStageObjectId::CameraId(cameraIndex);
Shinya Kitaoka 120a6e
    if (tree->getStageObject(cameraId, false) != 0) {
Shinya Kitaoka 120a6e
      cameraIndex++;
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // crea la nuova camera
Shinya Kitaoka 120a6e
  TStageObject *newCameraPegbar = xsh->getStageObject(cameraId);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // make the new peg at the cursor position
Shinya Kitaoka 120a6e
  if (!initialPos.isNull())
Shinya Kitaoka 120a6e
    newCameraPegbar->setDagNodePos(TPointD(initialPos.x(), initialPos.y()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // settings uguali a quelli della camera corrente
Shinya Kitaoka 120a6e
  TCamera *currentCamera        = tree->getCurrentCamera();
Shinya Kitaoka 120a6e
  *newCameraPegbar->getCamera() = *currentCamera;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new NewCameraUndo(cameraId, xshHandle, objHandle));
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// addNewPegbar
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::addNewPegbar(TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                                   TObjectHandle *objHandle,
Shinya Kitaoka 120a6e
                                   QPointF initialPos) {
Shinya Kitaoka 120a6e
  TXsheet *xsh = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
  // crea la nuova pegbar
Shinya Kitaoka 120a6e
  TStageObjectTree *pTree = xsh->getStageObjectTree();
Shinya Kitaoka 120a6e
  int pegbarIndex         = 0;
Shinya Kitaoka 120a6e
  while (pTree->getStageObject(TStageObjectId::PegbarId(pegbarIndex), false))
Shinya Kitaoka 120a6e
    pegbarIndex++;
Shinya Kitaoka 120a6e
  TStageObjectId id = TStageObjectId::PegbarId(pegbarIndex);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObject *obj = pTree->getStageObject(id, true);
Shinya Kitaoka 120a6e
  if (!initialPos.isNull())
Shinya Kitaoka 120a6e
    obj->setDagNodePos(TPointD(initialPos.x(), initialPos.y()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(new NewPegbarUndo(id, xshHandle, objHandle));
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// setAsActiveCamera
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::setAsActiveCamera(TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                                        TObjectHandle *objHandle) {
Shinya Kitaoka 120a6e
  TXsheet *xsh                   = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObjectId currentPegbarId = objHandle->getObjectId();
Shinya Kitaoka 120a6e
  assert(currentPegbarId.isCamera());
Shinya Kitaoka 120a6e
  TStageObjectId newCameraId = currentPegbarId;
Shinya Kitaoka 120a6e
  TStageObjectId oldCameraId = xsh->getStageObjectTree()->getCurrentCameraId();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  xsh->getStageObjectTree()->setCurrentCameraId(newCameraId);
Shinya Kitaoka 120a6e
  // make the preview camera same as the final render camera
Shinya Kitaoka 120a6e
  xsh->getStageObjectTree()->setCurrentPreviewCameraId(newCameraId);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new SetActiveCameraUndo(oldCameraId, newCameraId, xshHandle));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// addNewSpline
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::addNewSpline(TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                                   TObjectHandle *objHandle,
Shinya Kitaoka 120a6e
                                   TColumnHandle *colHandle,
Shinya Kitaoka 120a6e
                                   QPointF initialPos) {
Shinya Kitaoka 120a6e
  TXsheet *xsh               = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObjectSpline *spline = xsh->getStageObjectTree()->createSpline();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!initialPos.isNull())
Shinya Kitaoka 120a6e
    spline->setDagNodePos(TPointD(initialPos.x(), initialPos.y()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObjectId objId = objHandle->getObjectId();
Shinya Kitaoka 120a6e
  if (objId == TStageObjectId::NoneId) {
shun-iwasawa 4a3868
    int col = colHandle->getColumnIndex();
Shinya Kitaoka 120a6e
    if (col >= 0) objId = TStageObjectId::ColumnId(col);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (objId != TStageObjectId::NoneId) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = xsh->getStageObject(objId);
Shinya Kitaoka 120a6e
    assert(pegbar);
Shinya Kitaoka 120a6e
    pegbar->setSpline(spline);
Shinya Kitaoka 120a6e
    TUndoManager::manager()->add(new NewSplineUndo(objId, spline, xshHandle));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// deleteSelection
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::deleteSelection(
Shinya Kitaoka 120a6e
    const std::vector<tstageobjectid> &objIds,</tstageobjectid>
Shinya Kitaoka 120a6e
    const std::list<qpair<tstageobjectid, tstageobjectid="">> &links,</qpair<tstageobjectid,>
Shinya Kitaoka 120a6e
    const std::list<int> &splineIds, TXsheetHandle *xshHandle,</int>
Shinya Kitaoka 120a6e
    TObjectHandle *objHandle, TFxHandle *fxHandle, bool doUndo) {
Shinya Kitaoka 120a6e
  if (doUndo) TUndoManager::manager()->beginBlock();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QVector<int> columnIndexes;</int>
Shinya Kitaoka 120a6e
  QVector<int> pegbarIndexes;</int>
Shinya Kitaoka 120a6e
  QVector<int> cameraIndexes;</int>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::vector<tstageobjectid>::const_iterator it2;</tstageobjectid>
Shinya Kitaoka 120a6e
  for (it2 = objIds.begin(); it2 != objIds.end(); it2++) {
Shinya Kitaoka 120a6e
    if (it2->isColumn()) columnIndexes.append(it2->getIndex());
Shinya Kitaoka 120a6e
    if (it2->isPegbar()) pegbarIndexes.append(it2->getIndex());
Shinya Kitaoka 120a6e
    if (it2->isCamera()) cameraIndexes.append(it2->getIndex());
Shinya Kitaoka 120a6e
  }
Tact Yoshida b8554a
  if (!columnIndexes.isEmpty()) {
Tact Yoshida b8554a
    std::sort(columnIndexes.begin(), columnIndexes.end());
Tact Yoshida b8554a
  }
Tact Yoshida b8554a
  if (!pegbarIndexes.isEmpty()) {
Tact Yoshida b8554a
    std::sort(pegbarIndexes.begin(), pegbarIndexes.end());
Tact Yoshida b8554a
  }
Tact Yoshida b8554a
  if (!cameraIndexes.isEmpty()) {
Tact Yoshida b8554a
    std::sort(cameraIndexes.begin(), cameraIndexes.end());
Tact Yoshida b8554a
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // remove all selected objects
luz paz f61672
  removeColumns(columnIndexes, xshHandle, objHandle, fxHandle, doUndo);
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = pegbarIndexes.size() - 1; i >= 0; i--)
Shinya Kitaoka 120a6e
    removeStageObjectNode(TStageObjectId::PegbarId(pegbarIndexes[i]), xshHandle,
Shinya Kitaoka 120a6e
                          objHandle, fxHandle, doUndo);
Shinya Kitaoka 120a6e
  for (i = cameraIndexes.size() - 1; i >= 0; i--)
Shinya Kitaoka 120a6e
    removeStageObjectNode(TStageObjectId::CameraId(cameraIndexes[i]), xshHandle,
Shinya Kitaoka 120a6e
                          objHandle, fxHandle, doUndo);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::list<qpair<tstageobjectid, tstageobjectid="">>::const_iterator it1;</qpair<tstageobjectid,>
Shinya Kitaoka 120a6e
  for (it1 = links.begin(); it1 != links.end() && objIds.empty(); it1++)
Shinya Kitaoka 120a6e
    removeLink(*it1, xshHandle, objHandle, doUndo);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::list<int>::const_iterator it3;</int>
Shinya Kitaoka 120a6e
  TStageObjectTree *objTree = xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  for (it3 = splineIds.begin(); it3 != splineIds.end(); it3++) {
Shinya Kitaoka 120a6e
    int splineCount = objTree->getSplineCount();
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < splineCount; i++) {
Shinya Kitaoka 120a6e
      TStageObjectSpline *spline = objTree->getSpline(i);
Shinya Kitaoka 120a6e
      if (spline->getId() == *it3) {
Shinya Kitaoka 120a6e
        removeSpline(spline, xshHandle, objHandle, doUndo);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (doUndo) TUndoManager::manager()->endBlock();
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// group
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::group(const QList<tstageobjectid> ids,</tstageobjectid>
Shinya Kitaoka 120a6e
                            TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  int groupId               = pegTree->getNewGroupId();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  QList<int> positions;</int>
Shinya Kitaoka 120a6e
  for (i = 0; i < ids.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *obj = pegTree->getStageObject(ids[i], false);
Shinya Kitaoka 120a6e
    if (obj) {
Shinya Kitaoka 120a6e
      int position = obj->setGroupId(groupId);
Shinya Kitaoka 120a6e
      obj->setGroupName(L"Group " + std::to_wstring(groupId));
Shinya Kitaoka 120a6e
      positions.append(position);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new UndoGroup(ids, groupId, positions, xshHandle));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// ungroup
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::ungroup(int groupId, TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TStageObjectTree *objTree = xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  if (!objTree) return;
Shinya Kitaoka 120a6e
  QList<tstageobject *=""> objs;</tstageobject>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < objTree->getStageObjectCount(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *obj = objTree->getStageObject(i);
Shinya Kitaoka 120a6e
    if (!obj) continue;
Shinya Kitaoka 120a6e
    if (obj->getGroupId() == groupId) objs.push_back(obj);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QList<int> positions;</int>
Shinya Kitaoka 120a6e
  UndoUngroup *undo = new UndoUngroup(objs, xshHandle);
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(undo);
Shinya Kitaoka 120a6e
  for (i = 0; i < objs.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *obj = objs[i];
Shinya Kitaoka 120a6e
    if (obj) {
Shinya Kitaoka 120a6e
      obj->removeGroupName();
Shinya Kitaoka 120a6e
      int position = obj->removeGroupId();
Shinya Kitaoka 120a6e
      positions.append(position);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  undo->setStackPositions(positions);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// renameGroup
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::renameGroup(const QList<tstageobject *=""> objs,</tstageobject>
Shinya Kitaoka 120a6e
                                  const std::wstring &name, bool fromEditor,
Shinya Kitaoka 120a6e
                                  TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  std::wstring oldName;
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  QList<int> positions;</int>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < objs.size(); i++) {
Shinya Kitaoka 120a6e
    if (i == 0) oldName = objs[i]->getGroupName(fromEditor);
shun-iwasawa 4a3868
    int position = objs[i]->removeGroupName(fromEditor);
Shinya Kitaoka 120a6e
    objs[i]->setGroupName(name, position);
Shinya Kitaoka 120a6e
    positions.push_back(position);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(
Shinya Kitaoka 120a6e
      new UndoRenameGroup(objs, positions, name, oldName, xshHandle));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// renameGroup
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::duplicateObject(const QList<tstageobjectid> ids,</tstageobjectid>
Shinya Kitaoka 120a6e
                                      TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  TXsheet *xsh              = xshHandle->getXsheet();
Shinya Kitaoka 120a6e
  TStageObjectTree *objTree = xsh->getStageObjectTree();
Shinya Kitaoka 120a6e
  int i, objCount = ids.size();
Shinya Kitaoka 120a6e
  for (i = 0; i < objCount; i++) {
Shinya Kitaoka 120a6e
    TStageObjectId id = ids[i];
Shinya Kitaoka 120a6e
    TStageObject *obj = objTree->getStageObject(id, false);
Shinya Kitaoka 120a6e
    assert(obj);
Shinya Kitaoka 120a6e
    TStageObject *duplicatedObj = 0;
Shinya Kitaoka 120a6e
    if (id.isPegbar() || id.isCamera()) {
Shinya Kitaoka 120a6e
      int index = 0;
Shinya Kitaoka 120a6e
      TStageObjectId newId;
Shinya Kitaoka 120a6e
      for (;;) {
Shinya Kitaoka 120a6e
        newId = id.isPegbar() ? TStageObjectId::PegbarId(index)
Shinya Kitaoka 120a6e
                              : TStageObjectId::CameraId(index);
Shinya Kitaoka 120a6e
        if (objTree->getStageObject(newId, false)) {
Shinya Kitaoka 120a6e
          index++;
Shinya Kitaoka 120a6e
          continue;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      duplicatedObj              = xsh->getStageObject(newId);
Shinya Kitaoka 120a6e
      TStageObjectParams *params = obj->getParams();
Shinya Kitaoka 120a6e
      duplicatedObj->assignParams(params);
Shinya Kitaoka 120a6e
      delete params;
Shinya Kitaoka 120a6e
      if (id.isCamera()) *(duplicatedObj->getCamera()) = *(obj->getCamera());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::enableSplineAim(TStageObject *obj, int state,
Shinya Kitaoka 120a6e
                                      TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  UndoStatusChange *undo = new UndoStatusChange(obj, xshHandle);
Shinya Kitaoka 120a6e
  obj->enableAim(state != 2);
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(undo);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TStageObjectCmd::enableSplineUppk(TStageObject *obj, bool toggled,
Shinya Kitaoka 120a6e
                                       TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  UndoStatusChange *undo = new UndoStatusChange(obj, xshHandle);
Shinya Kitaoka 120a6e
  obj->enableUppk(toggled);
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(undo);
Toshihiro Shimizu 890ddd
}