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