Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/stageschematicscene.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/stageschematicnode.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvdialog.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/schematicgroupeditor.h"
Toshihiro Shimizu 890ddd
#include "stageobjectselection.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/icongenerator.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.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/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcolumn.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectspline.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectcmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/tproject.h"
manongjohn d6e3cc
#include "toonz/childstack.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tconst.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tstream.h"
Toshihiro Shimizu 890ddd
#include "tstroke.h"
shun_iwasawa 22eaa4
#include "tenv.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qmenu></qmenu>
Toshihiro Shimizu 890ddd
#include <qgraphicsscenecontextmenuevent></qgraphicsscenecontextmenuevent>
Toshihiro Shimizu 890ddd
#include <qgraphicsscenemouseevent></qgraphicsscenemouseevent>
Toshihiro Shimizu 890ddd
#include <qfiledialog></qfiledialog>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TEnv::IntVar ShowLetterOnOutputPortOfStageNode(
Shinya Kitaoka 120a6e
    "ShowLetterOnOutputPortOfStageNode", 0);
shun_iwasawa 22eaa4
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! Define the method to sort a TreeStageNode container.
Toshihiro Shimizu 890ddd
//! The sorting follows these rules:
Toshihiro Shimizu 890ddd
//! \li TableNode < CameraNode < PegbarNode < ColumnNode
Toshihiro Shimizu 890ddd
//! \li if two nodes are of the same type, they are odered using indexes
Shinya Kitaoka 120a6e
class CompareNodes {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  bool operator()(TreeStageNode *node1, TreeStageNode *node2) {
Shinya Kitaoka 120a6e
    TStageObjectId id1 = node1->getNode()->getStageObject()->getId();
Shinya Kitaoka 120a6e
    TStageObjectId id2 = node2->getNode()->getStageObject()->getId();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (id1.isTable() ||
Shinya Kitaoka 120a6e
        (id1.isCamera() && !id2.isTable() && !id2.isCamera()) ||
Shinya Kitaoka 120a6e
        (id1.isPegbar() && !id2.isTable() && !id2.isCamera() &&
Shinya Kitaoka 120a6e
         !id2.isPegbar()))
Shinya Kitaoka 120a6e
      return true;
Shinya Kitaoka 120a6e
    if ((id1.isCamera() && id2.isCamera()) ||
Shinya Kitaoka 120a6e
        (id1.isTable() && id2.isTable()) ||
Shinya Kitaoka 120a6e
        (id1.isPegbar() && id2.isPegbar()) ||
Shinya Kitaoka 120a6e
        (id1.isColumn() && id2.isColumn()))
Shinya Kitaoka 120a6e
      return id1.getIndex() < id2.getIndex();
Shinya Kitaoka 120a6e
    return false;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TStageObject *getRoot(const QList<tstageobject *=""> &objs,</tstageobject>
Shinya Kitaoka 120a6e
                      TStageObjectTree *pegTree) {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < objs.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *parent = pegTree->getStageObject(objs[i]->getParent(), false);
Shinya Kitaoka 120a6e
    if (objs.contains(parent))
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      return objs[i];
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void keepSubgroup(QMap<int, *="" qlist<schematicnode="">> &editedGroup) {</int,>
Shinya Kitaoka 120a6e
  QMap<int, *="" qlist<schematicnode="">>::iterator it;</int,>
Shinya Kitaoka 120a6e
  for (it = editedGroup.begin(); it != editedGroup.end(); it++) {
Shinya Kitaoka 120a6e
    QList<schematicnode *=""> groupedNodes = it.value();</schematicnode>
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < groupedNodes.size(); i++) {
Shinya Kitaoka 120a6e
      StageSchematicNode *node =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematicnode *="">(groupedNodes[i]);</stageschematicnode>
Shinya Kitaoka 120a6e
      if (!node) continue;
Shinya Kitaoka 120a6e
      TStageObject *obj = node->getStageObject();
Shinya Kitaoka 120a6e
      assert(obj);
Shinya Kitaoka 120a6e
      QMap<int, *="" qlist<schematicnode="">>::iterator it2;</int,>
Shinya Kitaoka 120a6e
      for (it2 = editedGroup.begin(); it2 != editedGroup.end(); it2++) {
Shinya Kitaoka 120a6e
        if (obj->isContainedInGroup(it2.key()) &&
Shinya Kitaoka 120a6e
            !editedGroup[it2.key()].contains(node))
Shinya Kitaoka 120a6e
          editedGroup[it2.key()].append(node);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
manongjohn adae7d
bool resizingNodes = false;
manongjohn adae7d
bool updatingScene = false;
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// TreeStageNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void TreeStageNode::sortChildren(int startIndex, int lastIndex) {
Shinya Kitaoka 120a6e
  if (startIndex == lastIndex) return;
Shinya Kitaoka 120a6e
  std::vector<treestagenode *="">::iterator begin, end;</treestagenode>
Shinya Kitaoka 120a6e
  begin = m_cildren.begin() + startIndex;
Shinya Kitaoka 120a6e
  end   = m_cildren.begin() + lastIndex;
Shinya Kitaoka 120a6e
  std::sort(begin, end, CompareNodes());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// StageSchematicScene
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
StageSchematicScene::StageSchematicScene(QWidget *parent)
Shinya Kitaoka 120a6e
    : SchematicScene(parent)
Shinya Kitaoka 120a6e
    , m_nextNodePos(0, 0)
Shinya Kitaoka 120a6e
    , m_xshHandle(0)
Shinya Kitaoka 120a6e
    , m_objHandle(0)
Shinya Kitaoka 120a6e
    , m_colHandle(0)
Shinya Kitaoka 120a6e
    , m_sceneHandle(0)
Shinya Kitaoka 120a6e
    , m_frameHandle(0)
Shinya Kitaoka 120a6e
    , m_gridDimension(eSmall)
manongjohn d6e3cc
    , m_showLetterOnPortFlag(ShowLetterOnOutputPortOfStageNode != 0)
manongjohn d6e3cc
    , m_viewer() {
manongjohn d6e3cc
  m_viewer = (SchematicViewer *)parent;
manongjohn d6e3cc
Shinya Kitaoka 120a6e
  QPointF sceneCenter = sceneRect().center();
Shinya Kitaoka 120a6e
  m_firstPos          = TPointD(sceneCenter.x(), sceneCenter.y());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_selection = new StageObjectSelection();
Shinya Kitaoka 120a6e
  connect(m_selection, SIGNAL(doCollapse(QList<tstageobjectid>)), this,</tstageobjectid>
Shinya Kitaoka 120a6e
          SLOT(onCollapse(QList<tstageobjectid>)));</tstageobjectid>
Shinya Kitaoka 120a6e
  connect(m_selection, SIGNAL(doExplodeChild(QList<tstageobjectid>)), this,</tstageobjectid>
Shinya Kitaoka 120a6e
          SIGNAL(doExplodeChild(QList<tstageobjectid>)));</tstageobjectid>
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
Shinya Kitaoka 120a6e
  m_highlightedLinks.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
StageSchematicScene::~StageSchematicScene() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::setXsheetHandle(TXsheetHandle *xshHandle) {
Shinya Kitaoka 120a6e
  m_xshHandle = xshHandle;
Shinya Kitaoka 120a6e
  m_selection->setXsheetHandle(xshHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::setObjectHandle(TObjectHandle *objHandle) {
Shinya Kitaoka 120a6e
  m_objHandle = objHandle;
Shinya Kitaoka 120a6e
  m_selection->setObjectHandle(objHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::setColumnHandle(TColumnHandle *colHandle) {
Shinya Kitaoka 120a6e
  m_colHandle = colHandle;
Shinya Kitaoka 120a6e
  m_selection->setColumnHandle(colHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::setFxHandle(TFxHandle *fxHandle) {
Shinya Kitaoka 120a6e
  m_selection->setFxHandle(fxHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onSelectionSwitched(TSelection *oldSel,
Shinya Kitaoka 120a6e
                                              TSelection *newSel) {
Shinya Kitaoka 120a6e
  if (m_selection == oldSel && m_selection != newSel) clearSelection();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::updateScene() {
manongjohn adae7d
  if (updatingScene) return;
manongjohn adae7d
  updatingScene = true;
Shinya Kitaoka 120a6e
  clearAllItems();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QPointF firstPos = sceneRect().center();
Shinya Kitaoka 120a6e
  m_nextNodePos    = TPointD(firstPos.x(), firstPos.y());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_nodeTable.clear();
Shinya Kitaoka 120a6e
  m_GroupTable.clear();
Shinya Kitaoka 120a6e
  m_groupEditorTable.clear();
Shinya Kitaoka 120a6e
  m_gridDimension = pegTree->getDagGridDimension();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMap<int, *="" qlist<tstageobject="">> groupedObj;</int,>
Shinya Kitaoka 120a6e
  QMap<int, *="" qlist<schematicnode="">> editedGroup;</int,>
Shinya Kitaoka 120a6e
  // in order to draw the position-specified nodes first
Shinya Kitaoka 120a6e
  QList<int> modifiedNodeIds;</int>
Shinya Kitaoka 120a6e
  for (int i = 0; i < pegTree->getStageObjectCount(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = pegTree->getStageObject(i);
Shinya Kitaoka 120a6e
    if (pegbar->getDagNodePos() == TConst::nowhere)
Shinya Kitaoka 120a6e
      modifiedNodeIds.push_back(i);
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      modifiedNodeIds.push_front(i);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (int i = 0; i < modifiedNodeIds.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = pegTree->getStageObject(modifiedNodeIds.at(i));
Shinya Kitaoka 120a6e
    if (pegbar->isGrouped() && !pegbar->isGroupEditing()) {
Shinya Kitaoka 120a6e
      groupedObj[pegbar->getGroupId()].push_back(pegbar);
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    StageSchematicNode *node = addStageSchematicNode(pegbar);
Shinya Kitaoka 120a6e
    if (node != 0) {
Shinya Kitaoka 120a6e
      m_nodeTable[pegbar->getId()] = node;
Shinya Kitaoka 120a6e
      if (pegbar->isGrouped())
Shinya Kitaoka 120a6e
        editedGroup[pegbar->getEditingGroupId()].append(node);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Motion Path
Shinya Kitaoka 120a6e
  m_splineTable.clear();
Shinya Kitaoka 120a6e
  for (int i = 0; i < pegTree->getSplineCount(); i++) {
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline     = pegTree->getSpline(i);
Shinya Kitaoka 120a6e
    StageSchematicSplineNode *node = addSchematicSplineNode(spline);
Shinya Kitaoka 120a6e
    if (node != 0) {
Shinya Kitaoka 120a6e
      m_splineTable[spline] = node;
Shinya Kitaoka 120a6e
      connect(node, SIGNAL(currentObjectChanged(const TStageObjectId &, bool)),
Shinya Kitaoka 120a6e
              this, SLOT(onCurrentObjectChanged(const TStageObjectId &, bool)));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMap<int, *="" qlist<tstageobject="">>::iterator it;</int,>
Shinya Kitaoka 120a6e
  for (it = groupedObj.begin(); it != groupedObj.end(); it++) {
Shinya Kitaoka 120a6e
    StageSchematicGroupNode *node = addStageGroupNode(it.value());
Shinya Kitaoka 120a6e
    m_GroupTable[it.key()]        = node;
Shinya Kitaoka 120a6e
    int editingGroupId            = node->getStageObject()->getEditingGroupId();
Shinya Kitaoka 120a6e
    if (editingGroupId != -1) editedGroup[editingGroupId].append(node);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  keepSubgroup(editedGroup);
Shinya Kitaoka 120a6e
  updateEditedGroups(editedGroup);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // update stage links
Shinya Kitaoka 120a6e
  for (int i = 0; i < pegTree->getStageObjectCount(); i++)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    TStageObject *pegbar    = pegTree->getStageObject(i);
Shinya Kitaoka 120a6e
    TStageObjectId parentId = pegbar->getParent();
Shinya Kitaoka 120a6e
    // update link; find StageSchematicNode representing pegbar
Shinya Kitaoka 120a6e
    QMap<tstageobjectid, *="" stageschematicnode="">::iterator it;</tstageobjectid,>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (!pegbar->isGrouped() || pegbar->isGroupEditing()) {
Shinya Kitaoka 120a6e
      it = m_nodeTable.find(pegbar->getId());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      //! note: not every stage object is represented in the scene (e.g. empty
Shinya Kitaoka 120a6e
      //! columns are not)
Shinya Kitaoka 120a6e
      if (it == m_nodeTable.end()) continue;
Shinya Kitaoka 120a6e
      StageSchematicNode *node = it.value();
Shinya Kitaoka 120a6e
      // get pegbar parent
Shinya Kitaoka 120a6e
      if (parentId != TStageObjectId::NoneId) {
Shinya Kitaoka 120a6e
        // find StageSchematicNode representing parentId
Shinya Kitaoka 120a6e
        it = m_nodeTable.find(parentId);
Shinya Kitaoka 120a6e
        if (it != m_nodeTable.end())  // at least we avoid crash
Shinya Kitaoka 120a6e
        {
Shinya Kitaoka 120a6e
          StageSchematicNode *parentNode = it.value();
Shinya Kitaoka 120a6e
          if (parentNode) {
Shinya Kitaoka 120a6e
            StageSchematicNodePort *port1 = parentNode->makeChildPort(
Shinya Kitaoka 120a6e
                QString::fromStdString(pegbar->getParentHandle()));
Shinya Kitaoka 120a6e
            StageSchematicNodePort *port2 = node->makeParentPort(
Shinya Kitaoka 120a6e
                QString::fromStdString(pegbar->getHandle()));
Shinya Kitaoka 120a6e
            port2->makeLink(port1);
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
        TStageObject *parent = pegTree->getStageObject(parentId, false);
Shinya Kitaoka 120a6e
        if (parent && parent->isGrouped()) {
Shinya Kitaoka 120a6e
          int groupId = parent->getGroupId();
Shinya Kitaoka 120a6e
          if (m_GroupTable.contains(groupId)) {
Shinya Kitaoka 120a6e
            StageSchematicGroupNode *groupeNode = m_GroupTable[groupId];
Shinya Kitaoka 120a6e
            StageSchematicNodePort *port1       = groupeNode->getChildPort(0);
Shinya Kitaoka 120a6e
            StageSchematicNodePort *port2       = node->makeParentPort(
Shinya Kitaoka 120a6e
                QString::fromStdString(pegbar->getHandle()));
Shinya Kitaoka 120a6e
            port2->makeLink(port1);
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // link to motion path
Shinya Kitaoka 120a6e
      TStageObjectSpline *spline = pegbar->getSpline();
Shinya Kitaoka 120a6e
      if (spline) {
Shinya Kitaoka 120a6e
        QMap<tstageobjectspline *="" *,="" stageschematicsplinenode="">::iterator</tstageobjectspline>
Shinya Kitaoka 120a6e
            splineIt;
Shinya Kitaoka 120a6e
        splineIt = m_splineTable.find(spline);
Shinya Kitaoka 120a6e
        if (splineIt != m_splineTable.end()) {
Shinya Kitaoka 120a6e
          SchematicPort *port1 = splineIt.value()->getPort(-1);
Shinya Kitaoka 120a6e
          SchematicPort *port2 = node->getPort(-1);
Shinya Kitaoka 120a6e
          port2->makeLink(port1);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      int groupId                         = pegbar->getGroupId();
Shinya Kitaoka 120a6e
      StageSchematicGroupNode *groupeNode = m_GroupTable[groupId];
Shinya Kitaoka 120a6e
      TStageObject *parent = pegTree->getStageObject(parentId, false);
Shinya Kitaoka 120a6e
      if (parent && (!parent->isGrouped() || parent->isGroupEditing())) {
Shinya Kitaoka 120a6e
        it = m_nodeTable.find(parentId);
Shinya Kitaoka 120a6e
        if (it == m_nodeTable.end()) continue;
Shinya Kitaoka 120a6e
        StageSchematicNode *parentNode = it.value();
Shinya Kitaoka 120a6e
        if (parentNode) {
Shinya Kitaoka 120a6e
          StageSchematicNodePort *port1 = parentNode->makeChildPort(
Shinya Kitaoka 120a6e
              QString::fromStdString(pegbar->getParentHandle()));
Shinya Kitaoka 120a6e
          StageSchematicNodePort *port2 = groupeNode->getParentPort();
Shinya Kitaoka 120a6e
          port2->makeLink(port1);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      if (parent && parent->isGrouped()) {
Shinya Kitaoka 120a6e
        int parentGroupId = parent->getGroupId();
Shinya Kitaoka 120a6e
        if (m_GroupTable.contains(parentGroupId)) {
Shinya Kitaoka 120a6e
          StageSchematicGroupNode *groupeParentNode =
Shinya Kitaoka 120a6e
              m_GroupTable[parentGroupId];
Shinya Kitaoka 120a6e
          StageSchematicNodePort *port1 = groupeParentNode->getChildPort(0);
Shinya Kitaoka 120a6e
          StageSchematicNodePort *port2 = groupeNode->getParentPort();
Shinya Kitaoka 120a6e
          if (!port1->isLinkedTo(port2) && groupeParentNode != groupeNode)
Shinya Kitaoka 120a6e
            port2->makeLink(port1);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      TStageObjectSpline *spline = pegbar->getSpline();
Shinya Kitaoka 120a6e
      if (spline) {
Shinya Kitaoka 120a6e
        QMap<tstageobjectspline *="" *,="" stageschematicsplinenode="">::iterator</tstageobjectspline>
Shinya Kitaoka 120a6e
            splineIt;
Shinya Kitaoka 120a6e
        splineIt = m_splineTable.find(spline);
Shinya Kitaoka 120a6e
        if (splineIt != m_splineTable.end()) {
Shinya Kitaoka 120a6e
          SchematicPort *port1 = splineIt.value()->getPort(-1);
Shinya Kitaoka 120a6e
          SchematicPort *port2 = groupeNode->getPort(-1);
Shinya Kitaoka 120a6e
          port2->makeLink(port1);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_nodesToPlace.clear();
manongjohn adae7d
  updatingScene = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
StageSchematicNode *StageSchematicScene::addStageSchematicNode(
Shinya Kitaoka 120a6e
    TStageObject *pegbar) {
Shinya Kitaoka 120a6e
  // create the node according to the type of StageObject
Shinya Kitaoka 120a6e
  StageSchematicNode *node = createStageSchematicNode(this, pegbar);
Shinya Kitaoka 120a6e
  if (!node) return 0;
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged()));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(xsheetChanged()), this, SLOT(onXsheetChanged()));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(currentObjectChanged(const TStageObjectId &, bool)),
Shinya Kitaoka 120a6e
          this, SLOT(onCurrentObjectChanged(const TStageObjectId &, bool)));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(currentColumnChanged(int)), this,
Shinya Kitaoka 120a6e
          SLOT(onCurrentColumnChanged(int)));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(editObject()), this, SIGNAL(editObject()));
manongjohn adae7d
  connect(node, SIGNAL(nodeChangedSize()), this, SLOT(onNodeChangedSize()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // specify the node position
Shinya Kitaoka 120a6e
  if (pegbar->getDagNodePos() == TConst::nowhere) {
Shinya Kitaoka 120a6e
    if (pegbar->getId().isColumn()) {
Shinya Kitaoka 120a6e
      StageSchematicColumnNode *cNode =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematiccolumnnode *="">(node);</stageschematiccolumnnode>
Shinya Kitaoka 120a6e
      assert(node);
Shinya Kitaoka 120a6e
      cNode->resize(m_gridDimension == 0);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    placeNode(node);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    updatePosition(node, pegbar->getDagNodePos());
Shinya Kitaoka 120a6e
  return node;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
StageSchematicGroupNode *StageSchematicScene::addStageGroupNode(
Shinya Kitaoka 120a6e
    QList<tstageobject *=""> objs) {</tstageobject>
Shinya Kitaoka 120a6e
  if (objs.isEmpty()) return 0;
Shinya Kitaoka 120a6e
  TStageObjectTree *objTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  TStageObject *root        = getRoot(objs, objTree);
Shinya Kitaoka 120a6e
  StageSchematicGroupNode *node = new StageSchematicGroupNode(this, root, objs);
Shinya Kitaoka 120a6e
  if (!node) return 0;
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged()));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(xsheetChanged()), this, SLOT(onXsheetChanged()));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(currentObjectChanged(const TStageObjectId &, bool)),
Shinya Kitaoka 120a6e
          this, SLOT(onCurrentObjectChanged(const TStageObjectId &, bool)));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(currentColumnChanged(int)), this,
Shinya Kitaoka 120a6e
          SLOT(onCurrentColumnChanged(int)));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(editObject()), this, SIGNAL(editObject()));
Shinya Kitaoka 120a6e
  if (root->getDagNodePos() == TConst::nowhere) {
Shinya Kitaoka 120a6e
    placeNode(node);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    updatePosition(node, root->getDagNodePos());
Shinya Kitaoka 120a6e
  return node;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
StageSchematicGroupEditor *
Shinya Kitaoka 120a6e
StageSchematicScene::addEditedGroupedStageSchematicNode(
Shinya Kitaoka 120a6e
    int groupId, const QList<schematicnode *=""> &groupedObjs) {</schematicnode>
Shinya Kitaoka 120a6e
  StageSchematicGroupEditor *editorGroup =
Shinya Kitaoka 120a6e
      new StageSchematicGroupEditor(groupId, groupedObjs, this);
Shinya Kitaoka 120a6e
  m_groupEditorTable[groupId] = editorGroup;
Shinya Kitaoka 120a6e
  return editorGroup;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::updatePosition(StageSchematicNode *node,
Shinya Kitaoka 120a6e
                                         const TPointD &pos) {
Shinya Kitaoka 120a6e
  node->setPos(QPointF(pos.x, pos.y));
Shinya Kitaoka 120a6e
  node->getStageObject()->setDagNodePos(pos);
Shinya Kitaoka 120a6e
  // this operation may abort
Shinya Kitaoka 120a6e
  /*
Shinya Kitaoka 120a6e
QVector<schematicnode*> placedNodes = getPlacedNode(node);</schematicnode*>
Shinya Kitaoka 120a6e
TPointD offset(15,15);
Shinya Kitaoka 120a6e
int i;
Shinya Kitaoka 120a6e
for(i=0; i
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 120a6e
StageSchematicNode *placedNode =
Shinya Kitaoka 120a6e
dynamic_cast<stageschematicnode*>(placedNodes[i]);</stageschematicnode*>
Shinya Kitaoka 120a6e
assert(placedNode);
Shinya Kitaoka 120a6e
TPointD newPos = placedNode->getStageObject()->getDagNodePos()+offset;
Shinya Kitaoka 120a6e
updatePosition(placedNode,newPos);
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::highlightLinks(StageSchematicNode *node, bool value) {
Shinya Kitaoka 120a6e
  int i, portCount = node->getChildCount();
Shinya Kitaoka 120a6e
  for (i = 0; i < portCount; i++) {
Shinya Kitaoka 120a6e
    StageSchematicNodePort *port = node->getChildPort(i);
Shinya Kitaoka 120a6e
    int j, linkCount = port->getLinkCount();
Shinya Kitaoka 120a6e
    for (j = 0; j < linkCount; j++) {
Shinya Kitaoka 120a6e
      SchematicLink *link = port->getLink(j);
Shinya Kitaoka 120a6e
      if (!link) continue;
Shinya Kitaoka 120a6e
      link->setHighlighted(value);
Shinya Kitaoka 120a6e
      link->update();
Shinya Kitaoka 120a6e
      m_highlightedLinks.push_back(link);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  StageSchematicNodePort *port = node->getParentPort();
Shinya Kitaoka 120a6e
  if (port) {
Shinya Kitaoka 120a6e
    int linkCount = port->getLinkCount();
Shinya Kitaoka 120a6e
    for (i = 0; i < linkCount; i++) {
Shinya Kitaoka 120a6e
      SchematicLink *link = port->getLink(i);
Shinya Kitaoka 120a6e
      if (link) {
Shinya Kitaoka 120a6e
        link->setHighlighted(value);
Shinya Kitaoka 120a6e
        link->update();
Shinya Kitaoka 120a6e
        m_highlightedLinks.push_back(link);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::updateEditedGroups(
Shinya Kitaoka 120a6e
    const QMap<int, *="" qlist<schematicnode="">> &editedGroup) {</int,>
Shinya Kitaoka 120a6e
  QMap<int, *="" qlist<schematicnode="">>::const_iterator it;</int,>
Shinya Kitaoka 120a6e
  for (it = editedGroup.begin(); it != editedGroup.end(); it++) {
shun-iwasawa 1a2d69
    int zValue                                            = 2;
Shinya Kitaoka 120a6e
    QMap<int, *="" qlist<schematicnode="">>::const_iterator it2 = editedGroup.begin();</int,>
Shinya Kitaoka 120a6e
    while (it2 != editedGroup.end()) {
Shinya Kitaoka 120a6e
      StageSchematicNode *placedObj =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematicnode *="">(it2.value()[0]);</stageschematicnode>
Shinya Kitaoka 120a6e
      StageSchematicNode *obj =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematicnode *="">(it.value()[0]);</stageschematicnode>
Shinya Kitaoka 120a6e
      if (!placedObj || !obj) {
Shinya Kitaoka 120a6e
        it2++;
Shinya Kitaoka 120a6e
        continue;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      int placedGroupedId = placedObj->getStageObject()->getEditingGroupId();
Shinya Kitaoka 120a6e
      if (obj->getStageObject()->isContainedInGroup(placedGroupedId) &&
Shinya Kitaoka 120a6e
          obj->getStageObject()->getEditingGroupId() != it2.key())
Shinya Kitaoka 120a6e
        zValue += 2;
Shinya Kitaoka 120a6e
      it2++;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    StageSchematicGroupEditor *node =
Shinya Kitaoka 120a6e
        addEditedGroupedStageSchematicNode(it.key(), it.value());
Shinya Kitaoka 120a6e
    node->setZValue(zValue);
Shinya Kitaoka 120a6e
    node->setGroupedNodeZValue(zValue + 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::updateNestedGroupEditors(StageSchematicNode *node,
Shinya Kitaoka 120a6e
                                                   const QPointF &newPos) {
Shinya Kitaoka 120a6e
  if (!node) return;
Shinya Kitaoka 120a6e
  QStack<int> groupIdStack = node->getStageObject()->getGroupIdStack();</int>
Shinya Kitaoka 120a6e
  if (groupIdStack.isEmpty()) return;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  QRectF rect;
Shinya Kitaoka 120a6e
  for (i = 0; i < groupIdStack.size(); i++) {
Shinya Kitaoka 120a6e
    if (m_groupEditorTable.contains(groupIdStack[i])) {
Shinya Kitaoka 120a6e
      QRectF app = m_groupEditorTable[groupIdStack[i]]->sceneBoundingRect();
Shinya Kitaoka 120a6e
      if (rect.isEmpty())
Shinya Kitaoka 120a6e
        rect = app;
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        rect = rect.united(app);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  node->setPos(newPos);
Shinya Kitaoka 120a6e
  for (i = 0; i < groupIdStack.size(); i++) {
Shinya Kitaoka 120a6e
    if (!m_groupEditorTable.contains(groupIdStack[i])) continue;
Shinya Kitaoka 120a6e
    rect =
Shinya Kitaoka 120a6e
        rect.united(m_groupEditorTable[groupIdStack[i]]->sceneBoundingRect());
Shinya Kitaoka 120a6e
    QRectF app = m_groupEditorTable[groupIdStack[i]]->boundingSceneRect();
Shinya Kitaoka 120a6e
    if (m_groupEditorTable[groupIdStack[i]]->scenePos() != app.topLeft())
Shinya Kitaoka 120a6e
      m_groupEditorTable[groupIdStack[i]]->setPos(app.topLeft());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  update(rect);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::resizeNodes(bool maximizedNode) {
manongjohn adae7d
  resizingNodes             = true;
Shinya Kitaoka 120a6e
  m_gridDimension           = maximizedNode ? eLarge : eSmall;
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  pegTree->setDagGridDimension(m_gridDimension);
Shinya Kitaoka 120a6e
  int i, objCount = pegTree->getStageObjectCount();
Shinya Kitaoka 120a6e
  for (i = 0; i < objCount; i++) {
Shinya Kitaoka 120a6e
    TStageObject *obj = pegTree->getStageObject(i);
Shinya Kitaoka 120a6e
    if (obj && obj->getId().isColumn()) {
Shinya Kitaoka 120a6e
      if (!m_nodeTable.contains(obj->getId())) continue;
Shinya Kitaoka 120a6e
      StageSchematicColumnNode *node =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematiccolumnnode *="">(m_nodeTable[obj->getId()]);</stageschematiccolumnnode>
Shinya Kitaoka 120a6e
      assert(node);
Shinya Kitaoka 120a6e
      node->resize(maximizedNode);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (obj && !obj->getId().isCamera())
Shinya Kitaoka 120a6e
      updatePositionOnResize(obj, maximizedNode);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  int splineCount = pegTree->getSplineCount();
Shinya Kitaoka 120a6e
  for (i = 0; i < splineCount; i++) {
Shinya Kitaoka 120a6e
    TStageObjectSpline *spl = pegTree->getSpline(i);
Shinya Kitaoka 120a6e
    if (spl) {
Shinya Kitaoka 120a6e
      if (!m_splineTable.contains(spl)) continue;
Shinya Kitaoka 120a6e
      StageSchematicSplineNode *node =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematicsplinenode *="">(m_splineTable[spl]);</stageschematicsplinenode>
Shinya Kitaoka 120a6e
      assert(node);
Shinya Kitaoka 120a6e
      node->resize(maximizedNode);
Shinya Kitaoka 120a6e
      updateSplinePositionOnResize(spl, maximizedNode);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QMap<int, *="" stageschematicgroupnode="">::iterator it;</int,>
Shinya Kitaoka 120a6e
  for (it = m_GroupTable.begin(); it != m_GroupTable.end(); it++) {
Shinya Kitaoka 120a6e
    it.value()->resize(maximizedNode);
Shinya Kitaoka 120a6e
    QList<tstageobject *=""> groupedObjs = it.value()->getGroupedObjects();</tstageobject>
Shinya Kitaoka 120a6e
    for (int i = 0; i < groupedObjs.size(); i++)
Shinya Kitaoka 120a6e
      updatePositionOnResize(groupedObjs[i], maximizedNode);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QMap<int, *="" stageschematicgroupeditor="">::iterator it2;</int,>
Shinya Kitaoka 120a6e
  for (it2 = m_groupEditorTable.begin(); it2 != m_groupEditorTable.end(); it2++)
Shinya Kitaoka 120a6e
    it2.value()->resizeNodes(maximizedNode);
Shinya Kitaoka 120a6e
  updateScene();
manongjohn adae7d
  resizingNodes = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::updatePositionOnResize(TStageObject *obj,
Shinya Kitaoka 120a6e
                                                 bool maximizedNode) {
Shinya Kitaoka 120a6e
  TPointD oldPos = obj->getDagNodePos();
manongjohn f37f4a
  if (oldPos == TConst::nowhere) return;
Shinya Kitaoka 120a6e
  double oldPosY = oldPos.y - 25500;
Shinya Kitaoka 120a6e
  double newPosY = maximizedNode ? oldPosY * 2 : oldPosY * 0.5;
Shinya Kitaoka 120a6e
  obj->setDagNodePos(TPointD(oldPos.x, newPosY + 25500));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::updateSplinePositionOnResize(TStageObjectSpline *spl,
Shinya Kitaoka 120a6e
                                                       bool maximizedNode) {
Shinya Kitaoka 120a6e
  TPointD oldPos = spl->getDagNodePos();
manongjohn f37f4a
  if (oldPos == TConst::nowhere) return;
Shinya Kitaoka 120a6e
  double oldPosY = oldPos.y - 25500;
Shinya Kitaoka 120a6e
  double newPosY = maximizedNode ? oldPosY * 2 : oldPosY * 0.5;
Shinya Kitaoka 120a6e
  spl->setDagNodePos(TPointD(oldPos.x, newPosY + 25500));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
StageSchematicSplineNode *StageSchematicScene::addSchematicSplineNode(
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline) {
Shinya Kitaoka 120a6e
  StageSchematicSplineNode *node = new StageSchematicSplineNode(this, spline);
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged()));
Shinya Kitaoka 120a6e
  connect(node, SIGNAL(xsheetChanged()), this, SLOT(onXsheetChanged()));
Shinya Kitaoka 120a6e
  if (!node) return 0;
Shinya Kitaoka 120a6e
  if (spline->getDagNodePos() == TConst::nowhere) {
Shinya Kitaoka 120a6e
    node->resize(m_gridDimension == 0);
Shinya Kitaoka 120a6e
    placeSplineNode(node);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    node->setPos(QPointF(spline->getDagNodePos().x, spline->getDagNodePos().y));
Shinya Kitaoka 120a6e
  return node;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! create node according to the type of StageObject
shun-iwasawa 1a2d69
 */
Shinya Kitaoka 120a6e
StageSchematicNode *StageSchematicScene::createStageSchematicNode(
Shinya Kitaoka 120a6e
    StageSchematicScene *scene, TStageObject *pegbar) {
Shinya Kitaoka 120a6e
  TStageObjectId id = pegbar->getId();
Shinya Kitaoka 120a6e
  if (id.isColumn()) {
Shinya Kitaoka 120a6e
    int columnIndex = id.getIndex();
Shinya Kitaoka 120a6e
    if (m_xshHandle->getXsheet()->isColumnEmpty(columnIndex)) {
Shinya Kitaoka 120a6e
      return 0;
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      TXshColumn *column = m_xshHandle->getXsheet()->getColumn(columnIndex);
Shinya Kitaoka 120a6e
      if (!column || column->getSoundColumn() || column->getSoundTextColumn())
Shinya Kitaoka 120a6e
        return 0;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (!pegbar || !scene) return 0;
Shinya Kitaoka 120a6e
  if (id.isTable())
Shinya Kitaoka 120a6e
    return new StageSchematicTableNode(scene, pegbar);
Shinya Kitaoka 120a6e
  else if (id.isCamera())
Shinya Kitaoka 120a6e
    return new StageSchematicCameraNode(scene, pegbar);
Shinya Kitaoka 120a6e
  else if (id.isPegbar())
Shinya Kitaoka 120a6e
    return new StageSchematicPegbarNode(scene, pegbar);
Shinya Kitaoka 120a6e
  else if (id.isColumn())
Shinya Kitaoka 120a6e
    return new StageSchematicColumnNode(scene, pegbar);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QGraphicsItem *StageSchematicScene::getCurrentNode() {
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> allItems = items();</qgraphicsitem>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (auto const item : allItems) {
Shinya Kitaoka 120a6e
    StageSchematicNode *node = dynamic_cast<stageschematicnode *="">(item);</stageschematicnode>
Shinya Kitaoka 120a6e
    if (node && node->getStageObject()->getId() == m_objHandle->getObjectId())
Shinya Kitaoka 120a6e
      return node;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::reorderScene() { placeNodes(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::placeNodes() {
Shinya Kitaoka 120a6e
  // search all possible roots
Shinya Kitaoka 120a6e
  std::vector<treestagenode *=""> roots;</treestagenode>
Shinya Kitaoka 120a6e
  findRoots(roots);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // sorts the roots container. Sortijg rules are specified by CompareNodes
Shinya Kitaoka 120a6e
  // class
Shinya Kitaoka 120a6e
  std::sort(roots.begin(), roots.end(), CompareNodes());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double xFirstPos = m_firstPos.x - 500;
Shinya Kitaoka 120a6e
  double yFirstPos = m_firstPos.y + 500;
Shinya Kitaoka 120a6e
  double xPos      = xFirstPos;
Shinya Kitaoka 120a6e
  double yPos      = yFirstPos;
Shinya Kitaoka 120a6e
  double maxXPos;
Shinya Kitaoka 120a6e
  double maxYPos = yFirstPos;
Shinya Kitaoka 120a6e
  int step       = m_gridDimension == eLarge ? 100 : 50;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // places the first roots and its children. The first root is always a table!
Shinya Kitaoka 120a6e
  assert(roots[0]->getNode()->getStageObject()->getId().isTable());
Shinya Kitaoka 120a6e
  roots[0]->getNode()->getStageObject()->setDagNodePos(
Shinya Kitaoka 120a6e
      TPointD(xFirstPos, yFirstPos));
Shinya Kitaoka 120a6e
  placeChildren(roots[0], xPos, yPos);
Shinya Kitaoka 120a6e
  maxXPos = xPos;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  // places other roots and root's children.
Shinya Kitaoka 120a6e
  for (i = 1; i < (int)roots.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = roots[i]->getNode()->getStageObject();
Shinya Kitaoka 120a6e
    xPos                 = xFirstPos;
Shinya Kitaoka 120a6e
    yPos                 = maxYPos + (pegbar->getId().isCamera() ? 100 : step);
Shinya Kitaoka 120a6e
    pegbar->setDagNodePos(TPointD(xPos, yPos));
Shinya Kitaoka 120a6e
    placeChildren(roots[i], xPos, yPos);
Shinya Kitaoka 120a6e
    maxXPos = std::max(xPos, maxXPos);
Shinya Kitaoka 120a6e
    maxYPos = std::max(yPos, maxYPos);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // places all spline nodes.
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  for (i = 0; i < pegTree->getSplineCount(); i++) {
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline = pegTree->getSpline(i);
Shinya Kitaoka 120a6e
    spline->setDagNodePos(TPointD(maxXPos, yFirstPos + step));
Shinya Kitaoka 120a6e
    maxXPos += (m_showLetterOnPortFlag) ? 150 : 120;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // delete the tree
Shinya Kitaoka 120a6e
  for (i = 0; i < (int)roots.size(); i++) delete roots[i];
Shinya Kitaoka 120a6e
  roots.clear();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  updateScene();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::findRoots(std::vector<treestagenode *=""> &roots) {</treestagenode>
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < pegTree->getStageObjectCount(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *pegbar = pegTree->getStageObject(i);
Shinya Kitaoka 120a6e
    // only cameras and pegbars can be roots
shun-iwasawa 1a2d69
    // check if the id is contained in the table in case the object is grouped
shun-iwasawa 1a2d69
    if ((pegbar->getId().isCamera() || pegbar->getId().isTable()) &&
shun-iwasawa 1a2d69
        m_nodeTable.contains(pegbar->getId())) {
Shinya Kitaoka 120a6e
      StageSchematicNode *node = m_nodeTable[pegbar->getId()];
Shinya Kitaoka 120a6e
      TreeStageNode *treeNode  = new TreeStageNode(node);
Shinya Kitaoka 120a6e
      roots.push_back(treeNode);
Shinya Kitaoka 120a6e
      // when a root is found, the tree is build.
Shinya Kitaoka 120a6e
      makeTree(treeNode);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::makeTree(TreeStageNode *treeNode) {
Shinya Kitaoka 120a6e
  int i, portCount = treeNode->getNode()->getChildCount();
Shinya Kitaoka 120a6e
  for (i = 0; i < portCount; i++) {
Shinya Kitaoka 120a6e
    StageSchematicNodePort *port = treeNode->getNode()->getChildPort(i);
Shinya Kitaoka 120a6e
    int firstChild               = treeNode->getChildrenCount();
Shinya Kitaoka 120a6e
    int j, linkCount = port->getLinkCount();
Shinya Kitaoka 120a6e
    for (j = 0; j < linkCount; j++) {
Shinya Kitaoka 120a6e
      // the linked node is taken and the method is iterated for this node
Shinya Kitaoka 120a6e
      StageSchematicNode *schematicNode =
Shinya Kitaoka 120a6e
          dynamic_cast<stageschematicnode *="">(port->getLinkedNode(j));</stageschematicnode>
Shinya Kitaoka 120a6e
      TreeStageNode *treeChild = new TreeStageNode(schematicNode);
Shinya Kitaoka 120a6e
      treeNode->addChild(treeChild);
Shinya Kitaoka 120a6e
      makeTree(treeChild);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    int lastChild = treeNode->getChildrenCount();
Shinya Kitaoka 120a6e
    treeNode->sortChildren(firstChild, lastChild);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::placeChildren(TreeStageNode *treeNode, double &xPos,
Shinya Kitaoka 120a6e
                                        double &yPos, bool isCameraTree) {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  xPos += (m_showLetterOnPortFlag) ? 150 : 120;
Shinya Kitaoka 120a6e
  double xChildPos = xPos;
Shinya Kitaoka 120a6e
  double xRefPos   = xPos;
Shinya Kitaoka 120a6e
  bool firstChild  = true;
Shinya Kitaoka 120a6e
  bool startFromCamera =
Shinya Kitaoka 120a6e
      isCameraTree || treeNode->getNode()->getStageObject()->getId().isCamera();
Shinya Kitaoka 120a6e
  int step       = m_gridDimension == eLarge ? 100 : 50;
Shinya Kitaoka 120a6e
  double yOffset = startFromCamera ? step : -step;
Shinya Kitaoka 120a6e
  if (startFromCamera) treeNode->reverseChildren();
Shinya Kitaoka 120a6e
  for (i = 0; i < treeNode->getChildrenCount(); i++) {
Shinya Kitaoka 120a6e
    TreeStageNode *childNode  = treeNode->getChildTreeNode(i);
Shinya Kitaoka 120a6e
    TStageObject *childPegbar = childNode->getNode()->getStageObject();
Shinya Kitaoka 120a6e
    if (childPegbar->getId().isCamera()) continue;
Shinya Kitaoka 120a6e
    xChildPos = xRefPos;
Shinya Kitaoka 120a6e
    // first child must have same yPos of father.
Shinya Kitaoka 120a6e
    yPos += firstChild ? 0 : yOffset;
Shinya Kitaoka 120a6e
    firstChild = false;
Shinya Kitaoka 120a6e
    childPegbar->setDagNodePos(TPointD(xChildPos, yPos));
Shinya Kitaoka 120a6e
    placeChildren(childNode, xChildPos, yPos, startFromCamera);
Shinya Kitaoka 120a6e
    xPos = std::max(xPos, xChildPos);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! define the position of nodes which is not specified manually
shun-iwasawa 1a2d69
 */
Shinya Kitaoka 120a6e
void StageSchematicScene::placeNode(StageSchematicNode *node) {
Shinya Kitaoka 120a6e
  double xFirstPos = m_firstPos.x - 500;
Shinya Kitaoka 120a6e
  double yFirstPos = m_firstPos.y + 500;
Shinya Kitaoka 120a6e
  double xPos      = xFirstPos;
Shinya Kitaoka 120a6e
  double yPos      = yFirstPos;
Shinya Kitaoka 120a6e
  int step         = m_gridDimension == eLarge ? 100 : 50;
Shinya Kitaoka 120a6e
  int hStep        = (m_showLetterOnPortFlag) ? 150 : 120;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  QRectF nodeRect           = node->boundingRect();
Shinya Kitaoka 120a6e
  TStageObject *pegbar      = node->getStageObject();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStageObjectId parentObjId = pegbar->getParent();
Shinya Kitaoka 120a6e
  TStageObject *parentObj    = pegTree->getStageObject(parentObjId, false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (pegbar->getId().isCamera())
Shinya Kitaoka 120a6e
    yPos = yFirstPos + step;
Shinya Kitaoka 120a6e
  else if (pegbar->getId().isPegbar()) {
Shinya Kitaoka 120a6e
    if (parentObj) {
Shinya Kitaoka 120a6e
      if (parentObj->getDagNodePos() != TConst::nowhere) {
Shinya Kitaoka 120a6e
        TPointD pos = parentObj->getDagNodePos();
Shinya Kitaoka 120a6e
        yPos        = pos.y;
Shinya Kitaoka 120a6e
        xPos        = pos.x + hStep;
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        m_nodesToPlace[parentObjId].append(node);
Shinya Kitaoka 120a6e
        return;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      yPos = yFirstPos;
Shinya Kitaoka 120a6e
      xPos = xFirstPos + hStep;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else if (pegbar->getId().isColumn()) {
Shinya Kitaoka 120a6e
    if (parentObj) {
Shinya Kitaoka 120a6e
      if (parentObj->getDagNodePos() != TConst::nowhere) {
Shinya Kitaoka 120a6e
        TPointD pos = parentObj->getDagNodePos();
Shinya Kitaoka 120a6e
        yPos        = pos.y;
Shinya Kitaoka 120a6e
        xPos        = pos.x + hStep;
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        m_nodesToPlace[parentObjId].append(node);
Shinya Kitaoka 120a6e
        return;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      yPos = yFirstPos;
Shinya Kitaoka 120a6e
      xPos = xFirstPos + (hStep * 2);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QPointF initPos(xPos, yPos);
Shinya Kitaoka 120a6e
  nodeRect.moveTopLeft(initPos);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool found = false;
Shinya Kitaoka 120a6e
  // try to place inside of the visible area
Shinya Kitaoka 120a6e
  if (!views().isEmpty() && pegbar->getId().isPegbar()) {
Shinya Kitaoka 120a6e
    QGraphicsView *view = views().at(0);
Shinya Kitaoka 120a6e
    QRectF visibleRect =
Shinya Kitaoka 120a6e
        view->mapToScene(0, 0, view->width(), view->height()).boundingRect();
Shinya Kitaoka 120a6e
    while (visibleRect.left() > nodeRect.left()) {
Shinya Kitaoka 120a6e
      nodeRect.translate(hStep, 0);
Shinya Kitaoka 120a6e
      xPos += hStep;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    while (visibleRect.bottom() < nodeRect.bottom()) {
Shinya Kitaoka 120a6e
      nodeRect.translate(0, -step);
Shinya Kitaoka 120a6e
      yPos -= step;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    QPointF tmpPos(xPos, yPos);
Shinya Kitaoka 120a6e
    while (visibleRect.right() > nodeRect.right()) {
Shinya Kitaoka 120a6e
      while (!isAnEmptyZone(nodeRect)) {
Shinya Kitaoka 120a6e
        nodeRect.translate(0, -step);
Shinya Kitaoka 120a6e
        yPos -= step;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      // if failed to place this column, then move the candidate position to
Shinya Kitaoka 120a6e
      // right
Shinya Kitaoka 120a6e
      if (visibleRect.contains(nodeRect)) {
Shinya Kitaoka 120a6e
        found = true;
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        xPos += hStep;
Shinya Kitaoka 120a6e
        yPos = tmpPos.y();
Shinya Kitaoka 120a6e
        nodeRect.moveTopLeft(QPointF(xPos, yPos));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // place the node outside of the visible area
Shinya Kitaoka 120a6e
  if (!found) {
Shinya Kitaoka 120a6e
    nodeRect.moveTopLeft(initPos);
Shinya Kitaoka 120a6e
    xPos = initPos.x();
Shinya Kitaoka 120a6e
    yPos = initPos.y();
Shinya Kitaoka 120a6e
    nodeRect.moveTopLeft(initPos);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    while (!isAnEmptyZone(nodeRect)) {
Shinya Kitaoka 120a6e
      if (pegbar->getId().isCamera()) {
Shinya Kitaoka 120a6e
        nodeRect.translate(0, step);
Shinya Kitaoka 120a6e
        yPos += step;
Shinya Kitaoka 120a6e
      } else if (pegbar->getId().isColumn() || pegbar->getId().isPegbar()) {
Shinya Kitaoka 120a6e
        nodeRect.translate(0, -step);
Shinya Kitaoka 120a6e
        yPos -= step;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  pegbar->setDagNodePos(TPointD(xPos, yPos));
Shinya Kitaoka 120a6e
  node->setPos(xPos, yPos);
Shinya Kitaoka 120a6e
  if (m_nodesToPlace.contains(pegbar->getId())) {
Shinya Kitaoka 120a6e
    QList<stageschematicnode *=""> nodes = m_nodesToPlace[pegbar->getId()];</stageschematicnode>
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < nodes.size(); i++) placeNode(nodes[i]);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::placeSplineNode(
Shinya Kitaoka 120a6e
    StageSchematicSplineNode *splineNode) {
Shinya Kitaoka 120a6e
  double xFirstPos           = m_firstPos.x - 500;
Shinya Kitaoka 120a6e
  double yFirstPos           = m_firstPos.y + 500;
Shinya Kitaoka 120a6e
  int hStep                  = (m_showLetterOnPortFlag) ? 150 : 120;
Shinya Kitaoka 120a6e
  double xPos                = xFirstPos + (hStep * 2);
Shinya Kitaoka 120a6e
  int step                   = m_gridDimension == eLarge ? 100 : 50;
Shinya Kitaoka 120a6e
  double yPos                = yFirstPos + step;
Shinya Kitaoka 120a6e
  QRectF nodeRect            = splineNode->boundingRect();
Shinya Kitaoka 120a6e
  TStageObjectSpline *spline = splineNode->getSpline();
Shinya Kitaoka 120a6e
  nodeRect.translate(QPointF(xPos, yPos));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  while (!isAnEmptyZone(nodeRect)) {
Shinya Kitaoka 120a6e
    nodeRect.translate(hStep, 0);
Shinya Kitaoka 120a6e
    xPos += hStep;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  spline->setDagNodePos(TPointD(xPos, yPos));
Shinya Kitaoka 120a6e
  splineNode->setPos(xPos, yPos);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onPegbarAdded() {
Shinya Kitaoka 120a6e
  // if this command called from the context menu, place the node at the
Shinya Kitaoka 120a6e
  // cllicked position
Shinya Kitaoka 120a6e
  // clickedPos will be null(0,0) if it called from the toolbar
Shinya Kitaoka 120a6e
  QPointF clickedPos = qobject_cast<qaction *="">(sender())->data().toPointF();</qaction>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TStageObjectCmd::addNewPegbar(m_xshHandle, m_objHandle, clickedPos);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onSplineAdded() {
Shinya Kitaoka 120a6e
  // if this command called from the context menu, place the node at the
Shinya Kitaoka 120a6e
  // cllicked position
Shinya Kitaoka 120a6e
  // clickedPos will be null(0,0) if it called from the toolbar
Shinya Kitaoka 120a6e
  QPointF clickedPos = qobject_cast<qaction *="">(sender())->data().toPointF();</qaction>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TStageObjectCmd::addNewSpline(m_xshHandle, m_objHandle, m_colHandle,
Shinya Kitaoka 120a6e
                                clickedPos);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onCameraAdded() {
Shinya Kitaoka 120a6e
  // if this command called from the context menu, place the node at the
Shinya Kitaoka 120a6e
  // cllicked position
Shinya Kitaoka 120a6e
  // clickedPos will be null(0,0) if it called from the toolbar
Shinya Kitaoka 120a6e
  QPointF clickedPos = qobject_cast<qaction *="">(sender())->data().toPointF();</qaction>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TStageObjectCmd::addNewCamera(m_xshHandle, m_objHandle, clickedPos);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onSwitchPortModeToggled(bool withLetter) {
Shinya Kitaoka 120a6e
  m_showLetterOnPortFlag            = withLetter;
Shinya Kitaoka 120a6e
  ShowLetterOnOutputPortOfStageNode = (withLetter) ? 1 : 0;
Shinya Kitaoka 120a6e
  updateScene();
shun_iwasawa 22eaa4
}
shun_iwasawa 22eaa4
shun_iwasawa 22eaa4
//------------------------------------------------------------------
shun_iwasawa 22eaa4
Shinya Kitaoka 120a6e
void StageSchematicScene::onResetCenter() {
Shinya Kitaoka 120a6e
  TStageObjectId id = m_objHandle->getObjectId();
Shinya Kitaoka 120a6e
  TStageObjectCmd::resetCenterAndOffset(id, m_xshHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onCameraActivate() {
Shinya Kitaoka 120a6e
  TStageObjectCmd::setAsActiveCamera(m_xshHandle, m_objHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onRemoveSpline() { m_selection->deleteSelection(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onSaveSpline() {
Shinya Kitaoka 120a6e
  TFilePath projectFolder =
Shinya Kitaoka 120a6e
      m_sceneHandle->getScene()->getProject()->getProjectFolder();
Shinya Kitaoka 120a6e
  QString fileNameStr = QFileDialog::getSaveFileName(
Shinya Kitaoka 120a6e
      this->views()[0], QObject::tr("Save Motion Path"),
Shinya Kitaoka 120a6e
      QString::fromStdWString(projectFolder.getWideString()),
Shinya Kitaoka 120a6e
      QObject::tr("Motion Path files (*.mpath)"));
Shinya Kitaoka 120a6e
  if (fileNameStr == "") return;
Shinya Kitaoka 120a6e
  TFilePath fp(fileNameStr.toStdWString());
Shinya Kitaoka 120a6e
  if (fp.getType() == "") fp = fp.withType("mpath");
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    assert(m_objHandle->isSpline());
Shinya Kitaoka 120a6e
    TStageObjectId id        = m_objHandle->getObjectId();
Shinya Kitaoka 120a6e
    TXsheet *xsh             = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
    TStageObject *currentObj = xsh->getStageObjectTree()->getStageObject(id);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (currentObj == 0) throw "no currentObj";
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline = currentObj->getSpline();
Shinya Kitaoka 120a6e
    if (spline == 0) throw "no spline";
Shinya Kitaoka 120a6e
    TOStream os(fp);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Only points are saved
Shinya Kitaoka 120a6e
    const TStroke *stroke = spline->getStroke();
Shinya Kitaoka 120a6e
    int n                 = stroke ? stroke->getControlPointCount() : 0;
Shinya Kitaoka 120a6e
    for (int i = 0; i < n; i++) {
Shinya Kitaoka 120a6e
      TThickPoint p = stroke->getControlPoint(i);
Shinya Kitaoka 120a6e
      os << p.x << p.y << p.thick;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    DVGui::warning(QObject::tr("It is not possible to save the motion path."));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onLoadSpline() {
Shinya Kitaoka 120a6e
  TFilePath projectFolder =
Shinya Kitaoka 120a6e
      m_sceneHandle->getScene()->getProject()->getProjectFolder();
Shinya Kitaoka 120a6e
  QString fileNameStr = QFileDialog::getOpenFileName(
Shinya Kitaoka 120a6e
      this->views()[0], QObject::tr("Load Motion Path"),
Shinya Kitaoka 120a6e
      QString::fromStdWString(projectFolder.getWideString()),
Shinya Kitaoka 120a6e
      QObject::tr("Motion Path files (*.mpath)"));
Shinya Kitaoka 120a6e
  if (fileNameStr == "") return;
Shinya Kitaoka 120a6e
  TFilePath fp(fileNameStr.toStdWString());
Shinya Kitaoka 120a6e
  if (fp.getType() == "") fp = fp.withType("mpath");
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    if (!TFileStatus(fp).doesExist()) {
Shinya Kitaoka 120a6e
      QString msg;
Shinya Kitaoka 120a6e
      msg = "Motion path " + toQString(fp) + " doesn't exists.";
Shinya Kitaoka 120a6e
      DVGui::info(msg);
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    assert(m_objHandle->isSpline());
Shinya Kitaoka 120a6e
    // ObjectID of the parent node to which the spline is connected
Shinya Kitaoka 120a6e
    TStageObjectId id = m_objHandle->getObjectId();
Shinya Kitaoka 120a6e
    TXsheet *xsh      = m_xshHandle->getXsheet();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TStageObjectSpline *spline =
Shinya Kitaoka 120a6e
        xsh->getStageObjectTree()->getStageObject(id, false)->getSpline();
Shinya Kitaoka 120a6e
    if (!spline) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TIStream is(fp);
Shinya Kitaoka 120a6e
    if (is) {
Shinya Kitaoka 120a6e
      spline->loadData(is);
Shinya Kitaoka 120a6e
      m_objHandle->setSplineObject(spline);
Shinya Kitaoka 120a6e
      m_objHandle->commitSplineChanges();
Shinya Kitaoka 120a6e
      IconGenerator::instance()->invalidate(spline);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    DVGui::warning(QObject::tr("It is not possible to load the motion path."));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onPathToggled(int state) {
Shinya Kitaoka 120a6e
  TStageObjectId objId = m_objHandle->getObjectId();
Shinya Kitaoka 120a6e
  TStageObject *obj    = m_xshHandle->getXsheet()->getStageObject(objId);
Shinya Kitaoka 120a6e
  TStageObjectCmd::enableSplineAim(obj, state, m_xshHandle);
Shinya Kitaoka 120a6e
  onSceneChanged();
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onCpToggled(bool toggled) {
Shinya Kitaoka 120a6e
  TStageObjectId objId = m_objHandle->getObjectId();
Shinya Kitaoka 120a6e
  TStageObject *obj    = m_xshHandle->getXsheet()->getStageObject(objId);
Shinya Kitaoka 120a6e
  TStageObjectCmd::enableSplineUppk(obj, toggled, m_xshHandle);
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TXsheet *StageSchematicScene::getXsheet() { return m_xshHandle->getXsheet(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onXsheetChanged() {
Shinya Kitaoka 120a6e
  m_xshHandle->notifyXsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onSceneChanged() {
Shinya Kitaoka 120a6e
  m_sceneHandle->notifySceneChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onCurrentObjectChanged(const TStageObjectId &id,
Shinya Kitaoka 120a6e
                                                 bool isSpline) {
Shinya Kitaoka 120a6e
  // revert the pre-selected node to normal text color
Shinya Kitaoka 120a6e
  QMap<tstageobjectid, *="" stageschematicnode="">::iterator it;</tstageobjectid,>
Shinya Kitaoka 120a6e
  it = m_nodeTable.find(getCurrentObject());
Shinya Kitaoka 120a6e
  if (it != m_nodeTable.end()) {
Shinya Kitaoka 120a6e
    it.value()->update();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_objHandle->setObjectId(id);
Shinya Kitaoka 120a6e
  if (m_frameHandle->isEditingLevel()) return;
Shinya Kitaoka 120a6e
  m_objHandle->setIsSpline(isSpline);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onCurrentColumnChanged(int index) {
Shinya Kitaoka 120a6e
  m_colHandle->setColumnIndex(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::contextMenuEvent(
Shinya Kitaoka 120a6e
    QGraphicsSceneContextMenuEvent *cme) {
Shinya Kitaoka 120a6e
  QPointF scenePos                = cme->scenePos();
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> itemList = items(scenePos);</qgraphicsitem>
Shinya Kitaoka 120a6e
  if (!itemList.isEmpty()) {
Shinya Kitaoka 120a6e
    SchematicScene::contextMenuEvent(cme);
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMenu menu(views()[0]);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // AddPegbar
Shinya Kitaoka 120a6e
  QAction *addPegbar = new QAction(tr("&New Pegbar"), &menu);
Shinya Kitaoka 120a6e
  connect(addPegbar, SIGNAL(triggered()), this, SLOT(onPegbarAdded()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // AddSpline
Shinya Kitaoka 120a6e
  QAction *addSpline = new QAction(tr("&New Motion Path"), &menu);
Shinya Kitaoka 120a6e
  connect(addSpline, SIGNAL(triggered()), this, SLOT(onSplineAdded()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // AddCamera
Shinya Kitaoka 120a6e
  QAction *addCamera = new QAction(tr("&New Camera"), &menu);
Shinya Kitaoka 120a6e
  connect(addCamera, SIGNAL(triggered()), this, SLOT(onCameraAdded()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QAction *paste = CommandManager::instance()->getAction("MI_Paste");
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // this is to place the node at the clicked position
Shinya Kitaoka 120a6e
  addPegbar->setData(cme->scenePos());
Shinya Kitaoka 120a6e
  addSpline->setData(cme->scenePos());
Shinya Kitaoka 120a6e
  addCamera->setData(cme->scenePos());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  menu.addAction(addPegbar);
Shinya Kitaoka 120a6e
  menu.addAction(addCamera);
Shinya Kitaoka 120a6e
  menu.addAction(addSpline);
manongjohn d6e3cc
manongjohn d6e3cc
  // Close sub xsheet and move to parent sheet
manongjohn d6e3cc
  ToonzScene *scene      = m_sceneHandle->getScene();
manongjohn d6e3cc
  ChildStack *childStack = scene->getChildStack();
manongjohn d6e3cc
  if (childStack && childStack->getAncestorCount() > 0) {
manongjohn d6e3cc
    menu.addSeparator();
manongjohn d6e3cc
    menu.addAction(CommandManager::instance()->getAction("MI_CloseChild"));
manongjohn d6e3cc
  }
manongjohn d6e3cc
Shinya Kitaoka 120a6e
  menu.addSeparator();
Shinya Kitaoka 120a6e
  menu.addAction(paste);
Shinya Kitaoka 120a6e
  m_selection->setPastePosition(TPointD(scenePos.x(), scenePos.y()));
Shinya Kitaoka 120a6e
  menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::mousePressEvent(QGraphicsSceneMouseEvent *me) {
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> items = selectedItems();</qgraphicsitem>
Shinya Kitaoka 120a6e
  SchematicScene::mousePressEvent(me);
shun-iwasawa 443318
  if (me->button() == Qt::MiddleButton) {
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < items.size(); i++) items[i]->setSelected(true);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
SchematicNode *StageSchematicScene::getNodeFromPosition(const QPointF &pos) {
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> pickedItems = items(pos);</qgraphicsitem>
Shinya Kitaoka 120a6e
  for (int i = 0; i < pickedItems.size(); i++) {
Shinya Kitaoka 120a6e
    SchematicNode *node = dynamic_cast<schematicnode *="">(pickedItems.at(i));</schematicnode>
Shinya Kitaoka 120a6e
    if (node) return node;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onSelectionChanged() {
Shinya Kitaoka 120a6e
  m_selection->selectNone();
Shinya Kitaoka 120a6e
  int i, size = m_highlightedLinks.size();
Shinya Kitaoka 120a6e
  for (i = 0; i < size; i++) {
Shinya Kitaoka 120a6e
    SchematicLink *link = m_highlightedLinks[i];
Shinya Kitaoka 120a6e
    link->setHighlighted(false);
Shinya Kitaoka 120a6e
    link->update();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_highlightedLinks.clear();
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> slcItems = selectedItems();</qgraphicsitem>
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *="">::iterator it;</qgraphicsitem>
Shinya Kitaoka 120a6e
  for (it = slcItems.begin(); it != slcItems.end(); it++) {
Shinya Kitaoka 120a6e
    StageSchematicGroupNode *groupNode =
Shinya Kitaoka 120a6e
        dynamic_cast<stageschematicgroupnode *="">(*it);</stageschematicgroupnode>
Shinya Kitaoka 120a6e
    StageSchematicNode *node = dynamic_cast<stageschematicnode *="">(*it);</stageschematicnode>
Shinya Kitaoka 120a6e
    if (groupNode) {
Shinya Kitaoka 120a6e
      QList<tstageobject *=""> objs = groupNode->getGroupedObjects();</tstageobject>
Shinya Kitaoka 120a6e
      for (i = 0; i < objs.size(); i++) m_selection->select(objs[i]->getId());
Shinya Kitaoka 120a6e
      highlightLinks(groupNode, true);
Shinya Kitaoka 120a6e
    } else if (node) {
Shinya Kitaoka 120a6e
      m_selection->select(node->getStageObject()->getId());
Shinya Kitaoka 120a6e
      highlightLinks(node, true);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    StageSchematicSplineNode *spline =
Shinya Kitaoka 120a6e
        dynamic_cast<stageschematicsplinenode *="">(*it);</stageschematicsplinenode>
Shinya Kitaoka 120a6e
    if (spline) {
Shinya Kitaoka 120a6e
      m_selection->select(spline->getSpline()->getId());
Shinya Kitaoka 120a6e
      StageSchematicSplinePort *port = spline->getParentPort();
Shinya Kitaoka 120a6e
      if (port) {
Shinya Kitaoka 120a6e
        int i, linkCount = port->getLinkCount();
Shinya Kitaoka 120a6e
        for (i = 0; i < linkCount; i++) {
Shinya Kitaoka 120a6e
          SchematicLink *link = port->getLink(i);
Shinya Kitaoka 120a6e
          link->setHighlighted(true);
Shinya Kitaoka 120a6e
          m_highlightedLinks.push_back(link);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    SchematicLink *link = dynamic_cast<schematiclink *="">(*it);</schematiclink>
Shinya Kitaoka 120a6e
    if (link) m_selection->select(link);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (!m_selection->isEmpty()) m_selection->makeCurrent();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onCollapse(QList<tstageobjectid> objects) {</tstageobjectid>
Shinya Kitaoka 120a6e
  emit doCollapse(objects);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void StageSchematicScene::onEditGroup() {
Shinya Kitaoka 120a6e
  if (m_selection->isEmpty()) return;
Shinya Kitaoka 120a6e
  TStageObjectTree *pegTree  = m_xshHandle->getXsheet()->getStageObjectTree();
Shinya Kitaoka 120a6e
  QList<tstageobjectid> objs = m_selection->getObjects();</tstageobjectid>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < objs.size(); i++) {
Shinya Kitaoka 120a6e
    TStageObject *obj = pegTree->getStageObject(objs[i], false);
Shinya Kitaoka 120a6e
    if (obj && obj->isGrouped() && !obj->isGroupEditing()) obj->editGroup();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  updateScene();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TStageObjectId StageSchematicScene::getCurrentObject() {
Shinya Kitaoka 120a6e
  return m_objHandle->getObjectId();
Toshihiro Shimizu 890ddd
}
manongjohn adae7d
manongjohn adae7d
//------------------------------------------------------------------
manongjohn adae7d
manongjohn adae7d
void StageSchematicScene::onNodeChangedSize() {
manongjohn adae7d
  if (resizingNodes) return;
manongjohn adae7d
  updateScene();
manongjohn adae7d
}
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
//------------------------------------------------------------------
shun-iwasawa 57ba4e
// snap to neighbor nodes on dragging
shun-iwasawa 57ba4e
void StageSchematicScene::updateSnapTarget(QGraphicsItem *item) {
shun-iwasawa 57ba4e
  clearSnapTargets();
shun-iwasawa 57ba4e
  StageSchematicNode *node = dynamic_cast<stageschematicnode *="">(item);</stageschematicnode>
shun-iwasawa 57ba4e
  if (!node) return;
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  int portCount = node->getChildCount();
shun-iwasawa 57ba4e
  for (int i = 0; i < portCount; i++) {
shun-iwasawa 57ba4e
    StageSchematicNodePort *port = node->getChildPort(i);
shun-iwasawa 57ba4e
    int j, linkCount = port->getLinkCount();
shun-iwasawa 57ba4e
    for (j = 0; j < linkCount; j++) {
shun-iwasawa 57ba4e
      SchematicLink *link = port->getLink(j);
shun-iwasawa 57ba4e
      if (!link) continue;
shun-iwasawa 57ba4e
      SchematicNode *otherNode = link->getOtherNode(node);
shun-iwasawa 57ba4e
      if (otherNode && !otherNode->isSelected()) {
shun-iwasawa 57ba4e
        QPointF targetPos =
shun-iwasawa 57ba4e
            otherNode->scenePos() -
shun-iwasawa 57ba4e
            QPointF(node->boundingRect().width() + SchematicScene::snapHSpacing,
shun-iwasawa 57ba4e
                    0);
shun-iwasawa 57ba4e
        addSnapTarget(targetPos, node->boundingRect(),
shun-iwasawa 57ba4e
                      link->getOtherPort(port)->getLinkEndPoint(),
shun-iwasawa 57ba4e
                      port->getLinkEndPoint() - node->scenePos());
shun-iwasawa 57ba4e
      }
shun-iwasawa 57ba4e
    }
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  StageSchematicNodePort *port = node->getParentPort();
shun-iwasawa 57ba4e
  if (port) {
shun-iwasawa 57ba4e
    int linkCount = port->getLinkCount();
shun-iwasawa 57ba4e
    for (int i = 0; i < linkCount; i++) {
shun-iwasawa 57ba4e
      SchematicLink *link = port->getLink(i);
shun-iwasawa 57ba4e
      if (!link) continue;
shun-iwasawa 57ba4e
      SchematicNode *otherNode = link->getOtherNode(node);
shun-iwasawa 57ba4e
      if (otherNode && !otherNode->isSelected()) {
shun-iwasawa 57ba4e
        QPointF targetPos =
shun-iwasawa 57ba4e
            otherNode->scenePos() + QPointF(otherNode->boundingRect().width() +
shun-iwasawa 57ba4e
                                                SchematicScene::snapHSpacing,
shun-iwasawa 57ba4e
                                            0);
shun-iwasawa 57ba4e
        addSnapTarget(targetPos, node->boundingRect(),
shun-iwasawa 57ba4e
                      link->getOtherPort(port)->getLinkEndPoint(),
shun-iwasawa 57ba4e
                      port->getLinkEndPoint() - node->scenePos());
shun-iwasawa 57ba4e
      }
shun-iwasawa 57ba4e
    }
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
}