Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "stageobjectselection.h"
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
#include "tconst.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/schematicnode.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/stageschematicnode.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/stageobjectsdata.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobject.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectcmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/selectioncommandids.h"
Toshihiro Shimizu 890ddd
#include "historytypes.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qset></qset>
Toshihiro Shimizu 890ddd
#include <qapplication></qapplication>
Toshihiro Shimizu 890ddd
#include <qclipboard></qclipboard>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka d1f6c4
class TPasteSelectionUndo final : public TUndo {
Shinya Kitaoka 120a6e
  StageObjectsData *m_objData;
Shinya Kitaoka 120a6e
  int m_index;
Shinya Kitaoka 120a6e
  std::vector<tstageobjectid> m_pastedId;</tstageobjectid>
Shinya Kitaoka 120a6e
  std::list<int> m_pastedSplineIds;</int>
Shinya Kitaoka 120a6e
  QMap<tstageobjectid, *="" qlist<tfxport="">> m_columnFxConnections;</tstageobjectid,>
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Shinya Kitaoka 120a6e
  TObjectHandle *m_objHandle;
Shinya Kitaoka 120a6e
  TFxHandle *m_fxHandle;
Shinya Kitaoka 120a6e
  TPointD m_pastedPos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TPasteSelectionUndo(StageObjectsData *objData, int index,
Shinya Kitaoka 120a6e
                      const std::vector<tstageobjectid> &pastedId,</tstageobjectid>
Shinya Kitaoka 120a6e
                      const std::list<int> pastedSplineIds,</int>
Shinya Kitaoka 120a6e
                      const TPointD &pastedPos, TXsheetHandle *xshHandle,
Shinya Kitaoka 120a6e
                      TObjectHandle *objHandle, TFxHandle *fxHandle)
Shinya Kitaoka 120a6e
      : TUndo()
Shinya Kitaoka 120a6e
      , m_objData(objData)
Shinya Kitaoka 120a6e
      , m_index(index)
Shinya Kitaoka 120a6e
      , m_pastedSplineIds(pastedSplineIds)
Shinya Kitaoka 120a6e
      , m_pastedId(pastedId)
Shinya Kitaoka 120a6e
      , m_xshHandle(xshHandle)
Shinya Kitaoka 120a6e
      , m_objHandle(objHandle)
Shinya Kitaoka 120a6e
      , m_fxHandle(fxHandle)
Shinya Kitaoka 120a6e
      , m_pastedPos(pastedPos) {
Shinya Kitaoka 120a6e
    std::vector<tstageobjectid>::const_iterator it;</tstageobjectid>
Shinya Kitaoka 120a6e
    for (it = m_pastedId.begin(); it != m_pastedId.end(); it++) {
Shinya Kitaoka 120a6e
      if (it->isColumn()) {
Shinya Kitaoka 120a6e
        TXsheet *xsh       = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
        TXshColumnP column = xsh->getColumn(it->getIndex());
Shinya Kitaoka 120a6e
        assert(column);
Shinya Kitaoka 120a6e
        TFx *columnFx = column->getFx();
Shinya Kitaoka 120a6e
        int i;
Shinya Kitaoka 120a6e
        for (i = 0; i < columnFx->getOutputConnectionCount(); i++)
Shinya Kitaoka 120a6e
          m_columnFxConnections[*it].append(columnFx->getOutputConnection(i));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~TPasteSelectionUndo() {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override {
Shinya Kitaoka 120a6e
    m_xshHandle->blockSignals(true);
Shinya Kitaoka 120a6e
    TStageObjectCmd::deleteSelection(
Shinya Kitaoka 120a6e
        m_pastedId, std::list<qpair<tstageobjectid, tstageobjectid="">>(),</qpair<tstageobjectid,>
Shinya Kitaoka 120a6e
        m_pastedSplineIds, m_xshHandle, m_objHandle, m_fxHandle, false);
Shinya Kitaoka 120a6e
    m_xshHandle->blockSignals(false);
Shinya Kitaoka 120a6e
    m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void redo() const override {
Shinya Kitaoka 120a6e
    std::set<int> indexes;</int>
Shinya Kitaoka 120a6e
    indexes.insert(m_index);
Shinya Kitaoka 120a6e
    std::list<int> splineIds;</int>
Shinya Kitaoka 120a6e
    m_objData->restoreObjects(indexes, splineIds, m_xshHandle->getXsheet(), 0,
Shinya Kitaoka 120a6e
                              m_pastedPos);
Shinya Kitaoka 120a6e
    QMap<tstageobjectid, *="" qlist<tfxport="">>::const_iterator it;</tstageobjectid,>
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    for (it = m_columnFxConnections.begin(); it != m_columnFxConnections.end();
Shinya Kitaoka 120a6e
         it++) {
Shinya Kitaoka 120a6e
      TXshColumnP column = xsh->getColumn(it.key().getIndex());
Shinya Kitaoka 120a6e
      assert(column);
Shinya Kitaoka 120a6e
      TFx *columnFx          = column->getFx();
Shinya Kitaoka 120a6e
      QList<tfxport *=""> ports = it.value();</tfxport>
Shinya Kitaoka 120a6e
      int i;
Shinya Kitaoka 120a6e
      for (i = 0; i < ports.size(); i++) ports[i]->setFx(columnFx);
Shinya Kitaoka 120a6e
    }
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(StageObjectsData);
Shinya Kitaoka 38fd86
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    QString str                              = QObject::tr("Paste Object  ");
Shinya Kitaoka 120a6e
    std::vector<tstageobjectid>::iterator it = m_pastedId.begin();</tstageobjectid>
Shinya Kitaoka 120a6e
    for (; it != m_pastedId.end(); it++) {
Shinya Kitaoka 120a6e
      if (it != m_pastedId.begin()) str += QString::fromStdString(", ");
Shinya Kitaoka 120a6e
      str += QString::fromStdString((*it).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
//
Shinya Kitaoka 120a6e
// StageObjectSelection
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//======================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StageObjectSelection::StageObjectSelection()
Shinya Kitaoka 120a6e
    : m_xshHandle(0)
Shinya Kitaoka 120a6e
    , m_objHandle(0)
Shinya Kitaoka 120a6e
    , m_fxHandle(0)
Shinya Kitaoka 120a6e
    , m_pastePosition(TConst::nowhere) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StageObjectSelection::StageObjectSelection(const StageObjectSelection &src)
Shinya Kitaoka 120a6e
    : m_selectedObjects(src.m_selectedObjects)
Shinya Kitaoka 120a6e
    , m_selectedLinks(src.m_selectedLinks)
Shinya Kitaoka 120a6e
    , m_selectedSplines(src.m_selectedSplines)
Shinya Kitaoka 120a6e
    , m_xshHandle(src.m_xshHandle)
Shinya Kitaoka 120a6e
    , m_objHandle(src.m_objHandle)
Shinya Kitaoka 120a6e
    , m_fxHandle(src.m_fxHandle)
Shinya Kitaoka 120a6e
    , m_pastePosition(TConst::nowhere) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
StageObjectSelection::~StageObjectSelection() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::enableCommands() {
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Clear, &StageObjectSelection::deleteSelection);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Group, &StageObjectSelection::groupSelection);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Ungroup, &StageObjectSelection::ungroupSelection);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Collapse, &StageObjectSelection::collapseSelection);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_ExplodeChild, &StageObjectSelection::explodeChild);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Copy, &StageObjectSelection::copySelection);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Paste, &StageObjectSelection::pasteSelection);
Shinya Kitaoka 120a6e
  enableCommand(this, MI_Cut, &StageObjectSelection::cutSelection);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::deleteSelection() {
Shinya Kitaoka 120a6e
  TStageObjectCmd::deleteSelection(
Shinya Kitaoka 120a6e
      m_selectedObjects.toVector().toStdVector(), m_selectedLinks.toStdList(),
Shinya Kitaoka 120a6e
      m_selectedSplines.toStdList(), m_xshHandle, m_objHandle, m_fxHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::select(const TStageObjectId &id) {
Shinya Kitaoka 120a6e
  m_selectedObjects.append(id);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::unselect(const TStageObjectId &id) {
Shinya Kitaoka 120a6e
  int index = m_selectedObjects.indexOf(id);
Shinya Kitaoka 120a6e
  if (index >= 0) m_selectedObjects.removeAt(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::select(int id) { m_selectedSplines.append(id); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::unselect(int id) {
Shinya Kitaoka 120a6e
  int index = m_selectedSplines.indexOf(id);
Shinya Kitaoka 120a6e
  if (index >= 0) m_selectedSplines.removeAt(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::select(SchematicLink *link) {
Shinya Kitaoka 120a6e
  QPair<tstageobjectid, tstageobjectid=""> boundingObjects =</tstageobjectid,>
Shinya Kitaoka 120a6e
      getBoundingObjects(link);
Shinya Kitaoka 120a6e
  m_selectedLinks.append(boundingObjects);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::unselect(SchematicLink *link) {
Shinya Kitaoka 120a6e
  QPair<tstageobjectid, tstageobjectid=""> boundingObjects =</tstageobjectid,>
Shinya Kitaoka 120a6e
      getBoundingObjects(link);
Shinya Kitaoka 120a6e
  int index = m_selectedLinks.indexOf(boundingObjects);
Shinya Kitaoka 120a6e
  if (index >= 0) m_selectedLinks.removeAt(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool StageObjectSelection::isSelected(const TStageObjectId &id) const {
Shinya Kitaoka 120a6e
  return m_selectedObjects.contains(id);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool StageObjectSelection::isSelected(SchematicLink *link) {
Shinya Kitaoka 120a6e
  QPair<tstageobjectid, tstageobjectid=""> boundingObjects =</tstageobjectid,>
Shinya Kitaoka 120a6e
      getBoundingObjects(link);
Shinya Kitaoka 120a6e
  return m_selectedLinks.contains(boundingObjects);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QPair<tstageobjectid, tstageobjectid=""> StageObjectSelection::getBoundingObjects(</tstageobjectid,>
Shinya Kitaoka 120a6e
    SchematicLink *link) {
Shinya Kitaoka 120a6e
  QPair<tstageobjectid, tstageobjectid=""> boundingObjects;</tstageobjectid,>
Shinya Kitaoka 120a6e
  if (link) {
Shinya Kitaoka 120a6e
    SchematicPort *port = link->getStartPort();
Shinya Kitaoka 120a6e
    if (port->getType() == 100 && link->getEndPort()->getType() == 100) {
Shinya Kitaoka 120a6e
      StageSchematicNode *node =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematicnode *="">(port->getNode());</stageschematicnode>
Shinya Kitaoka 120a6e
      if (node)
Shinya Kitaoka 120a6e
        boundingObjects = getBoundingObjects(port, port);
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        boundingObjects =
Shinya Kitaoka 120a6e
            getBoundingObjects(link->getEndPort(), link->getEndPort());
Shinya Kitaoka 120a6e
    } else if (port->getType() == 101)
Shinya Kitaoka 120a6e
      boundingObjects = getBoundingObjects(port, link->getOtherPort(port));
Shinya Kitaoka 120a6e
    else if (port->getType() == 102)
Shinya Kitaoka 120a6e
      boundingObjects = getBoundingObjects(link->getOtherPort(port), port);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return boundingObjects;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QPair<tstageobjectid, tstageobjectid=""> StageObjectSelection::getBoundingObjects(</tstageobjectid,>
Shinya Kitaoka 120a6e
    SchematicPort *inputPort, SchematicPort *outputPort) {
Shinya Kitaoka 120a6e
  QPair<tstageobjectid, tstageobjectid=""> boundingObjects;</tstageobjectid,>
Shinya Kitaoka 120a6e
  StageSchematicNode *inputNode =
Shinya Kitaoka 120a6e
      dynamic_cast<stageschematicnode *="">(inputPort->getNode());</stageschematicnode>
Shinya Kitaoka 120a6e
  StageSchematicNode *outputNode =
Shinya Kitaoka 120a6e
      dynamic_cast<stageschematicnode *="">(outputPort->getNode());</stageschematicnode>
Shinya Kitaoka 120a6e
  if (!inputNode || !outputNode) return boundingObjects;
Shinya Kitaoka 120a6e
  TStageObjectId inputId  = inputNode->getStageObject()->getId();
Shinya Kitaoka 120a6e
  TStageObjectId outputId = outputNode->getStageObject()->getId();
Shinya Kitaoka 120a6e
  boundingObjects.first   = inputId;
Shinya Kitaoka 120a6e
  boundingObjects.second  = outputId;
Shinya Kitaoka 120a6e
  return boundingObjects;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool StageObjectSelection::isConnected() const {
Shinya Kitaoka 120a6e
  int count = 0;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  bool canBeGrouped         = true;
Shinya Kitaoka 120a6e
  for (i = 0; i < m_selectedObjects.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObjectId id = m_selectedObjects[i];
Shinya Kitaoka 120a6e
    TStageObject *obj = pegTree->getStageObject(id, false);
Shinya Kitaoka 120a6e
    if (!m_selectedObjects.contains(obj->getParent())) {
Shinya Kitaoka 120a6e
      count++;
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    TStageObject *parentObj = pegTree->getStageObject(obj->getParent(), false);
Shinya Kitaoka 120a6e
    canBeGrouped            = canBeGrouped &&
Shinya Kitaoka 120a6e
                   obj->getEditingGroupId() == parentObj->getEditingGroupId();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return count == 1 && canBeGrouped;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::groupSelection() {
Shinya Kitaoka 120a6e
  if (m_selectedObjects.size() <= 1 || !isConnected()) return;
Shinya Kitaoka 120a6e
  TStageObjectCmd::group(m_selectedObjects, m_xshHandle);
Shinya Kitaoka 120a6e
  selectNone();
Shinya Kitaoka 120a6e
  m_xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::ungroupSelection() {
Shinya Kitaoka 120a6e
  if (isEmpty()) return;
Shinya Kitaoka 120a6e
  TStageObjectTree *objTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  if (!objTree) return;
Shinya Kitaoka 120a6e
  QSet<int> idSet;</int>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < m_selectedObjects.size(); i++) {
Shinya Kitaoka 120a6e
    int groupId =
Shinya Kitaoka 120a6e
        objTree->getStageObject(m_selectedObjects[i], false)->getGroupId();
Shinya Kitaoka 120a6e
    if (groupId > 0)
Shinya Kitaoka 120a6e
      idSet.insert(
Shinya Kitaoka 120a6e
          objTree->getStageObject(m_selectedObjects[i], false)->getGroupId());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TUndoManager::manager()->beginBlock();
Shinya Kitaoka 120a6e
  QSet<int>::iterator it;</int>
Shinya Kitaoka 120a6e
  for (it = idSet.begin(); it != idSet.end(); it++)
Shinya Kitaoka 120a6e
    TStageObjectCmd::ungroup(*it, m_xshHandle);
Shinya Kitaoka 120a6e
  TUndoManager::manager()->endBlock();
Shinya Kitaoka 120a6e
  selectNone();
Shinya Kitaoka 120a6e
  m_xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::collapseSelection() {
Shinya Kitaoka 120a6e
  if (isEmpty()) return;
Shinya Kitaoka 120a6e
  QList<tstageobjectid> objects = getObjects();</tstageobjectid>
Shinya Kitaoka 120a6e
  if (!objects.isEmpty()) emit doCollapse(objects);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::explodeChild() {
Shinya Kitaoka 120a6e
  if (isEmpty()) return;
Shinya Kitaoka 120a6e
  QList<tstageobjectid> objects = getObjects();</tstageobjectid>
Shinya Kitaoka 120a6e
  if (!objects.isEmpty()) emit doExplodeChild(objects);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::copySelection() {
Shinya Kitaoka 120a6e
  StageObjectsData *data = new StageObjectsData();
Shinya Kitaoka 120a6e
  bool pegSelected       = false;
Shinya Kitaoka 120a6e
  data->storeObjects(
Shinya Kitaoka 120a6e
      m_selectedObjects.toVector().toStdVector(), m_xshHandle->getXsheet(),
Shinya Kitaoka 120a6e
      StageObjectsData::eDoClone | StageObjectsData::eResetFxDagPositions);
Shinya Kitaoka 120a6e
  std::set<int> columnIndexes;</int>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < m_selectedObjects.size(); i++)
Shinya Kitaoka 120a6e
    if (m_selectedObjects[i].isColumn())
Shinya Kitaoka 120a6e
      columnIndexes.insert(m_selectedObjects[i].getIndex());
Shinya Kitaoka 120a6e
  data->storeColumnFxs(
Shinya Kitaoka 120a6e
      columnIndexes, m_xshHandle->getXsheet(),
Shinya Kitaoka 120a6e
      StageObjectsData::eDoClone | StageObjectsData::eResetFxDagPositions);
Shinya Kitaoka 120a6e
  data->storeSplines(
Shinya Kitaoka 120a6e
      m_selectedSplines.toStdList(), m_xshHandle->getXsheet(),
Shinya Kitaoka 120a6e
      StageObjectsData::eDoClone | StageObjectsData::eResetFxDagPositions);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!data->isEmpty())
Shinya Kitaoka 120a6e
    QApplication::clipboard()->setMimeData(data);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    delete data;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::pasteSelection() {
Shinya Kitaoka 120a6e
  int index             = m_xshHandle->getXsheet()->getColumnCount();
Shinya Kitaoka 120a6e
  const QMimeData *data = QApplication::clipboard()->mimeData();
Shinya Kitaoka 120a6e
  const StageObjectsData *objData =
Shinya Kitaoka 120a6e
      dynamic_cast<const *="" stageobjectsdata="">(data);</const>
Shinya Kitaoka 120a6e
  if (!objData) return;
Shinya Kitaoka 120a6e
  std::set<int> indexes;</int>
Shinya Kitaoka 120a6e
  indexes.insert(index);
Shinya Kitaoka 120a6e
  std::list<int> restoredSplineIds;</int>
Shinya Kitaoka 120a6e
  std::vector<tstageobjectid> ids = objData->restoreObjects(</tstageobjectid>
Shinya Kitaoka 120a6e
      indexes, restoredSplineIds, m_xshHandle->getXsheet(),
Shinya Kitaoka 120a6e
      StageObjectsData::eDoClone, m_pastePosition);
Shinya Kitaoka 120a6e
  StageObjectsData *undoData = new StageObjectsData();
Shinya Kitaoka 120a6e
  undoData->storeObjects(ids, m_xshHandle->getXsheet(), 0);
Shinya Kitaoka 120a6e
  undoData->storeColumnFxs(indexes, m_xshHandle->getXsheet(), 0);
Shinya Kitaoka 120a6e
  undoData->storeSplines(restoredSplineIds, m_xshHandle->getXsheet(), 0);
Shinya Kitaoka 120a6e
  TUndoManager::manager()->add(new TPasteSelectionUndo(
Shinya Kitaoka 120a6e
      undoData, index, ids, restoredSplineIds, m_pastePosition, m_xshHandle,
Shinya Kitaoka 120a6e
      m_objHandle, m_fxHandle));
Shinya Kitaoka 120a6e
  m_xshHandle->notifyXsheetChanged();
Shinya Kitaoka 120a6e
  m_pastePosition = TConst::nowhere;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageObjectSelection::cutSelection() {
Shinya Kitaoka 120a6e
  copySelection();
Shinya Kitaoka 120a6e
  deleteSelection();
Toshihiro Shimizu 890ddd
}