Blob Blame Raw


#ifndef SCHEMATICVIEWER_H
#define SCHEMATICVIEWER_H

// TnzLib includes
#include "toonz/tstageobjectid.h"

// TnzBase includes
#include "tfx.h"

// Qt includes
#include <QGraphicsScene>
#include <QGraphicsView>

// STD includes
#include <set>

#undef DVAPI
#undef DVVAR
#ifdef TOONZQT_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

//====================================================

//    Forward declarations

class SchematicNode;
class SchematicPort;
class SchematicLink;
class ToonzScene;
class StageSchematicScene;
class FxSchematicScene;
class TXsheetHandle;
class TObjectHandle;
class TColumnHandle;
class TFxHandle;
class TSceneHandle;
class TFrameHandle;
class TFx;
class TLevel;
class TSelection;
class TApplication;
class QToolBar;
class QToolButton;
class QAction;

//====================================================

//==================================================================
//
// SchematicScene
//
//==================================================================

class DVAPI SchematicScene : public QGraphicsScene
{
	Q_OBJECT

public:
	SchematicScene(QWidget *parent);
	~SchematicScene();

	void clearAllItems();

	virtual QGraphicsItem *getCurrentNode() { return 0; }
	virtual void reorderScene() = 0;
	virtual void updateScene() = 0;

protected:
	QList<SchematicLink *> m_highlightedLinks;
	enum GridDimension { eLarge,
						 eSmall };

protected:
	//! Returns \b true if no nodes intersects \b rect.
	bool isAnEmptyZone(const QRectF &rect);
	//! Returns a vector containing all nodes which had their bounding rects conatined in \b node bounding
	//! rect enlarged of 10.
	QVector<SchematicNode *> getPlacedNode(SchematicNode *node);

	void showEvent(QShowEvent *se);
	void hideEvent(QHideEvent *se);

protected slots:

	virtual void onSelectionSwitched(TSelection *, TSelection *) {}
};

//==================================================================
//
// SchematicSceneViewer
//
//==================================================================

class DVAPI SchematicSceneViewer : public QGraphicsView
{
	Q_OBJECT

public:
	SchematicSceneViewer(QWidget *parent);
	~SchematicSceneViewer();

	void zoomQt(bool zoomin, bool resetZoom);

	QPointF getOldScenePos()
	{
		return m_oldScenePos;
	}

protected:
	void mousePressEvent(QMouseEvent *me);
	void mouseMoveEvent(QMouseEvent *me);
	void mouseReleaseEvent(QMouseEvent *me);
	void keyPressEvent(QKeyEvent *ke);
	void wheelEvent(QWheelEvent *me);
	void showEvent(QShowEvent *se);

protected slots:

	void fitScene();
	void centerOnCurrent();
	void reorderScene();
	void normalizeScene();

private:
	Qt::MouseButton m_buttonState;
	QPoint m_oldWinPos;
	QPointF m_oldScenePos;
	bool m_firstShowing;

private:
	void changeScale(const QPoint &winPos, qreal scaleFactor);
};

//==================================================================
//
// SchematicViewer
//
//==================================================================

class DVAPI SchematicViewer : public QWidget
{
	Q_OBJECT

public:
	SchematicViewer(QWidget *parent);
	~SchematicViewer();

	void setSchematicScene(SchematicScene *scene);
	void setApplication(TApplication *app);
	bool isStageSchematicViewed();
	void setStageSchematicViewed(bool isStageSchematic);

public slots:

	void updateSchematic();

signals:

	void showPreview(TFxP);
	void doCollapse(const QList<TFxP> &);
	void doCollapse(QList<TStageObjectId>);
	void doExplodeChild(const QList<TFxP> &);
	void doExplodeChild(QList<TStageObjectId>);
	void editObject();

protected slots:

	void onSceneChanged();
	void onSceneSwitched();
	void updateScenes();
	void changeNodeSize();

private:
	SchematicSceneViewer *m_viewer;
	StageSchematicScene *m_stageScene;
	FxSchematicScene *m_fxScene;

	TSceneHandle *m_sceneHandle;

	QToolBar *m_stageToolbar,
		*m_commonToolbar,
		*m_fxToolbar,
		*m_swapToolbar;

	QAction *m_fitSchematic,
		*m_centerOn,
		*m_reorder,
		*m_normalize,
		*m_nodeSize,
		*m_changeScene;

	bool m_fullSchematic,
		m_maximizedNode;

private:
	void createToolbars();
	void createActions();

	void setStageSchematic();
	void setFxSchematic();
};

#endif //SCHEMATICVIEWER_H