Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef STAGESCHEMATIC_H
Toshihiro Shimizu 890ddd
#define STAGESCHEMATIC_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "schematicviewer.h"
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
#include <qmap></qmap>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// forward declaration
Toshihiro Shimizu 890ddd
class TStageObject;
Toshihiro Shimizu 890ddd
class TXsheetHandle;
Toshihiro Shimizu 890ddd
class TObjectHandle;
Toshihiro Shimizu 890ddd
class TColumnHandle;
Toshihiro Shimizu 890ddd
class TSceneHandle;
Toshihiro Shimizu 890ddd
class TFrameHandle;
Toshihiro Shimizu 890ddd
class TXsheet;
Toshihiro Shimizu 890ddd
class StageSchematicNode;
Toshihiro Shimizu 890ddd
class StageSchematicSplineNode;
Toshihiro Shimizu 890ddd
class TStageObjectSpline;
Toshihiro Shimizu 890ddd
class StageObjectSelection;
Toshihiro Shimizu 890ddd
class SchematicLink;
Toshihiro Shimizu 890ddd
class StageSchematicGroupNode;
Toshihiro Shimizu 890ddd
class StageSchematicGroupEditor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// TreeStageNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//! Provide a structure representing a node af a tree.
Shinya Kitaoka 120a6e
//! This class mantains information about a node of the stage schematic and its
Shinya Kitaoka 120a6e
//! children.
Toshihiro Shimizu 890ddd
//! The tree is generated using the TStageObjectTree.
Toshihiro Shimizu 890ddd
//! The generated tree is used to oreder stage schematic nodes in the window.
Shinya Kitaoka 120a6e
class TreeStageNode {
Shinya Kitaoka 120a6e
  //! The node to replace in the window
Shinya Kitaoka 120a6e
  StageSchematicNode *m_node;
Shinya Kitaoka 120a6e
  //! The childre of the node
Shinya Kitaoka 120a6e
  std::vector<treestagenode *=""> m_cildren;</treestagenode>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TreeStageNode(StageSchematicNode *node) : m_node(node) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ~TreeStageNode() {
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = 0; i < (int)m_cildren.size(); i++) {
Shinya Kitaoka 120a6e
      delete m_cildren[i];
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  //--------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setSchematicNode(StageSchematicNode *node) { m_node = node; }
Shinya Kitaoka 120a6e
  void addChild(TreeStageNode *child) { m_cildren.push_back(child); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  StageSchematicNode *getNode() { return m_node; }
Shinya Kitaoka 120a6e
  int getChildrenCount() { return m_cildren.size(); }
Shinya Kitaoka 120a6e
  TreeStageNode *getChildTreeNode(int i) { return m_cildren[i]; }
Shinya Kitaoka 120a6e
  //! Sort the children container.
Shinya Kitaoka 120a6e
  //! The sorting follows this rules:\n
Shinya Kitaoka 120a6e
  //! \li TableNode < CameraNode < PegbarNode < ColumnNode
Shinya Kitaoka 120a6e
  //! \li if two nodes are of the same type, they are odered using indexes
Shinya Kitaoka 120a6e
  void sortChildren(int startIndex, int lastIndex);
Shinya Kitaoka 120a6e
  void reverseChildren() { std::reverse(m_cildren.begin(), m_cildren.end()); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// StageSchematic
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! It is the implementation of the SchematicScene representig the
Shinya Kitaoka 120a6e
//! QGraphicsScene for the Stage Schematic.
Shinya Kitaoka 120a6e
//! All StageSchematicNode,  StageSchematicSplineNode and link are pleced and
Shinya Kitaoka 120a6e
//! handled in this scene.
Toshihiro Shimizu 890ddd
//! The scene mantains two mapping:
Shinya Kitaoka 120a6e
//! one for StageSchematicNode and one for StageSchematicSplineNode. These
Shinya Kitaoka 120a6e
//! mapping can be used to retrieve
Toshihiro Shimizu 890ddd
//! nodes and spline.\n
Toshihiro Shimizu 890ddd
//! To regenearte the scene use the updateScene().\n
Toshihiro Shimizu 890ddd
//! To oreder nodes in the scene use the reorderScene().
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class StageSchematicScene final : public SchematicScene {
Shinya Kitaoka 120a6e
  Q_OBJECT
Shinya Kitaoka 120a6e
  TXsheetHandle *m_xshHandle;
Shinya Kitaoka 120a6e
  TObjectHandle *m_objHandle;
Shinya Kitaoka 120a6e
  TColumnHandle *m_colHandle;
Shinya Kitaoka 120a6e
  TSceneHandle *m_sceneHandle;
Shinya Kitaoka 120a6e
  TFrameHandle *m_frameHandle;
Shinya Kitaoka 120a6e
  TPointD m_nextNodePos;
Shinya Kitaoka 120a6e
  TPointD m_firstPos;
Shinya Kitaoka 120a6e
  QMap<tstageobjectid, *="" stageschematicnode=""> m_nodeTable;</tstageobjectid,>
Shinya Kitaoka 120a6e
  QMap<int, *="" stageschematicgroupnode=""> m_GroupTable;</int,>
Shinya Kitaoka 120a6e
  QMap<int, *="" stageschematicgroupeditor=""> m_groupEditorTable;</int,>
Shinya Kitaoka 120a6e
  QMap<tstageobjectspline *="" *,="" stageschematicsplinenode=""> m_splineTable;</tstageobjectspline>
Shinya Kitaoka 120a6e
  StageObjectSelection *m_selection;
Shinya Kitaoka 120a6e
  int m_gridDimension;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMap<tstageobjectid, *="" qlist<stageschematicnode="">> m_nodesToPlace;</tstageobjectid,>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool m_showLetterOnPortFlag;
shun_iwasawa 22eaa4
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  StageSchematicScene(QWidget *parent);
Shinya Kitaoka 120a6e
  ~StageSchematicScene();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Clear all item an regenerate the Stage Schematic graph.
Shinya Kitaoka 473e70
  void updateScene() override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Reurns the current node.
Shinya Kitaoka 473e70
  QGraphicsItem *getCurrentNode() override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Replace all nodes in the scene.
Shinya Kitaoka 473e70
  void reorderScene() override;
Shinya Kitaoka 120a6e
  TXsheet *getXsheet();
Shinya Kitaoka 120a6e
  TXsheetHandle *getXsheetHandle() { return m_xshHandle; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setXsheetHandle(TXsheetHandle *xshHandle);
Shinya Kitaoka 120a6e
  void setObjectHandle(TObjectHandle *objHandle);
Shinya Kitaoka 120a6e
  void setColumnHandle(TColumnHandle *colHandle);
Shinya Kitaoka 120a6e
  void setFxHandle(TFxHandle *fxHandle);
Shinya Kitaoka 120a6e
  void setSceneHandle(TSceneHandle *sceneHandle) {
Shinya Kitaoka 120a6e
    m_sceneHandle = sceneHandle;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  void setFrameHandle(TFrameHandle *frameHandle) {
Shinya Kitaoka 120a6e
    m_frameHandle = frameHandle;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TStageObjectId getCurrentObject();
Shinya Kitaoka 120a6e
  TFrameHandle *getFrameHandle() { return m_frameHandle; }
Shinya Kitaoka 120a6e
  TColumnHandle *getColumnHandle() { return m_colHandle; }
Shinya Kitaoka 120a6e
  void updateNestedGroupEditors(StageSchematicNode *node,
Shinya Kitaoka 120a6e
                                const QPointF &newPos);
Shinya Kitaoka 120a6e
  void resizeNodes(bool maximizedNode);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isShowLetterOnPortFlagEnabled() { return m_showLetterOnPortFlag; }
shun_iwasawa 22eaa4
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  StageSchematicNode *addStageSchematicNode(TStageObject *pegbar);
Shinya Kitaoka 120a6e
  StageSchematicGroupNode *addStageGroupNode(QList<tstageobject *=""> objs);</tstageobject>
Shinya Kitaoka 120a6e
  StageSchematicSplineNode *addSchematicSplineNode(TStageObjectSpline *spline);
Shinya Kitaoka 120a6e
  StageSchematicGroupEditor *addEditedGroupedStageSchematicNode(
Shinya Kitaoka 120a6e
      int groupId, const QList<schematicnode *=""> &groupedObjs);</schematicnode>
Shinya Kitaoka 120a6e
  StageSchematicNode *createStageSchematicNode(StageSchematicScene *scene,
Shinya Kitaoka 120a6e
                                               TStageObject *pegbar);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Places all nodes in the window
Shinya Kitaoka 120a6e
  void placeNodes();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Search nodes in the TStageObjectTree that are roots of a tree.
Shinya Kitaoka 120a6e
  //! Roots are placed in the container \b roots
Shinya Kitaoka 120a6e
  void findRoots(std::vector<treestagenode *=""> &roots);</treestagenode>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Build the tree starting from \b treenode.
Shinya Kitaoka 120a6e
  //! The tree is build recursively on each children of \b treeNode.
Shinya Kitaoka 120a6e
  void makeTree(TreeStageNode *treeNode);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Give the right position to the \b treeNode children.
Shinya Kitaoka 120a6e
  //! All nodes of the stage schematic are replaced recursively on each children
Shinya Kitaoka 120a6e
  //! starting from a root.
Shinya Kitaoka 120a6e
  //! \b xPos and \b yPos are update from the method.
Shinya Kitaoka 120a6e
  //! \sa findRoots(vector<treenode*> &roots)</treenode*>
Shinya Kitaoka 120a6e
  void placeChildren(TreeStageNode *treeNode, double &xPos, double &yPos,
Shinya Kitaoka 120a6e
                     bool isCameraTree = false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Place a StageSchematicNode in the window.
Shinya Kitaoka 120a6e
  //! It is usually used to place new nodes that have not position.
Shinya Kitaoka 120a6e
  void placeNode(StageSchematicNode *node);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Place a StageSchematicSplineNode in the window.
Shinya Kitaoka 120a6e
  //! It is usually used to place new splines that have not position.
Shinya Kitaoka 120a6e
  void placeSplineNode(StageSchematicSplineNode *splineNode);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  SchematicNode *getNodeFromPosition(const QPointF &pos);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void updatePosition(StageSchematicNode *node, const TPointD &pos);
Shinya Kitaoka 120a6e
  void highlightLinks(StageSchematicNode *node, bool value);
Shinya Kitaoka 120a6e
  void updateEditedGroups(const QMap<int, *="" qlist<schematicnode="">> &editedGroup);</int,>
Shinya Kitaoka 120a6e
  void updatePositionOnResize(TStageObject *obj, bool maximizedNode);
Shinya Kitaoka 120a6e
  void updateSplinePositionOnResize(TStageObjectSpline *spl,
Shinya Kitaoka 120a6e
                                    bool maximizedNode);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 473e70
  void contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) override;
Shinya Kitaoka 473e70
  void mousePressEvent(QGraphicsSceneMouseEvent *me) override;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
signals:
Shinya Kitaoka 120a6e
  void editObject();
Shinya Kitaoka 120a6e
  void doCollapse(QList<tstageobjectid>);</tstageobjectid>
Shinya Kitaoka 120a6e
  void doExplodeChild(QList<tstageobjectid>);</tstageobjectid>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected slots:
Shinya Kitaoka 473e70
  void onSelectionSwitched(TSelection *oldSel, TSelection *newSel) override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void onPegbarAdded();
Shinya Kitaoka 120a6e
  void onSplineAdded();
Shinya Kitaoka 120a6e
  void onCameraAdded();
Shinya Kitaoka 120a6e
  void onResetCenter();
Shinya Kitaoka 120a6e
  void onCameraActivate();
Shinya Kitaoka 120a6e
  void onRemoveSpline();
Shinya Kitaoka 120a6e
  void onSaveSpline();
Shinya Kitaoka 120a6e
  void onLoadSpline();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void onPathToggled(int state);
Shinya Kitaoka 120a6e
  void onCpToggled(bool toggled);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void onXsheetChanged();
Shinya Kitaoka 120a6e
  void onSceneChanged();
Shinya Kitaoka 120a6e
  void onCurrentObjectChanged(const TStageObjectId &, bool);
Shinya Kitaoka 120a6e
  void onCurrentColumnChanged(int);
Shinya Kitaoka 120a6e
  void onSelectionChanged();
Shinya Kitaoka 120a6e
  void onCollapse(QList<tstageobjectid>);</tstageobjectid>
Shinya Kitaoka 120a6e
  void onOpenSubxsheet();
Shinya Kitaoka 120a6e
  void onEditGroup();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void onSwitchPortModeToggled(bool withLetter);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // STAGESCHEMATIC_H