Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/fxschematicnode.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/fxschematicscene.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/icongenerator.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/fxselection.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/fxiconmanager.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnfx.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnfxset.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshchildlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/fxdag.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectid.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobject.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcell.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/fxcommand.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjectcmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelcolumn.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshzeraryfxcolumn.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcolumn.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshsimplelevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshleveltypes.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tw/stringtable.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tfx.h"
Toshihiro Shimizu 890ddd
#include "tfxattributes.h"
Toshihiro Shimizu 890ddd
#include "tmacrofx.h"
Toshihiro Shimizu 890ddd
#include "trasterfx.h"
Toshihiro Shimizu 890ddd
#include "tpassivecachemanager.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tconst.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <QAction>
Toshihiro Shimizu 890ddd
#include <QApplication>
Toshihiro Shimizu 890ddd
#include <QMenu>
Toshihiro Shimizu 890ddd
#include <QGraphicsSceneMouseEvent>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//********************************************************************************
Toshihiro Shimizu 890ddd
//    Local namespace
Toshihiro Shimizu 890ddd
//********************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
bool isAInnerMacroFx(TFx *fx, TXsheet *xsh)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!fx)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	TColumnFx *cfx = dynamic_cast<TColumnFx *>(fx);
Toshihiro Shimizu 890ddd
	TXsheetFx *xfx = dynamic_cast<TXsheetFx *>(fx);
Toshihiro Shimizu 890ddd
	TOutputFx *ofx = dynamic_cast<TOutputFx *>(fx);
Toshihiro Shimizu 890ddd
	TFxSet *internalFxs = xsh->getFxDag()->getInternalFxs();
Toshihiro Shimizu 890ddd
	return !cfx && !xfx && !ofx && !internalFxs->containsFx(fx);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawCachedFxFlap(QPainter *painter, const QPointF &pos)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	painter->save();
Toshihiro Shimizu 890ddd
	painter->setPen(QColor(0, 0, 0, 255));
Toshihiro Shimizu 890ddd
	painter->setBrush(QColor(120, 120, 120, 255));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPainterPath path(pos);
Toshihiro Shimizu 890ddd
	path.lineTo(pos.x(), pos.y() - 10.0);
Toshihiro Shimizu 890ddd
	path.lineTo(pos.x() - 10.0, pos.y());
Toshihiro Shimizu 890ddd
	path.lineTo(pos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->drawPath(path);
Toshihiro Shimizu 890ddd
	painter->setBrush(QColor(255, 255, 255, 255));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QPointF newPos = pos + QPointF(-10.0, -10.0);
Toshihiro Shimizu 890ddd
	path = QPainterPath(newPos);
Toshihiro Shimizu 890ddd
	path.lineTo(newPos.x(), newPos.y() + 10.0);
Toshihiro Shimizu 890ddd
	path.lineTo(newPos.x() + 10.0, newPos.y());
Toshihiro Shimizu 890ddd
	path.lineTo(newPos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->drawPath(path);
Toshihiro Shimizu 890ddd
	painter->restore();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int getIndex(TFxPort *port, const vector<TFxPort *> &ports)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	vector<TFxPort *>::const_iterator it = std::find(ports.begin(), ports.end(), port);
Toshihiro Shimizu 890ddd
	if (it == ports.end())
Toshihiro Shimizu 890ddd
		return -1;
Toshihiro Shimizu 890ddd
	return std::distance(ports.begin(), it);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int getInputPortIndex(TFxPort *port, TFx *fx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int count = fx->getInputPortCount();
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < count; i++) {
Toshihiro Shimizu 890ddd
		if (port == fx->getInputPort(i))
Toshihiro Shimizu 890ddd
			return i;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return -1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
} // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxColumnPainter
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxColumnPainter::FxColumnPainter(FxSchematicColumnNode *parent, double width, double height, const QString &name)
Toshihiro Shimizu 890ddd
	: QGraphicsItem(parent), m_parent(parent), m_name(name), m_width(width), m_height(height)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsMovable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsFocusable, false);
Toshihiro Shimizu 890ddd
	connect(IconGenerator::instance(), SIGNAL(iconGenerated()), this, SLOT(onIconGenerated()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TLevelColumnFx *lcfx = dynamic_cast<TLevelColumnFx *>(parent->getFx());
Toshihiro Shimizu 890ddd
	if (lcfx) {
Toshihiro Shimizu 890ddd
		int index = lcfx->getColumnIndex();
Toshihiro Shimizu 890ddd
		QString id = QString("Col");
Toshihiro Shimizu 890ddd
		setToolTip(id + QString::number(index + 1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
		if (!fxScene)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
		int r0, r1;
Toshihiro Shimizu 890ddd
		xsh->getCellRange(index, r0, r1);
Toshihiro Shimizu 890ddd
		if (r0 > r1)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		TXshCell firstCell = xsh->getCell(r0, index);
Toshihiro Shimizu 890ddd
		m_type = firstCell.m_level->getType();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxColumnPainter::~FxColumnPainter()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxColumnPainter::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_parent->isOpened() && m_parent->isLargeScaled())
Toshihiro Shimizu 890ddd
		return QRectF(-5, -54, m_width + 10, m_height + 59);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxColumnPainter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int levelType;
Toshihiro Shimizu 890ddd
	QString levelName;
Toshihiro Shimizu 890ddd
	m_parent->getLevelTypeAndName(levelType, levelName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QLinearGradient linearGrad = getGradientByLevelType(levelType);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_parent->isLargeScaled())
Toshihiro Shimizu 890ddd
		linearGrad.setFinalStop(0, 50);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setBrush(QBrush(linearGrad));
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
	painter->drawRect(0, 0, m_width, m_height);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_parent->isOpened() && m_parent->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		//Draw the pixmap
Toshihiro Shimizu 890ddd
		painter->setBrush(Qt::NoBrush);
Toshihiro Shimizu 890ddd
		painter->setPen(QColor(0, 0, 0, 255));
Toshihiro Shimizu 890ddd
		QPixmap pixmap = scalePixmapKeepingAspectRatio(m_parent->getPixmap(), QSize(m_width, 49), Qt::transparent);
Toshihiro Shimizu 890ddd
		if (!pixmap.isNull()) {
Toshihiro Shimizu 890ddd
			painter->drawPixmap(QPointF(0, -pixmap.height()), pixmap);
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			painter->setBrush(QColor(255, 255, 255, 255));
Toshihiro Shimizu 890ddd
			painter->drawRect(0, -pixmap.height(), m_width, pixmap.height());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::white);
Toshihiro Shimizu 890ddd
	painter->setBrush(Qt::NoBrush);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QRectF columnNameRect;
Toshihiro Shimizu 890ddd
	QRectF levelNameRect;
Toshihiro Shimizu 890ddd
	if (m_parent->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		columnNameRect = QRect(18, 2, 54, 14);
Toshihiro Shimizu 890ddd
		levelNameRect = QRectF(18, 16, 54, 14);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		columnNameRect = QRect(4, 2, 78, 22);
Toshihiro Shimizu 890ddd
		levelNameRect = QRectF(4, 26, 78, 22);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QFont fnt = painter->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		painter->setFont(fnt);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// column name
Toshihiro Shimizu 890ddd
	if (!m_parent->isNameEditing()) {
Toshihiro Shimizu 890ddd
		FxSchematicScene *sceneFx = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
		if (!sceneFx)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//if this is a current object
Toshihiro Shimizu 890ddd
		if (sceneFx->getCurrentFx() == m_parent->getFx())
Toshihiro Shimizu 890ddd
			painter->setPen(Qt::yellow);
Toshihiro Shimizu 890ddd
		QString elidedName = elideText(m_name, painter->font(), columnNameRect.width());
Toshihiro Shimizu 890ddd
		painter->drawText(columnNameRect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// level name
Toshihiro Shimizu 890ddd
	QString elidedName = elideText(levelName, painter->font(), levelNameRect.width());
Toshihiro Shimizu 890ddd
	painter->drawText(levelNameRect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QLinearGradient FxColumnPainter::getGradientByLevelType(int type)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QColor col1, col2, col3, col4, col5;
Toshihiro Shimizu 890ddd
	int alpha = 200;
Toshihiro Shimizu 890ddd
	switch (type) {
Toshihiro Shimizu 890ddd
	case TZI_XSHLEVEL:
Toshihiro Shimizu 890ddd
	case OVL_XSHLEVEL:
Toshihiro Shimizu 890ddd
		col1 = QColor(209, 232, 234, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(121, 171, 181, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(98, 143, 165, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(33, 90, 118, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(122, 172, 173, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case PLI_XSHLEVEL:
Toshihiro Shimizu 890ddd
		col1 = QColor(236, 226, 182, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(199, 187, 95, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(180, 180, 67, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(130, 125, 15, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(147, 150, 28, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TZP_XSHLEVEL:
Toshihiro Shimizu 890ddd
		col1 = QColor(196, 245, 196, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(111, 192, 105, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(63, 146, 99, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(32, 113, 86, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(117, 187, 166, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case ZERARYFX_XSHLEVEL:
Toshihiro Shimizu 890ddd
		col1 = QColor(232, 245, 196, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(130, 129, 93, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(113, 115, 81, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(55, 59, 25, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(144, 154, 111, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case CHILD_XSHLEVEL:
Toshihiro Shimizu 890ddd
		col1 = QColor(247, 208, 241, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(214, 154, 219, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(170, 123, 169, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(92, 52, 98, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(132, 111, 154, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case MESH_XSHLEVEL:
Toshihiro Shimizu 890ddd
		col1 = QColor(210, 140, 255, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(200, 130, 255, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(150, 80, 180, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(150, 80, 180, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(180, 120, 220, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case UNKNOWN_XSHLEVEL:
Toshihiro Shimizu 890ddd
	case NO_XSHLEVEL:
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		col1 = QColor(227, 227, 227, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(174, 174, 174, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(123, 123, 123, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(61, 61, 61, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(127, 138, 137, alpha);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QLinearGradient linearGrad(QPointF(0, 0), QPointF(0, 32));
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0, col1);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.08, col2);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.20, col3);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.23, col4);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.9, col4);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(1, col5);
Toshihiro Shimizu 890ddd
	return linearGrad;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
void FxColumnPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	QMenu menu(fxScene->views()[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *copy = CommandManager::instance()->getAction("MI_Copy");
Toshihiro Shimizu 890ddd
	QAction *cut = CommandManager::instance()->getAction("MI_Cut");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool enebleInsertAction = !m_parent->getFx()->getAttributes()->isGrouped() ||
Toshihiro Shimizu 890ddd
							  m_parent->getFx()->getAttributes()->isGroupEditing();
Toshihiro Shimizu 890ddd
	if (enebleInsertAction) {
Toshihiro Shimizu 890ddd
		//repeat the latest action
Toshihiro Shimizu 890ddd
		if (cme->modifiers() & Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
			menu.addAction(fxScene->getAgainAction(AddFxContextMenu::Add | AddFxContextMenu::Insert));
Toshihiro Shimizu 890ddd
			if (!menu.actions().isEmpty()) {
Toshihiro Shimizu 890ddd
				menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QMenu *insertMenu = fxScene->getInsertFxMenu();
Toshihiro Shimizu 890ddd
	fxScene->initCursorScenePos();
Toshihiro Shimizu 890ddd
	QMenu *addMenu = fxScene->getAddFxMenu();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *disconnectFromXSheet = new QAction(tr("&Disconnect from Xsheet"), &menu);
Toshihiro Shimizu 890ddd
	connect(disconnectFromXSheet, SIGNAL(triggered()), fxScene, SLOT(onDisconnectFromXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *connectToXSheet = new QAction(tr("&Connect to Xsheet"), &menu);
Toshihiro Shimizu 890ddd
	connect(connectToXSheet, SIGNAL(triggered()), fxScene, SLOT(onConnectToXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx");
Toshihiro Shimizu 890ddd
	QIcon addOutputFxIcon = createQIconOnOffPNG("output", false);
Toshihiro Shimizu 890ddd
	if (addOutputFx)
Toshihiro Shimizu 890ddd
		addOutputFx->setIcon(addOutputFxIcon);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *addPaste = new QAction(tr("&Paste Add"), &menu);
Toshihiro Shimizu 890ddd
	connect(addPaste, SIGNAL(triggered()), fxScene, SLOT(onAddPaste()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *preview = new QAction(tr("&Preview"), &menu);
Toshihiro Shimizu 890ddd
	connect(preview, SIGNAL(triggered()), fxScene, SLOT(onPreview()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool cacheEnabled = TPassiveCacheManager::instance()->cacheEnabled(m_parent->getFx());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *cacheFx = new QAction(cacheEnabled ? tr("&Uncache Fx") : tr("&Cache FX"), &menu);
Toshihiro Shimizu 890ddd
	if (cacheEnabled)
Toshihiro Shimizu 890ddd
		connect(cacheFx, SIGNAL(triggered()), fxScene, SLOT(onUncacheFx()));
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		connect(cacheFx, SIGNAL(triggered()), fxScene, SLOT(onCacheFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *collapse = CommandManager::instance()->getAction("MI_Collapse");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *openSubxsh = new QAction(tr("&Open Subxsheet"), &menu);
Toshihiro Shimizu 890ddd
	connect(openSubxsh, SIGNAL(triggered()), fxScene, SLOT(onOpenSubxsheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *explodeChild = CommandManager::instance()->getAction("MI_ExplodeChild");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *group = CommandManager::instance()->getAction("MI_Group");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	menu.addMenu(insertMenu);
Toshihiro Shimizu 890ddd
	menu.addMenu(addMenu);
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	if (!m_parent->getFx()->getAttributes()->isGrouped()) {
Toshihiro Shimizu 890ddd
		menu.addAction(copy);
Toshihiro Shimizu 890ddd
		menu.addAction(cut);
Toshihiro Shimizu 890ddd
		menu.addAction(addPaste);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	if (fxScene->getXsheet()->getFxDag()->getTerminalFxs()->containsFx(m_parent->getFx()))
Toshihiro Shimizu 890ddd
		menu.addAction(disconnectFromXSheet);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		menu.addAction(connectToXSheet);
Toshihiro Shimizu 890ddd
	if (!m_parent->getFx()->getAttributes()->isGrouped())
Toshihiro Shimizu 890ddd
		menu.addAction(addOutputFx);
Toshihiro Shimizu 890ddd
	menu.addAction(preview);
Toshihiro Shimizu 890ddd
	menu.addAction(cacheFx);
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	if (enebleInsertAction) {
Toshihiro Shimizu 890ddd
		menu.addAction(collapse);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFrameHandle *frameHandle = fxScene->getFrameHandle();
Toshihiro Shimizu 890ddd
	if (frameHandle->getFrameType() == TFrameHandle::SceneFrame) {
Toshihiro Shimizu 890ddd
		TLevelColumnFx *colFx = dynamic_cast<TLevelColumnFx *>(m_parent->getFx());
Toshihiro Shimizu 890ddd
		assert(colFx);
Toshihiro Shimizu 890ddd
		int col = colFx->getColumnIndex();
Toshihiro Shimizu 890ddd
		int fr = frameHandle->getFrame();
Toshihiro Shimizu 890ddd
		TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
		TXshCell cell = xsh->getCell(fr, col);
Toshihiro Shimizu 890ddd
		if (dynamic_cast<TXshChildLevel *>(cell.m_level.getPointer())) {
Toshihiro Shimizu 890ddd
			menu.addAction(openSubxsh);
Toshihiro Shimizu 890ddd
			menu.addAction(explodeChild);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	menu.addAction(group);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_type == OVL_XSHLEVEL || m_type == TZP_XSHLEVEL || m_type == PLI_XSHLEVEL) {
Toshihiro Shimizu 890ddd
		QAction *viewFileCommand = CommandManager::instance()->getAction("MI_ViewFile");
Toshihiro Shimizu 890ddd
		menu.addSeparator();
Toshihiro Shimizu 890ddd
		menu.addAction(viewFileCommand);
Toshihiro Shimizu 890ddd
		QAction *levelSettings = CommandManager::instance()->getAction("MI_LevelSettings");
Toshihiro Shimizu 890ddd
		menu.addAction(levelSettings);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxColumnPainter::onIconGenerated()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_type != OVL_XSHLEVEL)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TLevelColumnFx *lcfx = dynamic_cast<TLevelColumnFx *>(m_parent->getFx());
Toshihiro Shimizu 890ddd
	if (lcfx) {
Toshihiro Shimizu 890ddd
		int index = lcfx->getColumnIndex();
Toshihiro Shimizu 890ddd
		QString id = QString("Col");
Toshihiro Shimizu 890ddd
		setToolTip(id + QString::number(index + 1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
		if (!fxScene)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
		int r0, r1;
Toshihiro Shimizu 890ddd
		xsh->getCellRange(index, r0, r1);
Toshihiro Shimizu 890ddd
		if (r0 > r1)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		TXshCell firstCell = xsh->getCell(r0, index);
Toshihiro Shimizu 890ddd
		int type = firstCell.m_level->getType();
Toshihiro Shimizu 890ddd
		if (m_type != type) {
Toshihiro Shimizu 890ddd
			m_type = type;
Toshihiro Shimizu 890ddd
			update();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxPalettePainter
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxPalettePainter::FxPalettePainter(FxSchematicPaletteNode *parent, double width, double height, const QString &name)
Toshihiro Shimizu 890ddd
	: QGraphicsItem(parent), m_parent(parent), m_name(name), m_width(width), m_height(height)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsMovable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsFocusable, false);
Toshihiro Shimizu 890ddd
	TLevelColumnFx *lcfx = dynamic_cast<TLevelColumnFx *>(parent->getFx());
Toshihiro Shimizu 890ddd
	if (lcfx) {
Toshihiro Shimizu 890ddd
		int index = lcfx->getColumnIndex() + 1;
Toshihiro Shimizu 890ddd
		QString id = QString("Col");
Toshihiro Shimizu 890ddd
		setToolTip(id + QString::number(index));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxPalettePainter::~FxPalettePainter()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxPalettePainter::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxPalettePainter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QPixmap palettePm = QPixmap(":Resources/schematic_palette.png");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int alpha = 200;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QLinearGradient paletteLinearGrad(QPointF(0, 0), QPointF(0, (m_parent->isLargeScaled()) ? 32 : 50));
Toshihiro Shimizu 890ddd
	paletteLinearGrad.setColorAt(0, QColor(42, 171, 154, alpha));
Toshihiro Shimizu 890ddd
	paletteLinearGrad.setColorAt(0.2, QColor(15, 62, 56, alpha));
Toshihiro Shimizu 890ddd
	paletteLinearGrad.setColorAt(0.9, QColor(15, 62, 56, alpha));
Toshihiro Shimizu 890ddd
	paletteLinearGrad.setColorAt(1, QColor(33, 95, 90, alpha));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setBrush(QBrush(paletteLinearGrad));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_parent->isLargeScaled())
Toshihiro Shimizu 890ddd
		painter->drawRoundRect(QRectF(0, 0, m_width, m_height), 35, 99);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		painter->drawRoundRect(QRectF(0, 0, m_width, m_height), 10, 30);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// draw icon
Toshihiro Shimizu 890ddd
	QRect paletteRect;
Toshihiro Shimizu 890ddd
	QRectF idRect;
Toshihiro Shimizu 890ddd
	QRectF palNameRect;
Toshihiro Shimizu 890ddd
	if (m_parent->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		paletteRect = QRect(-3, -1, 20, 16);
Toshihiro Shimizu 890ddd
		idRect = QRectF(18, 2, 54, 14);
Toshihiro Shimizu 890ddd
		palNameRect = QRectF(18, 16, 54, 14);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		paletteRect = QRect(4, -6, 35, 28);
Toshihiro Shimizu 890ddd
		idRect = QRectF(25, 2, 49, 22);
Toshihiro Shimizu 890ddd
		palNameRect = QRectF(4, 26, 78, 22);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QFont fnt = painter->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		painter->setFont(fnt);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->drawPixmap(paletteRect, palettePm);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! draw the name only if it is not editing
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::white);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_parent->isNameEditing()) {
Toshihiro Shimizu 890ddd
		FxSchematicScene *sceneFx = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
		if (!sceneFx)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		if (sceneFx->getCurrentFx() == m_parent->getFx())
Toshihiro Shimizu 890ddd
			painter->setPen(Qt::yellow);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int w = idRect.width();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_parent->isLargeScaled()) {
Toshihiro Shimizu 890ddd
			QString elidedName = elideText(m_name, painter->font(), w);
Toshihiro Shimizu 890ddd
			painter->drawText(idRect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			painter->drawText(idRect, Qt::AlignRight | Qt::AlignVCenter, QString::number(m_parent->getColumnIndex() + 1));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//level name
Toshihiro Shimizu 890ddd
	QString paletteName = m_parent->getPaletteName();
Toshihiro Shimizu 890ddd
	QString elidedName = elideText(paletteName, painter->font(), palNameRect.width());
Toshihiro Shimizu 890ddd
	painter->drawText(palNameRect, Qt::AlignLeft | Qt::AlignVCenter, elidedName);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxPalettePainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	QMenu menu(fxScene->views()[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *disconnectFromXSheet = new QAction(tr("&Disconnect from Xsheet"), &menu);
Toshihiro Shimizu 890ddd
	connect(disconnectFromXSheet, SIGNAL(triggered()), fxScene, SLOT(onDisconnectFromXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *connectToXSheet = new QAction(tr("&Connect to Xsheet"), &menu);
Toshihiro Shimizu 890ddd
	connect(connectToXSheet, SIGNAL(triggered()), fxScene, SLOT(onConnectToXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *preview = new QAction(tr("&Preview"), &menu);
Toshihiro Shimizu 890ddd
	connect(preview, SIGNAL(triggered()), fxScene, SLOT(onPreview()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *collapse = CommandManager::instance()->getAction("MI_Collapse");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *group = CommandManager::instance()->getAction("MI_Group");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool enebleInsertAction = !m_parent->getFx()->getAttributes()->isGrouped() ||
Toshihiro Shimizu 890ddd
							  m_parent->getFx()->getAttributes()->isGroupEditing();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (enebleInsertAction) {
Toshihiro Shimizu 890ddd
		if (fxScene->getXsheet()->getFxDag()->getTerminalFxs()->containsFx(m_parent->getFx()))
Toshihiro Shimizu 890ddd
			menu.addAction(disconnectFromXSheet);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			menu.addAction(connectToXSheet);
Toshihiro Shimizu 890ddd
		menu.addAction(preview);
Toshihiro Shimizu 890ddd
		menu.addSeparator();
Toshihiro Shimizu 890ddd
		menu.addAction(collapse);
Toshihiro Shimizu 890ddd
		menu.addSeparator();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	menu.addAction(group);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxPainter
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxPainter::FxPainter(FxSchematicNode *parent, double width, double height,
Toshihiro Shimizu 890ddd
					 const QString &name, eFxType type, string fxType)
Toshihiro Shimizu 890ddd
	: QGraphicsItem(parent), m_parent(parent), m_name(name), m_width(width), m_height(height), m_type(type), m_fxType(fxType)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsMovable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsFocusable, false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (m_type) {
Toshihiro Shimizu 890ddd
	case eNormalFx:
Toshihiro Shimizu 890ddd
	case eMacroFx:
Toshihiro Shimizu 890ddd
	case eNormalLayerBlendingFx:
Toshihiro Shimizu 890ddd
	case eNormalMatteFx:
Toshihiro Shimizu 890ddd
	case eNormalImageAdjustFx: {
Toshihiro Shimizu 890ddd
		m_label = QString::fromStdWString(TStringTable::translate(parent->getFx()->getFxType()));
Toshihiro Shimizu 890ddd
		setToolTip(QString::fromStdWString(parent->getFx()->getFxId()));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE eZeraryFx:
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TZeraryColumnFx *zfx = dynamic_cast<TZeraryColumnFx *>(parent->getFx());
Toshihiro Shimizu 890ddd
			if (zfx) {
Toshihiro Shimizu 890ddd
				TFx *zeraryFx = zfx->getZeraryFx();
Toshihiro Shimizu 890ddd
				if (zeraryFx) {
Toshihiro Shimizu 890ddd
					m_label = QString::fromStdWString(TStringTable::translate(zeraryFx->getFxType()));
Toshihiro Shimizu 890ddd
					setToolTip(QString::fromStdWString(zeraryFx->getFxId()));
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE eGroupedFx:
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			m_label = QString("Group ") + QString::number(parent->getFx()->getAttributes()->getGroupId());
Toshihiro Shimizu 890ddd
			setToolTip(m_label);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxPainter::~FxPainter()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxPainter::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxPainter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// if the scale is small, display with fx icons
Toshihiro Shimizu 890ddd
	if (!m_parent->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		paint_small(painter);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_type == eGroupedFx) {
Toshihiro Shimizu 890ddd
		painter->save();
Toshihiro Shimizu 890ddd
		QPen pen;
Toshihiro Shimizu 890ddd
		if (m_parent->isSelected()) {
Toshihiro Shimizu 890ddd
			painter->setBrush(QColor(0, 0, 0, 0));
Toshihiro Shimizu 890ddd
			pen.setColor(QColor(255, 255, 255, 255));
Toshihiro Shimizu 890ddd
			pen.setWidth(4.0);
Toshihiro Shimizu 890ddd
			pen.setJoinStyle(Qt::RoundJoin);
Toshihiro Shimizu 890ddd
			painter->setPen(pen);
Toshihiro Shimizu 890ddd
			painter->drawRect(-2, -2, m_width + 4, m_height + 4);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		painter->restore();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw base rect
Toshihiro Shimizu 890ddd
	QLinearGradient linearGrad = getGradientByLevelType(m_type);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setBrush(QBrush(linearGrad));
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
	painter->drawRect(0, 0, m_width, m_height);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw diagonal line for disabled fx
Toshihiro Shimizu 890ddd
	bool is_enabled = m_parent->isEnabled();
Toshihiro Shimizu 890ddd
	if (!is_enabled) {
Toshihiro Shimizu 890ddd
		painter->save();
Toshihiro Shimizu 890ddd
		painter->setPen(QColor(255, 0, 0, 255));
Toshihiro Shimizu 890ddd
		painter->drawLine(QPointF(0, m_height), QPointF(m_width, 0));
Toshihiro Shimizu 890ddd
		painter->drawLine(QPointF(0, 0), QPointF(m_width, m_height));
Toshihiro Shimizu 890ddd
		painter->restore();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QFont columnFont(painter->font());
Toshihiro Shimizu 890ddd
	columnFont.setPixelSize(columnFont.pixelSize() - 1);
Toshihiro Shimizu 890ddd
	painter->setFont(columnFont);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// draw fxId in the bottom part
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::white);
Toshihiro Shimizu 890ddd
	if (m_type != eGroupedFx) {
Toshihiro Shimizu 890ddd
		// for zerary fx
Toshihiro Shimizu 890ddd
		QString label;
Toshihiro Shimizu 890ddd
		if (m_type == eZeraryFx) {
Toshihiro Shimizu 890ddd
			TZeraryColumnFx *zcFx = dynamic_cast<TZeraryColumnFx *>(m_parent->getFx());
Toshihiro Shimizu 890ddd
			if (!zcFx)
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
			label = QString::fromStdWString(zcFx->getZeraryFx()->getFxId());
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			label = QString::fromStdWString(m_parent->getFx()->getFxId());
Toshihiro Shimizu 890ddd
		label = elideText(label, painter->font(), m_width - 21);
Toshihiro Shimizu 890ddd
		painter->drawText(QRectF(3, 16, m_width - 21, 14), Qt::AlignLeft | Qt::AlignVCenter, label);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// draw user-defined fx name in the upper part
Toshihiro Shimizu 890ddd
	//! draw the name only if it is not editing
Toshihiro Shimizu 890ddd
	if (!m_parent->isNameEditing()) {
Toshihiro Shimizu 890ddd
		FxSchematicScene *sceneFx = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
		if (!sceneFx)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		if (sceneFx->getCurrentFx() == m_parent->getFx())
Toshihiro Shimizu 890ddd
			painter->setPen(Qt::yellow);
Toshihiro Shimizu 890ddd
		QRectF rect(3, 2, m_width - 21, 14);
Toshihiro Shimizu 890ddd
		int w = rect.width();
Toshihiro Shimizu 890ddd
		QString elidedName = elideText(m_name, painter->font(), w);
Toshihiro Shimizu 890ddd
		painter->drawText(rect, elidedName);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
/*! return the gradient pattern according to the type of Fx
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
QLinearGradient FxPainter::getGradientByLevelType(eFxType type)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QColor col1, col2, col3, col4, col5;
Toshihiro Shimizu 890ddd
	int alpha = 200;
Toshihiro Shimizu 890ddd
	switch (type) {
Toshihiro Shimizu 890ddd
	case eNormalFx:
Toshihiro Shimizu 890ddd
		col1 = QColor(129, 162, 188, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(109, 138, 166, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(94, 120, 150, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(94, 120, 150, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(52, 63, 104, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eZeraryFx:
Toshihiro Shimizu 890ddd
		col1 = QColor(232, 245, 196, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(130, 129, 93, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(113, 115, 81, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(55, 59, 25, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(144, 154, 111, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eMacroFx:
Toshihiro Shimizu 890ddd
		col1 = QColor(165, 117, 161, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(146, 99, 139, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(132, 86, 123, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(132, 86, 123, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(89, 46, 92, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eGroupedFx:
Toshihiro Shimizu 890ddd
		col1 = QColor(104, 191, 211, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(91, 168, 192, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(76, 148, 177, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(76, 148, 177, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(43, 91, 139, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eNormalImageAdjustFx:
Toshihiro Shimizu 890ddd
		col1 = QColor(97, 95, 143, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(95, 92, 140, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(88, 84, 131, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(88, 84, 131, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(69, 56, 100, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eNormalLayerBlendingFx:
Toshihiro Shimizu 890ddd
		col1 = QColor(75, 127, 133, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(65, 112, 122, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(60, 108, 118, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(60, 108, 118, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(38, 71, 91, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case eNormalMatteFx:
Toshihiro Shimizu 890ddd
		col1 = QColor(195, 117, 116, alpha);
Toshihiro Shimizu 890ddd
		col2 = QColor(188, 111, 109, alpha);
Toshihiro Shimizu 890ddd
		col3 = QColor(181, 103, 103, alpha);
Toshihiro Shimizu 890ddd
		col4 = QColor(181, 103, 103, alpha);
Toshihiro Shimizu 890ddd
		col5 = QColor(161, 86, 84, alpha);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QLinearGradient linearGrad(QPointF(0, 0), QPointF(0, 32));
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0, col1);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.08, col2);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.20, col3);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.23, col4);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(0.9, col4);
Toshihiro Shimizu 890ddd
	linearGrad.setColorAt(1, col5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (type == eGroupedFx) {
Toshihiro Shimizu 890ddd
		linearGrad.setColorAt(0.6, col4);
Toshihiro Shimizu 890ddd
		linearGrad.setColorAt(0.699, col5);
Toshihiro Shimizu 890ddd
		linearGrad.setColorAt(0.7, col4);
Toshihiro Shimizu 890ddd
		linearGrad.setColorAt(0.799, col5);
Toshihiro Shimizu 890ddd
		linearGrad.setColorAt(0.8, col4);
Toshihiro Shimizu 890ddd
		linearGrad.setColorAt(0.899, col5);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return linearGrad;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	QMenu menu(scene()->views()[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFx *fx = m_parent->getFx();
Toshihiro Shimizu 890ddd
	bool isInternalFx = fxScene->getXsheet()->getFxDag()->getInternalFxs()->containsFx(fx) || m_type == eGroupedFx;
Toshihiro Shimizu 890ddd
	bool enableGroupAction = m_parent->isA(eZeraryFx) || isInternalFx;
Toshihiro Shimizu 890ddd
	bool enableInsertAction = enableGroupAction && (fx->getAttributes()->isGroupEditing() || !fx->getAttributes()->isGrouped());
Toshihiro Shimizu 890ddd
	if (enableInsertAction) {
Toshihiro Shimizu 890ddd
		//repeat the last command
Toshihiro Shimizu 890ddd
		if (cme->modifiers() & Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
			int commands = (m_type != eGroupedFx) ? AddFxContextMenu::Add | AddFxContextMenu::Insert | AddFxContextMenu::Replace
Toshihiro Shimizu 890ddd
												  : AddFxContextMenu::Add | AddFxContextMenu::Insert;
Toshihiro Shimizu 890ddd
			menu.addAction(fxScene->getAgainAction(commands));
Toshihiro Shimizu 890ddd
			if (!menu.actions().isEmpty()) {
Toshihiro Shimizu 890ddd
				menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QMenu *insertMenu = fxScene->getInsertFxMenu();
Toshihiro Shimizu 890ddd
	QMenu *replacefxMenu = fxScene->getReplaceFxMenu();
Toshihiro Shimizu 890ddd
	fxScene->initCursorScenePos();
Toshihiro Shimizu 890ddd
	QMenu *addMenu = fxScene->getAddFxMenu();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *fxEditorPopup = CommandManager::instance()->getAction("MI_FxParamEditor");
Toshihiro Shimizu 890ddd
	QAction *copy = CommandManager::instance()->getAction("MI_Copy");
Toshihiro Shimizu 890ddd
	QAction *cut = CommandManager::instance()->getAction("MI_Cut");
Toshihiro Shimizu 890ddd
	QAction *group = CommandManager::instance()->getAction("MI_Group");
Toshihiro Shimizu 890ddd
	QAction *ungroup = CommandManager::instance()->getAction("MI_Ungroup");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *editGroup = new QAction(tr("&Open Group"), &menu);
Toshihiro Shimizu 890ddd
	connect(editGroup, SIGNAL(triggered()), fxScene, SLOT(onEditGroup()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *replacePaste = new QAction(tr("&Paste Replace"), &menu);
Toshihiro Shimizu 890ddd
	connect(replacePaste, SIGNAL(triggered()), fxScene, SLOT(onReplacePaste()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *addPaste = new QAction(tr("&Paste Add"), &menu);
Toshihiro Shimizu 890ddd
	connect(addPaste, SIGNAL(triggered()), fxScene, SLOT(onAddPaste()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx");
Toshihiro Shimizu 890ddd
	QIcon addOutputFxIcon = createQIconOnOffPNG("output", false);
Toshihiro Shimizu 890ddd
	if (addOutputFx)
Toshihiro Shimizu 890ddd
		addOutputFx->setIcon(addOutputFxIcon);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *deleteFx = new QAction(tr("&Delete"), &menu);
Toshihiro Shimizu 890ddd
	connect(deleteFx, SIGNAL(triggered()), fxScene, SLOT(onDeleteFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *disconnectFromXSheet = new QAction(tr("&Disconnect from Xsheet"), &menu);
Toshihiro Shimizu 890ddd
	connect(disconnectFromXSheet, SIGNAL(triggered()), fxScene, SLOT(onDisconnectFromXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *connectToXSheet = new QAction(tr("&Connect to Xsheet"), &menu);
Toshihiro Shimizu 890ddd
	connect(connectToXSheet, SIGNAL(triggered()), fxScene, SLOT(onConnectToXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *duplicateFx = new QAction(tr("&Create Linked FX"), &menu);
Toshihiro Shimizu 890ddd
	connect(duplicateFx, SIGNAL(triggered()), fxScene, SLOT(onDuplicateFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *unlinkFx = new QAction(tr("&Unlink"), &menu);
Toshihiro Shimizu 890ddd
	connect(unlinkFx, SIGNAL(triggered()), fxScene, SLOT(onUnlinkFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *macroFx = new QAction(tr("&Make Macro FX"), &menu);
Toshihiro Shimizu 890ddd
	connect(macroFx, SIGNAL(triggered()), fxScene, SLOT(onMacroFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *explodeMacroFx = new QAction(tr("&Explode Macro FX"), &menu);
Toshihiro Shimizu 890ddd
	connect(explodeMacroFx, SIGNAL(triggered()), fxScene, SLOT(onExplodeMacroFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *openMacroFx = new QAction(tr("&Open Macro FX"), &menu);
Toshihiro Shimizu 890ddd
	connect(openMacroFx, SIGNAL(triggered()), fxScene, SLOT(onOpenMacroFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *savePresetFx = new QAction(tr("&Save As Preset..."), &menu);
Toshihiro Shimizu 890ddd
	connect(savePresetFx, SIGNAL(triggered()), fxScene, SLOT(onSavePresetFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *preview = new QAction(tr("&Preview"), &menu);
Toshihiro Shimizu 890ddd
	connect(preview, SIGNAL(triggered()), fxScene, SLOT(onPreview()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool cacheEnabled = m_parent->isCached();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *cacheFx = new QAction(cacheEnabled ? tr("&Uncache FX") : tr("&Cache FX"), &menu);
Toshihiro Shimizu 890ddd
	if (cacheEnabled)
Toshihiro Shimizu 890ddd
		connect(cacheFx, SIGNAL(triggered()), fxScene, SLOT(onUncacheFx()));
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		connect(cacheFx, SIGNAL(triggered()), fxScene, SLOT(onCacheFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *collapse = CommandManager::instance()->getAction("MI_Collapse");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TZeraryColumnFx *zsrc = dynamic_cast<TZeraryColumnFx *>(fx);
Toshihiro Shimizu 890ddd
	// if(m_type != eGroupedFx)
Toshihiro Shimizu 890ddd
	// {
Toshihiro Shimizu 890ddd
	if (enableInsertAction) {
Toshihiro Shimizu 890ddd
		menu.addMenu(insertMenu);
Toshihiro Shimizu 890ddd
		menu.addMenu(addMenu);
Toshihiro Shimizu 890ddd
		if (m_type != eGroupedFx)
Toshihiro Shimizu 890ddd
			menu.addMenu(replacefxMenu);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (m_type != eGroupedFx)
Toshihiro Shimizu 890ddd
		menu.addAction(fxEditorPopup);
Toshihiro Shimizu 890ddd
	if (enableInsertAction) {
Toshihiro Shimizu 890ddd
		menu.addSeparator();
Toshihiro Shimizu 890ddd
		menu.addAction(copy);
Toshihiro Shimizu 890ddd
		menu.addAction(cut);
Toshihiro Shimizu 890ddd
		if (m_type != eGroupedFx && !fx->getAttributes()->isGrouped()) {
Toshihiro Shimizu 890ddd
			menu.addAction(replacePaste);
Toshihiro Shimizu 890ddd
			menu.addAction(addPaste);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		menu.addAction(deleteFx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		menu.addSeparator();
Toshihiro Shimizu 890ddd
		if (fxScene->getXsheetHandle()->getXsheet()->getFxDag()->getTerminalFxs()->containsFx(m_parent->getFx()))
Toshihiro Shimizu 890ddd
			menu.addAction(disconnectFromXSheet);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			menu.addAction(connectToXSheet);
Toshihiro Shimizu 890ddd
		menu.addAction(duplicateFx);
Toshihiro Shimizu 890ddd
		if (zsrc && zsrc->getZeraryFx() && zsrc->getZeraryFx()->getLinkedFx() != zsrc->getZeraryFx() || fx->getLinkedFx() != fx)
Toshihiro Shimizu 890ddd
			menu.addAction(unlinkFx);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
	if (!fx->getAttributes()->isGrouped())
Toshihiro Shimizu 890ddd
		menu.addAction(addOutputFx);
Toshihiro Shimizu 890ddd
	menu.addAction(preview);
Toshihiro Shimizu 890ddd
	if (enableGroupAction)
Toshihiro Shimizu 890ddd
		menu.addAction(cacheFx);
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	if (m_type != eGroupedFx && enableInsertAction) {
Toshihiro Shimizu 890ddd
		menu.addAction(macroFx);
Toshihiro Shimizu 890ddd
		if (scene()->selectedItems().size() == 1 && m_parent->isA(eMacroFx)) {
Toshihiro Shimizu 890ddd
			menu.addAction(explodeMacroFx);
Toshihiro Shimizu 890ddd
			menu.addAction(openMacroFx);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		menu.addAction(savePresetFx);
Toshihiro Shimizu 890ddd
		if (zsrc) {
Toshihiro Shimizu 890ddd
			menu.addSeparator();
Toshihiro Shimizu 890ddd
			menu.addAction(collapse);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		menu.addSeparator();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (enableGroupAction) {
Toshihiro Shimizu 890ddd
		menu.addAction(group);
Toshihiro Shimizu 890ddd
		if (m_type == eGroupedFx) {
Toshihiro Shimizu 890ddd
			menu.addAction(ungroup);
Toshihiro Shimizu 890ddd
			menu.addAction(editGroup);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! for small-scaled display
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
void FxPainter::paint_small(QPainter *painter)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_type == eGroupedFx) {
Toshihiro Shimizu 890ddd
		painter->save();
Toshihiro Shimizu 890ddd
		QPen pen;
Toshihiro Shimizu 890ddd
		if (m_parent->isSelected()) {
Toshihiro Shimizu 890ddd
			painter->setBrush(QColor(0, 0, 0, 0));
Toshihiro Shimizu 890ddd
			pen.setColor(QColor(255, 255, 255, 255));
Toshihiro Shimizu 890ddd
			pen.setWidth(4.0);
Toshihiro Shimizu 890ddd
			pen.setJoinStyle(Qt::RoundJoin);
Toshihiro Shimizu 890ddd
			painter->setPen(pen);
Toshihiro Shimizu 890ddd
			painter->drawRect(-2, -2, m_width + 4, m_height + 4);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		painter->restore();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QLinearGradient linearGrad = getGradientByLevelType(m_type);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	linearGrad.setFinalStop(QPointF(0, 50));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setBrush(QBrush(linearGrad));
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
	painter->drawRect(0, 0, m_width, m_height);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_type == eGroupedFx || m_type == eZeraryFx) {
Toshihiro Shimizu 890ddd
		QFont fnt = painter->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		painter->setFont(fnt);
Toshihiro Shimizu 890ddd
		painter->setPen(Qt::white);
Toshihiro Shimizu 890ddd
		FxSchematicScene *sceneFx = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
		if (!sceneFx)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		if (sceneFx->getCurrentFx() == m_parent->getFx())
Toshihiro Shimizu 890ddd
			painter->setPen(Qt::yellow);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_type == eGroupedFx) {
Toshihiro Shimizu 890ddd
		if (!m_parent->isNameEditing()) {
Toshihiro Shimizu 890ddd
			QRectF rect(14, 2, 68, 22);
Toshihiro Shimizu 890ddd
			int w = rect.width();
Toshihiro Shimizu 890ddd
			QString elidedName = elideText(m_name, painter->font(), w);
Toshihiro Shimizu 890ddd
			painter->drawText(rect, elidedName);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		painter->drawPixmap(16, 6, 38, 38, FxIconPixmapManager::instance()->getFxIconPm(m_fxType));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// show column number on the right side of icon
Toshihiro Shimizu 890ddd
	if (m_type == eZeraryFx) {
Toshihiro Shimizu 890ddd
		FxSchematicZeraryNode *zeraryNode = dynamic_cast<FxSchematicZeraryNode *>(m_parent);
Toshihiro Shimizu 890ddd
		if (zeraryNode) {
Toshihiro Shimizu 890ddd
			QRect idRect(30, 10, 46, 38);
Toshihiro Shimizu 890ddd
			painter->drawText(idRect, Qt::AlignRight | Qt::AlignBottom, QString::number(zeraryNode->getColumnIndex() + 1));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//diagonal line for disabled fx
Toshihiro Shimizu 890ddd
	bool is_enabled = false;
Toshihiro Shimizu 890ddd
	if (TZeraryColumnFx *zcFx = dynamic_cast<TZeraryColumnFx *>(m_parent->getFx()))
Toshihiro Shimizu 890ddd
		is_enabled = zcFx->getColumn()->isPreviewVisible();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		is_enabled = m_parent->getFx()->getAttributes()->isEnabled();
Toshihiro Shimizu 890ddd
	if (!is_enabled) {
Toshihiro Shimizu 890ddd
		painter->save();
Toshihiro Shimizu 890ddd
		painter->setPen(QColor(255, 0, 0, 255));
Toshihiro Shimizu 890ddd
		painter->drawLine(QPointF(10, m_height), QPointF(m_width - 10, 0));
Toshihiro Shimizu 890ddd
		painter->drawLine(QPointF(10, 0), QPointF(m_width - 10, m_height));
Toshihiro Shimizu 890ddd
		painter->restore();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxXSheetPainter
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxXSheetPainter::FxXSheetPainter(FxSchematicXSheetNode *parent, double width, double height)
Toshihiro Shimizu 890ddd
	: QGraphicsItem(parent), m_width(width), m_height(height), m_parent(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsMovable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsFocusable, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxXSheetPainter::~FxXSheetPainter()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxXSheetPainter::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxXSheetPainter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int alpha = 200;
Toshihiro Shimizu 890ddd
	QLinearGradient xsheetLinearGrad(QPointF(0, 0), QPointF(0, (m_parent->isLargeScaled()) ? 18 : 36));
Toshihiro Shimizu 890ddd
	xsheetLinearGrad.setColorAt(0, QColor(152, 146, 188, alpha));
Toshihiro Shimizu 890ddd
	xsheetLinearGrad.setColorAt(0.14, QColor(107, 106, 148, alpha));
Toshihiro Shimizu 890ddd
	xsheetLinearGrad.setColorAt(0.35, QColor(96, 96, 138, alpha));
Toshihiro Shimizu 890ddd
	xsheetLinearGrad.setColorAt(0.4, QColor(63, 67, 99, alpha));
Toshihiro Shimizu 890ddd
	xsheetLinearGrad.setColorAt(0.8, QColor(63, 67, 99, alpha));
Toshihiro Shimizu 890ddd
	xsheetLinearGrad.setColorAt(1, QColor(101, 105, 143, alpha));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setBrush(QBrush(xsheetLinearGrad));
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
	painter->drawRect(QRectF(0, 0, m_width, m_height));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::white);
Toshihiro Shimizu 890ddd
	if (m_parent->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		//Draw the name
Toshihiro Shimizu 890ddd
		QRectF rect(18, 0, 54, 18);
Toshihiro Shimizu 890ddd
		painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, QString("XSheet"));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	// small scaled
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		QRectF rect(28, 4, 32, 32);
Toshihiro Shimizu 890ddd
		QFont fnt = painter->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		painter->setFont(fnt);
Toshihiro Shimizu 890ddd
		painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, QString("X"));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxXSheetPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	QMenu menu(fxScene->views()[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cme->modifiers() & Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
		menu.addAction(fxScene->getAgainAction(AddFxContextMenu::Add | AddFxContextMenu::Insert));
Toshihiro Shimizu 890ddd
		if (!menu.actions().isEmpty()) {
Toshihiro Shimizu 890ddd
			menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QMenu *insertMenu = fxScene->getInsertFxMenu();
Toshihiro Shimizu 890ddd
	fxScene->initCursorScenePos();
Toshihiro Shimizu 890ddd
	QMenu *addMenu = fxScene->getAddFxMenu();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx");
Toshihiro Shimizu 890ddd
	QIcon addOutputFxIcon = createQIconOnOffPNG("output", false);
Toshihiro Shimizu 890ddd
	if (addOutputFx)
Toshihiro Shimizu 890ddd
		addOutputFx->setIcon(addOutputFxIcon);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *addPaste = new QAction(tr("&Paste Add"), &menu);
Toshihiro Shimizu 890ddd
	connect(addPaste, SIGNAL(triggered()), fxScene, SLOT(onAddPaste()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *preview = new QAction(tr("&Preview"), &menu);
Toshihiro Shimizu 890ddd
	connect(preview, SIGNAL(triggered()), fxScene, SLOT(onPreview()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	menu.addMenu(insertMenu);
Toshihiro Shimizu 890ddd
	menu.addMenu(addMenu);
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	menu.addAction(addPaste);
Toshihiro Shimizu 890ddd
	menu.addAction(addOutputFx);
Toshihiro Shimizu 890ddd
	menu.addAction(preview);
Toshihiro Shimizu 890ddd
	menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxOutputPainter
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxOutputPainter::FxOutputPainter(FxSchematicOutputNode *parent, double width, double height)
Toshihiro Shimizu 890ddd
	: QGraphicsItem(parent), m_width(width), m_height(height), m_parent(parent)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsMovable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsFocusable, false);
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFx *currentOutFx = fxScene->getXsheet()->getFxDag()->getCurrentOutputFx();
Toshihiro Shimizu 890ddd
	m_isActive = currentOutFx == parent->getFx();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxOutputPainter::~FxOutputPainter()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxOutputPainter::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxOutputPainter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int alpha = 200;
Toshihiro Shimizu 890ddd
	QLinearGradient outputLinearGrad(QPointF(0, 0), QPointF(0, (m_parent->isLargeScaled()) ? 18 : 36));
Toshihiro Shimizu 890ddd
	if (m_isActive) {
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0, QColor(115, 190, 224, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.14, QColor(51, 132, 208, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.35, QColor(39, 118, 196, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.4, QColor(18, 82, 153, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.8, QColor(18, 82, 153, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(1, QColor(68, 119, 169, alpha));
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0, QColor(183, 197, 196, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.14, QColor(138, 157, 160, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.35, QColor(125, 144, 146, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.4, QColor(80, 94, 97, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(0.8, QColor(80, 94, 97, alpha));
Toshihiro Shimizu 890ddd
		outputLinearGrad.setColorAt(1, QColor(128, 140, 142, alpha));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setBrush(QBrush(outputLinearGrad));
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
	painter->drawRect(QRectF(0, 0, m_width, m_height));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	painter->setPen(Qt::white);
Toshihiro Shimizu 890ddd
	if (m_parent->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		//Draw the name
Toshihiro Shimizu 890ddd
		QRectF rect(18, 0, 72, 18);
Toshihiro Shimizu 890ddd
		painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, QString("Output"));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	// small view
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		QRectF rect(16, 0, 50, 36);
Toshihiro Shimizu 890ddd
		QFont fnt = painter->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		painter->setFont(fnt);
Toshihiro Shimizu 890ddd
		painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, QString("Out"));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxOutputPainter::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	QMenu menu(fxScene->views()[0]);
Toshihiro Shimizu 890ddd
	if (fxScene->getXsheet()->getFxDag()->getOutputFxCount() > 1) {
Toshihiro Shimizu 890ddd
		QAction *removeOutput = new QAction(tr("&Delete"), &menu);
Toshihiro Shimizu 890ddd
		connect(removeOutput, SIGNAL(triggered()), fxScene, SLOT(onRemoveOutput()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QAction *activateOutput = new QAction(tr("&Activate"), &menu);
Toshihiro Shimizu 890ddd
		connect(activateOutput, SIGNAL(triggered()), fxScene, SLOT(onActivateOutput()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TFx *currentOutFx = fxScene->getXsheet()->getFxDag()->getCurrentOutputFx();
Toshihiro Shimizu 890ddd
		if (currentOutFx != m_parent->getFx())
Toshihiro Shimizu 890ddd
			menu.addAction(activateOutput);
Toshihiro Shimizu 890ddd
		menu.addAction(removeOutput);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		QAction *addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx");
Toshihiro Shimizu 890ddd
		QIcon addOutputFxIcon = createQIconOnOffPNG("output", false);
Toshihiro Shimizu 890ddd
		addOutputFx->setIcon(addOutputFxIcon);
Toshihiro Shimizu 890ddd
		menu.addAction(addOutputFx);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicLink
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicLink::FxSchematicLink(QGraphicsItem *parent, QGraphicsScene *scene)
Toshihiro Shimizu 890ddd
	: SchematicLink(parent, scene)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicLink::~FxSchematicLink()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicLink::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	TFxCommand::Link link = fxScene->getFxSelection()->getBoundingFxs(this);
Toshihiro Shimizu 890ddd
	if (link == TFxCommand::Link())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QMenu menu(fxScene->views()[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cme->modifiers() & Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
		menu.addAction(fxScene->getAgainAction(AddFxContextMenu::Insert));
Toshihiro Shimizu 890ddd
		if (!menu.actions().isEmpty()) {
Toshihiro Shimizu 890ddd
			menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *deleteFx = new QAction(tr("&Delete"), &menu);
Toshihiro Shimizu 890ddd
	connect(deleteFx, SIGNAL(triggered()), fxScene, SLOT(onDeleteFx()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QAction *insertPaste = new QAction(tr("&Paste Insert"), &menu);
Toshihiro Shimizu 890ddd
	connect(insertPaste, SIGNAL(triggered()), fxScene, SLOT(onInsertPaste()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	menu.addMenu(fxScene->getInsertFxMenu());
Toshihiro Shimizu 890ddd
	menu.addSeparator();
Toshihiro Shimizu 890ddd
	menu.addAction(insertPaste);
Toshihiro Shimizu 890ddd
	menu.addAction(deleteFx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicPort
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicPort::FxSchematicPort(FxSchematicDock *parent, int type)
Toshihiro Shimizu 890ddd
	: SchematicPort(parent, parent->getNode(), type), m_currentTargetPort(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QRectF rect = boundingRect();
Toshihiro Shimizu 890ddd
	if (getType() == eFxInputPort || getType() == eFxGroupedInPort)
Toshihiro Shimizu 890ddd
		m_hook = QPointF(rect.left(), (rect.top() + rect.bottom()) * 0.5);
Toshihiro Shimizu 890ddd
	else if (getType() == eFxOutputPort || getType() == eFxGroupedOutPort)
Toshihiro Shimizu 890ddd
		m_hook = QPointF(rect.right(), (rect.top() + rect.bottom()) * 0.5);
Toshihiro Shimizu 890ddd
	else //link port
Toshihiro Shimizu 890ddd
		m_hook = QPointF(rect.right(), (rect.top() + rect.bottom()) * 0.5);
Toshihiro Shimizu 890ddd
	m_ownerFx = getOwnerFx();
Toshihiro Shimizu 890ddd
	TZeraryColumnFx *colFx = dynamic_cast<TZeraryColumnFx *>(m_ownerFx);
Toshihiro Shimizu 890ddd
	if (colFx)
Toshihiro Shimizu 890ddd
		m_ownerFx = colFx->getZeraryFx();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicPort::~FxSchematicPort()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicPort::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// large scaled
Toshihiro Shimizu 890ddd
	if (getDock()->getNode()->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		switch (getType()) {
Toshihiro Shimizu 890ddd
		case eFxInputPort:
Toshihiro Shimizu 890ddd
		case eFxGroupedInPort:
Toshihiro Shimizu 890ddd
			return QRectF(0, 0, 14, 14);
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxOutputPort:
Toshihiro Shimizu 890ddd
		case eFxGroupedOutPort:
Toshihiro Shimizu 890ddd
			return QRectF(0, 0, 18, 18);
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxLinkPort: //LinkPort
Toshihiro Shimizu 890ddd
		default:
Toshihiro Shimizu 890ddd
			return QRectF(0, 0, 18, 7);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	//small scaled
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		switch (getType()) {
Toshihiro Shimizu 890ddd
		case eFxInputPort: {
Toshihiro Shimizu 890ddd
			FxSchematicNode *node = getDock()->getNode();
Toshihiro Shimizu 890ddd
			float nodeHeight = node->boundingRect().height() - 10.0f; //10.0 is margin
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TFx *fx = 0;
Toshihiro Shimizu 890ddd
			FxSchematicZeraryNode *zeraryNode = dynamic_cast<FxSchematicZeraryNode *>(node);
Toshihiro Shimizu 890ddd
			if (zeraryNode) {
Toshihiro Shimizu 890ddd
				TZeraryColumnFx *zcfx = dynamic_cast<TZeraryColumnFx *>(zeraryNode->getFx());
Toshihiro Shimizu 890ddd
				fx = zcfx->getZeraryFx();
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				fx = node->getFx();
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (fx && fx->getInputPortCount()) {
Toshihiro Shimizu 890ddd
				// ex. particles fx etc. For fxs of which amount of ports may change
Toshihiro Shimizu 890ddd
				if (fx->hasDynamicPortGroups())
Toshihiro Shimizu 890ddd
					nodeHeight = (nodeHeight - (float)(2 * (fx->getInputPortCount() - 1))) / (float)fx->getInputPortCount();
Toshihiro Shimizu 890ddd
				else
Toshihiro Shimizu 890ddd
					nodeHeight = (nodeHeight - (float)(4 * (fx->getInputPortCount() - 1))) / (float)fx->getInputPortCount();
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return QRectF(0, 0, 10, nodeHeight);
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxGroupedInPort:
Toshihiro Shimizu 890ddd
		case eFxOutputPort:
Toshihiro Shimizu 890ddd
		case eFxGroupedOutPort: {
Toshihiro Shimizu 890ddd
			FxSchematicNode *node = getDock()->getNode();
Toshihiro Shimizu 890ddd
			float nodeHeight = node->boundingRect().height() - 10.0f; //10.0 is margin
Toshihiro Shimizu 890ddd
			return QRectF(0, 0, 10, nodeHeight);
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxLinkPort: //LinkPort
Toshihiro Shimizu 890ddd
		default:
Toshihiro Shimizu 890ddd
			return QRectF(0, 0, 10, 5);
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return QRectF();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//large scaled
Toshihiro Shimizu 890ddd
	if (getDock()->getNode()->isLargeScaled()) {
Toshihiro Shimizu 890ddd
		switch (getType()) {
Toshihiro Shimizu 890ddd
		case eFxInputPort:
Toshihiro Shimizu 890ddd
		case eFxGroupedInPort: {
Toshihiro Shimizu 890ddd
			QPixmap redPm = QPixmap(":Resources/fxport_red.png");
Toshihiro Shimizu 890ddd
			painter->drawPixmap(boundingRect(), redPm, QRectF(0, 0, 50, 50));
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxOutputPort:
Toshihiro Shimizu 890ddd
		case eFxGroupedOutPort: {
Toshihiro Shimizu 890ddd
			QPixmap bluePm = QPixmap(":Resources/fxport_blue.png");
Toshihiro Shimizu 890ddd
			painter->drawPixmap(boundingRect(), bluePm, QRectF(0, 0, 50, 50));
Toshihiro Shimizu 890ddd
			FxSchematicDock *parentDock = dynamic_cast<FxSchematicDock *>(parentItem());
Toshihiro Shimizu 890ddd
			if (parentDock) {
Toshihiro Shimizu 890ddd
				FxSchematicNode *parentFxNode = dynamic_cast<FxSchematicNode *>(parentDock->parentItem());
Toshihiro Shimizu 890ddd
				if (parentFxNode) {
Toshihiro Shimizu 890ddd
					bool isCached = parentFxNode->isCached();
Toshihiro Shimizu 890ddd
					if (isCached) {
Toshihiro Shimizu 890ddd
						QPixmap cachePm = QPixmap(":Resources/cachefx.png");
Toshihiro Shimizu 890ddd
						painter->drawPixmap(QRectF(0, 0, 18, 36), cachePm, QRectF(0, 0, 50, 100));
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxLinkPort: //LinkPort
Toshihiro Shimizu 890ddd
		default: {
Toshihiro Shimizu 890ddd
			QPixmap linkPm = QPixmap(":Resources/schematic_link.png");
Toshihiro Shimizu 890ddd
			painter->drawPixmap(boundingRect(), linkPm, QRectF(0, 0, 36, 14));
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	//small scaled
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
		switch (getType()) {
Toshihiro Shimizu 890ddd
		case eFxInputPort:
Toshihiro Shimizu 890ddd
		case eFxGroupedInPort: {
Toshihiro Shimizu 890ddd
			painter->setBrush(QColor(223, 100, 100, 255));
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxOutputPort:
Toshihiro Shimizu 890ddd
		case eFxGroupedOutPort: {
Toshihiro Shimizu 890ddd
			painter->setBrush(QColor(100, 100, 223, 255));
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		case eFxLinkPort: //LinkPort
Toshihiro Shimizu 890ddd
		default: {
Toshihiro Shimizu 890ddd
			painter->setBrush(QColor(192, 192, 192, 255));
Toshihiro Shimizu 890ddd
		} break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		painter->drawRect(boundingRect());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicDock *FxSchematicPort::getDock() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return dynamic_cast<FxSchematicDock *>(parentItem());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SchematicLink *FxSchematicPort::makeLink(SchematicPort *port)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (isLinkedTo(port) || !port)
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	FxSchematicLink *link = new FxSchematicLink(0, scene());
Toshihiro Shimizu 890ddd
	if (getType() == eFxLinkPort && port->getType() == eFxLinkPort)
Toshihiro Shimizu 890ddd
		link->setLineShaped(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	link->setStartPort(this);
Toshihiro Shimizu 890ddd
	link->setEndPort(port);
Toshihiro Shimizu 890ddd
	addLink(link);
Toshihiro Shimizu 890ddd
	port->addLink(link);
Toshihiro Shimizu 890ddd
	link->updatePath();
Toshihiro Shimizu 890ddd
	return link;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxSchematicPort::linkTo(SchematicPort *port, bool checkOnly)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (port == this)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FxSchematicNode *dstNode = dynamic_cast<FxSchematicNode *>(port->getNode());
Toshihiro Shimizu 890ddd
	FxSchematicNode *srcNode = dynamic_cast<FxSchematicNode *>(getNode());
Toshihiro Shimizu 890ddd
	if (dstNode == srcNode)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFx *inputFx = 0, *fx = 0;
Toshihiro Shimizu 890ddd
	int portIndex = 0;
Toshihiro Shimizu 890ddd
	if (getType() == eFxInputPort && port->getType() == eFxOutputPort) {
Toshihiro Shimizu 890ddd
		inputFx = dstNode->getFx();
Toshihiro Shimizu 890ddd
		fx = srcNode->getFx();
Toshihiro Shimizu 890ddd
		portIndex = srcNode->getInputDockId(this->getDock());
Toshihiro Shimizu 890ddd
	} else if (getType() == eFxOutputPort && port->getType() == eFxInputPort) {
Toshihiro Shimizu 890ddd
		inputFx = srcNode->getFx();
Toshihiro Shimizu 890ddd
		fx = dstNode->getFx();
Toshihiro Shimizu 890ddd
		portIndex = dstNode->getInputDockId((dynamic_cast<FxSchematicPort *>(port))->getDock());
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	if (inputFx->getAttributes()->isGrouped() && fx->getAttributes()->isGrouped() &&
Toshihiro Shimizu 890ddd
		inputFx->getAttributes()->getEditingGroupId() != fx->getAttributes()->getEditingGroupId())
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	FxDag *fxDag = fxScene->getXsheet()->getFxDag();
Toshihiro Shimizu 890ddd
	if (fxDag->checkLoop(inputFx, fx))
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	if (!checkOnly)
Toshihiro Shimizu 890ddd
		linkEffects(inputFx, fx, portIndex);
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::linkEffects(TFx *inputFx, TFx *fx, int inputId)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFxCommand::setParent(inputFx, fx, inputId, fxScene->getXsheetHandle());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::hideSnappedLinks()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_linkingTo)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (m_linkingTo->getType() == eFxInputPort && m_linkingTo->getLinkCount() == 1) {
Toshihiro Shimizu 890ddd
		FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(m_linkingTo->getNode());
Toshihiro Shimizu 890ddd
		if (!xsheetNode)
Toshihiro Shimizu 890ddd
			m_linkingTo->getLink(0)->hide();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (m_linkingTo->getType() == eFxOutputPort && m_linkingTo->getLinkCount() >= 1) {
Toshihiro Shimizu 890ddd
		int i;
Toshihiro Shimizu 890ddd
		for (i = 0; i < m_linkingTo->getLinkCount(); i++) {
Toshihiro Shimizu 890ddd
			SchematicLink *link = m_linkingTo->getLink(i);
Toshihiro Shimizu 890ddd
			FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(link->getOtherNode(m_linkingTo->getNode()));
Toshihiro Shimizu 890ddd
			if (xsheetNode)
Toshihiro Shimizu 890ddd
				link->hide();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (getType() == eFxInputPort && getLinkCount() == 1) {
Toshihiro Shimizu 890ddd
		FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(getNode());
Toshihiro Shimizu 890ddd
		if (!xsheetNode)
Toshihiro Shimizu 890ddd
			getLink(0)->hide();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (getType() == eFxOutputPort && getLinkCount() == 1) {
Toshihiro Shimizu 890ddd
		FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(getLink(0)->getOtherNode(this->getNode()));
Toshihiro Shimizu 890ddd
		if (xsheetNode)
Toshihiro Shimizu 890ddd
			getLink(0)->hide();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::showSnappedLinks()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_linkingTo)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (m_linkingTo->getType() == eFxInputPort && m_linkingTo->getLinkCount() == 1) {
Toshihiro Shimizu 890ddd
		FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(m_linkingTo->getNode());
Toshihiro Shimizu 890ddd
		if (!xsheetNode)
Toshihiro Shimizu 890ddd
			m_linkingTo->getLink(0)->show();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (m_linkingTo->getType() == eFxOutputPort && m_linkingTo->getLinkCount() >= 1) {
Toshihiro Shimizu 890ddd
		int i;
Toshihiro Shimizu 890ddd
		for (i = 0; i < m_linkingTo->getLinkCount(); i++) {
Toshihiro Shimizu 890ddd
			SchematicLink *link = m_linkingTo->getLink(i);
Toshihiro Shimizu 890ddd
			FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(link->getOtherNode(m_linkingTo->getNode()));
Toshihiro Shimizu 890ddd
			if (xsheetNode)
Toshihiro Shimizu 890ddd
				link->show();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (getType() == eFxInputPort && getLinkCount() == 1) {
Toshihiro Shimizu 890ddd
		FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(getNode());
Toshihiro Shimizu 890ddd
		if (!xsheetNode)
Toshihiro Shimizu 890ddd
			getLink(0)->show();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (getType() == eFxOutputPort && getLinkCount() == 1) {
Toshihiro Shimizu 890ddd
		FxSchematicXSheetNode *xsheetNode = dynamic_cast<FxSchematicXSheetNode *>(getLink(0)->getOtherNode(this->getNode()));
Toshihiro Shimizu 890ddd
		if (xsheetNode)
Toshihiro Shimizu 890ddd
			getLink(0)->show();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SchematicPort *FxSchematicPort::searchPort(const QPointF &scenePos)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	assert(fxScene);
Toshihiro Shimizu 890ddd
	TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
	QList<QGraphicsItem *> items = scene()->items(scenePos);
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < items.size(); i++) {
Toshihiro Shimizu 890ddd
		FxSchematicPort *linkingTo = dynamic_cast<FxSchematicPort *>(items[i]);
Toshihiro Shimizu 890ddd
		if (linkingTo && linkingTo->getType() != eFxLinkPort) {
Toshihiro Shimizu 890ddd
			TFx *fx = linkingTo->getDock()->getNode()->getFx();
Toshihiro Shimizu 890ddd
			assert(fx);
Toshihiro Shimizu 890ddd
			if ((!fx->getAttributes()->isGrouped() || fx->getAttributes()->isGroupEditing()) &&
Toshihiro Shimizu 890ddd
				!isAInnerMacroFx(fx, xsh))
Toshihiro Shimizu 890ddd
				return linkingTo;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		FxSchematicDock *linkingDock = dynamic_cast<FxSchematicDock *>(items[i]);
Toshihiro Shimizu 890ddd
		if (linkingDock && linkingDock->getPort()->getType() != eFxLinkPort) {
Toshihiro Shimizu 890ddd
			TFx *fx = linkingDock->getNode()->getFx();
Toshihiro Shimizu 890ddd
			assert(fx);
Toshihiro Shimizu 890ddd
			if ((!fx->getAttributes()->isGrouped() || fx->getAttributes()->isGroupEditing()) &&
Toshihiro Shimizu 890ddd
				!isAInnerMacroFx(fx, xsh))
Toshihiro Shimizu 890ddd
				return linkingDock->getPort();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		FxSchematicXSheetNode *linkingNode = dynamic_cast<FxSchematicXSheetNode *>(items[i]);
Toshihiro Shimizu 890ddd
		if (linkingNode && getType() == eFxOutputPort)
Toshihiro Shimizu 890ddd
			return linkingNode->getInputPort(0);
Toshihiro Shimizu 890ddd
		if (linkingNode && getType() == eFxInputPort)
Toshihiro Shimizu 890ddd
			return linkingNode->getOutputPort();
Toshihiro Shimizu 890ddd
		FxSchematicOutputNode *outFx = dynamic_cast<FxSchematicOutputNode *>(items[i]);
Toshihiro Shimizu 890ddd
		if (outFx && getType() == eFxOutputPort)
Toshihiro Shimizu 890ddd
			return outFx->getInputPort(0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::handleSnappedLinksOnDynamicPortFx(const vector<TFxPort *> &groupedPorts, int targetIndex, int startIndex)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode *node = dynamic_cast<FxSchematicNode *>(getNode());
Toshihiro Shimizu 890ddd
	if (!m_ownerFx->hasDynamicPortGroups() || !node)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	int groupedPortCount = groupedPorts.size();
Toshihiro Shimizu 890ddd
	if (startIndex < 0)
Toshihiro Shimizu 890ddd
		startIndex = groupedPortCount - 1;
Toshihiro Shimizu 890ddd
	if (startIndex >= groupedPortCount || targetIndex >= groupedPortCount)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//hide existing links
Toshihiro Shimizu 890ddd
	QMap<int, SchematicPort *> linkedPorts;
Toshihiro Shimizu 890ddd
	int minIndex = tmin(targetIndex, startIndex);
Toshihiro Shimizu 890ddd
	int maxIndex = tmax(targetIndex, startIndex);
Toshihiro Shimizu 890ddd
	for (i = minIndex; i <= maxIndex; i++) {
Toshihiro Shimizu 890ddd
		TFxPort *currentPort = groupedPorts[i];
Toshihiro Shimizu 890ddd
		int portId = getInputPortIndex(currentPort, currentPort->getOwnerFx());
Toshihiro Shimizu 890ddd
		if (portId == -1)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		FxSchematicPort *port = node->getInputPort(portId);
Toshihiro Shimizu 890ddd
		SchematicLink *link = port->getLink(0);
Toshihiro Shimizu 890ddd
		if (link) {
Toshihiro Shimizu 890ddd
			linkedPorts[i] = link->getOtherPort(port);
Toshihiro Shimizu 890ddd
			link->hide();
Toshihiro Shimizu 890ddd
			m_hiddenLinks.append(link);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//create ghost links
Toshihiro Shimizu 890ddd
	if (targetIndex < startIndex) {
Toshihiro Shimizu 890ddd
		for (i = targetIndex + 1; i <= startIndex; i++) {
Toshihiro Shimizu 890ddd
			TFxPort *currentPort = groupedPorts[i];
Toshihiro Shimizu 890ddd
			int portId = getInputPortIndex(currentPort, currentPort->getOwnerFx());
Toshihiro Shimizu 890ddd
			if (portId == -1)
Toshihiro Shimizu 890ddd
				continue;
Toshihiro Shimizu 890ddd
			FxSchematicPort *port = node->getInputPort(portId);
Toshihiro Shimizu 890ddd
			SchematicLink *link = port->makeLink(linkedPorts[i - 1]);
Toshihiro Shimizu 890ddd
			if (link)
Toshihiro Shimizu 890ddd
				m_ghostLinks.append(link);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		for (i = startIndex; i < targetIndex; i++) {
Toshihiro Shimizu 890ddd
			TFxPort *currentPort = groupedPorts[i];
Toshihiro Shimizu 890ddd
			int portId = getInputPortIndex(currentPort, currentPort->getOwnerFx());
Toshihiro Shimizu 890ddd
			if (portId == -1)
Toshihiro Shimizu 890ddd
				continue;
Toshihiro Shimizu 890ddd
			FxSchematicPort *port = node->getInputPort(portId);
Toshihiro Shimizu 890ddd
			SchematicLink *link = port->makeLink(linkedPorts[i + 1]);
Toshihiro Shimizu 890ddd
			if (link)
Toshihiro Shimizu 890ddd
				m_ghostLinks.append(link);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::resetSnappedLinksOnDynamicPortFx()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_hiddenLinks.size(); i++)
Toshihiro Shimizu 890ddd
		m_hiddenLinks.at(i)->show();
Toshihiro Shimizu 890ddd
	m_hiddenLinks.clear();
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_ghostLinks.size(); i++) {
Toshihiro Shimizu 890ddd
		SchematicLink *link = m_ghostLinks.at(i);
Toshihiro Shimizu 890ddd
		link->getStartPort()->removeLink(link);
Toshihiro Shimizu 890ddd
		link->getEndPort()->removeLink(link);
Toshihiro Shimizu 890ddd
		scene()->removeItem(link);
Toshihiro Shimizu 890ddd
		delete link;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_ghostLinks.clear();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	QMenu menu(fxScene->views()[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFx *fx = getDock()->getNode()->getFx();
Toshihiro Shimizu 890ddd
	bool enableInsertAction = fxScene->getXsheet()->getFxDag()->getInternalFxs()->containsFx(fx) &&
Toshihiro Shimizu 890ddd
							  (!fx->getAttributes()->isGrouped() || fx->getAttributes()->isGroupEditing());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if ((getType() == eFxOutputPort || getType() == eFxGroupedOutPort) && enableInsertAction) {
Toshihiro Shimizu 890ddd
		fxScene->initCursorScenePos();
Toshihiro Shimizu 890ddd
		if (cme->modifiers() & Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
			menu.addAction(fxScene->getAgainAction(AddFxContextMenu::Add));
Toshihiro Shimizu 890ddd
			if (!menu.actions().isEmpty()) {
Toshihiro Shimizu 890ddd
				menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QAction *disconnectFromXSheet = new QAction(tr("&Disconnect from Xsheet"), &menu);
Toshihiro Shimizu 890ddd
		connect(disconnectFromXSheet, SIGNAL(triggered()), fxScene, SLOT(onDisconnectFromXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QAction *connectToXSheet = new QAction(tr("&Connect to Xsheet"), &menu);
Toshihiro Shimizu 890ddd
		connect(connectToXSheet, SIGNAL(triggered()), fxScene, SLOT(onConnectToXSheet()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QAction *fxEditorPopup = CommandManager::instance()->getAction("MI_FxParamEditor");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		menu.addMenu(fxScene->getAddFxMenu());
Toshihiro Shimizu 890ddd
		menu.addAction(fxEditorPopup);
Toshihiro Shimizu 890ddd
		if (fxScene->getXsheet()->getFxDag()->getTerminalFxs()->containsFx(getDock()->getNode()->getFx()))
Toshihiro Shimizu 890ddd
			menu.addAction(disconnectFromXSheet);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			menu.addAction(connectToXSheet);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	menu.exec(cme->screenPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::mouseMoveEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	SchematicPort::mouseMoveEvent(me);
Toshihiro Shimizu 890ddd
	if (m_ghostLink && !m_ghostLink->isVisible())
Toshihiro Shimizu 890ddd
		m_ghostLink->show();
Toshihiro Shimizu 890ddd
	bool cntr = me->modifiers() == Qt::ControlModifier;
Toshihiro Shimizu 890ddd
	if (m_currentTargetPort) {
Toshihiro Shimizu 890ddd
		m_currentTargetPort->resetSnappedLinksOnDynamicPortFx();
Toshihiro Shimizu 890ddd
		m_currentTargetPort = 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (!m_linkingTo)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	FxSchematicPort *targetPort = dynamic_cast<FxSchematicPort *>(m_linkingTo);
Toshihiro Shimizu 890ddd
	assert(targetPort);
Toshihiro Shimizu 890ddd
	m_currentTargetPort = targetPort;
Toshihiro Shimizu 890ddd
	TFx *targetFx = targetPort->getOwnerFx();
Toshihiro Shimizu 890ddd
	TZeraryColumnFx *colFx = dynamic_cast<TZeraryColumnFx *>(targetFx);
Toshihiro Shimizu 890ddd
	if (colFx)
Toshihiro Shimizu 890ddd
		targetFx = colFx->getZeraryFx();
Toshihiro Shimizu 890ddd
	if (targetPort->getType() != eFxInputPort || !targetFx->hasDynamicPortGroups() || targetPort == this)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FxSchematicNode *node = dynamic_cast<FxSchematicNode *>(targetPort->getNode());
Toshihiro Shimizu 890ddd
	int id = node->getInputDockId(targetPort->getDock());
Toshihiro Shimizu 890ddd
	TFxPort *targetFxPort = targetFx->getInputPort(id);
Toshihiro Shimizu 890ddd
	int groupId = targetFxPort->getGroupIndex();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (groupId < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::vector<TFxPort *> groupedPorts = targetFx->dynamicPortGroup(groupId)->ports();
Toshihiro Shimizu 890ddd
	int portId = getIndex(targetFxPort, groupedPorts);
Toshihiro Shimizu 890ddd
	if (portId == -1)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	if (targetFx != m_ownerFx && cntr && getType() == eFxOutputPort)
Toshihiro Shimizu 890ddd
		targetPort->handleSnappedLinksOnDynamicPortFx(groupedPorts, portId);
Toshihiro Shimizu 890ddd
	else if (targetFx == m_ownerFx && getType() == eFxInputPort) {
Toshihiro Shimizu 890ddd
		if (m_ghostLink)
Toshihiro Shimizu 890ddd
			m_ghostLink->hide();
Toshihiro Shimizu 890ddd
		FxSchematicNode *thisNode = dynamic_cast<FxSchematicNode *>(getNode());
Toshihiro Shimizu 890ddd
		int thisId = thisNode->getInputDockId(getDock());
Toshihiro Shimizu 890ddd
		TFxPort *thisFxPort = targetFx->getInputPort(thisId);
Toshihiro Shimizu 890ddd
		int thisGroupId = thisFxPort->getGroupIndex();
Toshihiro Shimizu 890ddd
		if (thisGroupId != groupId)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		int thisPortId = getIndex(thisFxPort, groupedPorts);
Toshihiro Shimizu 890ddd
		if (thisPortId == -1)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		targetPort->handleSnappedLinksOnDynamicPortFx(groupedPorts, portId, thisPortId);
Toshihiro Shimizu 890ddd
		SchematicLink *link = getLink(0);
Toshihiro Shimizu 890ddd
		assert(link);
Toshihiro Shimizu 890ddd
		SchematicLink *ghostLink = targetPort->makeLink(link->getOtherPort(this));
Toshihiro Shimizu 890ddd
		if (ghostLink) {
Toshihiro Shimizu 890ddd
			targetPort->m_ghostLinks.append(ghostLink);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPort::mouseReleaseEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_currentTargetPort)
Toshihiro Shimizu 890ddd
		m_currentTargetPort->resetSnappedLinksOnDynamicPortFx();
Toshihiro Shimizu 890ddd
	m_currentTargetPort = 0;
Toshihiro Shimizu 890ddd
	FxSchematicPort *targetPort = dynamic_cast<FxSchematicPort *>(searchPort(me->scenePos()));
Toshihiro Shimizu 890ddd
	if (!targetPort) // not over a port: do nothing
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		SchematicPort::mouseReleaseEvent(me);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TFx *targetOwnerFx = targetPort->getOwnerFx();
Toshihiro Shimizu 890ddd
	TZeraryColumnFx *colFx = dynamic_cast<TZeraryColumnFx *>(targetOwnerFx);
Toshihiro Shimizu 890ddd
	if (colFx)
Toshihiro Shimizu 890ddd
		targetOwnerFx = colFx->getZeraryFx();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//if the target fx has no dynamic port or has dinamic ports but the tatgert port is not an input port: do nothing!
Toshihiro Shimizu 890ddd
	if (!targetOwnerFx || !targetOwnerFx->hasDynamicPortGroups() || targetPort->getType() != eFxInputPort) {
Toshihiro Shimizu 890ddd
		SchematicPort::mouseReleaseEvent(me);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	FxSchematicNode *targetNode = dynamic_cast<FxSchematicNode *>(targetPort->getNode());
Toshihiro Shimizu 890ddd
	int targetFxId = targetNode->getInputDockId(targetPort->getDock());
Toshihiro Shimizu 890ddd
	TFxPort *targetFxPort = targetOwnerFx->getInputPort(targetFxId);
Toshihiro Shimizu 890ddd
	int targetGroupId = targetFxPort->getGroupIndex();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (targetGroupId < 0) {
Toshihiro Shimizu 890ddd
		SchematicPort::mouseReleaseEvent(me);
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<TFxPort *> groupedPorts = targetOwnerFx->dynamicPortGroup(targetGroupId)->ports();
Toshihiro Shimizu 890ddd
	int groupedPortCount = groupedPorts.size();
Toshihiro Shimizu 890ddd
	if (targetOwnerFx != m_ownerFx && me->modifiers() == Qt::ControlModifier && linkTo(targetPort, true)) {
Toshihiro Shimizu 890ddd
		//trying to link different fxs insertin the new link and shifting the others
Toshihiro Shimizu 890ddd
		int targetIndex = getIndex(targetFxPort, groupedPorts);
Toshihiro Shimizu 890ddd
		if (targetIndex == -1) {
Toshihiro Shimizu 890ddd
			SchematicPort::mouseReleaseEvent(me);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int i;
Toshihiro Shimizu 890ddd
		TUndoManager::manager()->beginBlock();
Toshihiro Shimizu 890ddd
		for (i = groupedPortCount - 1; i > targetIndex; i--) {
Toshihiro Shimizu 890ddd
			TFxPort *currentPort = groupedPorts[i];
Toshihiro Shimizu 890ddd
			TFxPort *precedentPort = groupedPorts[i - 1];
Toshihiro Shimizu 890ddd
			int currentPortIndex = getInputPortIndex(currentPort, targetOwnerFx);
Toshihiro Shimizu 890ddd
			linkEffects(precedentPort->getFx(), colFx ? colFx : targetOwnerFx, currentPortIndex);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		linkTo(targetPort);
Toshihiro Shimizu 890ddd
		TUndoManager::manager()->endBlock();
Toshihiro Shimizu 890ddd
		emit sceneChanged();
Toshihiro Shimizu 890ddd
		emit xsheetChanged();
Toshihiro Shimizu 890ddd
	} else if (targetOwnerFx == m_ownerFx && m_type == eFxInputPort && getLink(0) && targetPort != this) {
Toshihiro Shimizu 890ddd
		//reordering of links in input of the same fxs
Toshihiro Shimizu 890ddd
		/*FxSchematicNode* linkedNode =  dynamic_cast<FxSchematicNode*>(getLinkedNode(0));
Toshihiro Shimizu 890ddd
    assert(linkedNode);
Toshihiro Shimizu 890ddd
    TFx* linkedFx = linkedNode->getFx();
Toshihiro Shimizu 890ddd
    assert(linkedFx);*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int thisFxId = targetNode->getInputDockId(getDock());
Toshihiro Shimizu 890ddd
		TFxPort *thisFxPort = m_ownerFx->getInputPort(thisFxId);
Toshihiro Shimizu 890ddd
		TFx *linkedFx = thisFxPort->getFx();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int targetIndex = getIndex(targetFxPort, groupedPorts);
Toshihiro Shimizu 890ddd
		int thisIndex = getIndex(thisFxPort, groupedPorts);
Toshihiro Shimizu 890ddd
		if (targetIndex != -1 && thisIndex != -1 && thisIndex != targetIndex) {
Toshihiro Shimizu 890ddd
			TUndoManager::manager()->beginBlock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			//linkEffects(0,colFx ? colFx : m_ownerFx,thisFxId);
Toshihiro Shimizu 890ddd
			if (thisIndex > targetIndex) {
Toshihiro Shimizu 890ddd
				int i;
Toshihiro Shimizu 890ddd
				for (i = thisIndex; i > targetIndex; i--) {
Toshihiro Shimizu 890ddd
					TFxPort *currentPort = groupedPorts[i];
Toshihiro Shimizu 890ddd
					TFxPort *precedentPort = groupedPorts[i - 1];
Toshihiro Shimizu 890ddd
					int currentId = getInputPortIndex(currentPort, m_ownerFx);
Toshihiro Shimizu 890ddd
					linkEffects(precedentPort->getFx(), colFx ? colFx : m_ownerFx, currentId);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				int i;
Toshihiro Shimizu 890ddd
				for (i = thisIndex; i < targetIndex; i++) {
Toshihiro Shimizu 890ddd
					TFxPort *currentPort = groupedPorts[i];
Toshihiro Shimizu 890ddd
					TFxPort *nextPort = groupedPorts[i + 1];
Toshihiro Shimizu 890ddd
					int currentId = getInputPortIndex(currentPort, m_ownerFx);
Toshihiro Shimizu 890ddd
					linkEffects(nextPort->getFx(), colFx ? colFx : m_ownerFx, currentId);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			linkEffects(linkedFx, colFx ? colFx : m_ownerFx, targetFxId);
Toshihiro Shimizu 890ddd
			TUndoManager::manager()->endBlock();
Toshihiro Shimizu 890ddd
			emit sceneChanged();
Toshihiro Shimizu 890ddd
			emit xsheetChanged();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		SchematicPort::mouseReleaseEvent(me);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFx *FxSchematicPort::getOwnerFx() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode *node = dynamic_cast<FxSchematicNode *>(this->getNode());
Toshihiro Shimizu 890ddd
	if (!node)
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	return node->getFx();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicDock
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicDock::FxSchematicDock(FxSchematicNode *parent, const QString &name, double width,
Toshihiro Shimizu 890ddd
								 eFxSchematicPortType type)
Toshihiro Shimizu 890ddd
	: QGraphicsItem(parent), m_name(name), m_width(width)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_port = new FxSchematicPort(this, type);
Toshihiro Shimizu 890ddd
	m_port->setPos(0, 0);
Toshihiro Shimizu 890ddd
	if (parent) {
Toshihiro Shimizu 890ddd
		TFx *fx = parent->getFx();
Toshihiro Shimizu 890ddd
		TFxPort *port = fx->getInputPort(name.toStdString());
Toshihiro Shimizu 890ddd
		if (port) {
Toshihiro Shimizu 890ddd
			TFx *inputFx = port->getFx();
Toshihiro Shimizu 890ddd
			if (inputFx) {
Toshihiro Shimizu 890ddd
				TLevelColumnFx *levelFx = dynamic_cast<TLevelColumnFx *>(inputFx);
Toshihiro Shimizu 890ddd
				TPaletteColumnFx *palettFx = dynamic_cast<TPaletteColumnFx *>(inputFx);
Toshihiro Shimizu 890ddd
				if (levelFx || palettFx) {
Toshihiro Shimizu 890ddd
					int index = levelFx ? levelFx->getColumnIndex() : palettFx->getColumnIndex();
Toshihiro Shimizu 890ddd
					TStageObjectId objId = TStageObjectId::ColumnId(index);
Toshihiro Shimizu 890ddd
					QGraphicsScene *graphicScene = scene();
Toshihiro Shimizu 890ddd
					FxSchematicScene *schematicScene = dynamic_cast<FxSchematicScene *>(graphicScene);
Toshihiro Shimizu 890ddd
					if (schematicScene) {
Toshihiro Shimizu 890ddd
						string colName = schematicScene->getXsheet()->getStageObject(objId)->getName();
Toshihiro Shimizu 890ddd
						setToolTip(QString::fromStdString(colName));
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				} else {
Toshihiro Shimizu 890ddd
					TZeraryColumnFx *zeraryFx = dynamic_cast<TZeraryColumnFx *>(inputFx);
Toshihiro Shimizu 890ddd
					if (zeraryFx)
Toshihiro Shimizu 890ddd
						inputFx = zeraryFx->getZeraryFx();
Toshihiro Shimizu 890ddd
					setToolTip(QString::fromStdWString(inputFx->getName()));
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	connect(m_port, SIGNAL(sceneChanged()), parent, SIGNAL(sceneChanged()));
Toshihiro Shimizu 890ddd
	connect(m_port, SIGNAL(xsheetChanged()), parent, SIGNAL(xsheetChanged()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicDock::~FxSchematicDock()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicDock::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(0, 0, m_width, m_port->boundingRect().height());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicDock::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_port->getType() == eFxInputPort || m_port->getType() == eFxGroupedInPort) {
Toshihiro Shimizu 890ddd
		//do nothing when small scaled
Toshihiro Shimizu 890ddd
		if (!getNode()->isLargeScaled())
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		painter->setPen(Qt::NoPen);
Toshihiro Shimizu 890ddd
		painter->setBrush(QColor(0, 0, 0, 192));
Toshihiro Shimizu 890ddd
		painter->drawRect(boundingRect());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		QFont tempFont(painter->font());
Toshihiro Shimizu 890ddd
		tempFont.setPixelSize(tempFont.pixelSize() - 1);
Toshihiro Shimizu 890ddd
		painter->setFont(tempFont);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		painter->setPen(Qt::white);
Toshihiro Shimizu 890ddd
		painter->drawText(boundingRect().adjusted(18, 0, 0, 0), Qt::AlignLeft | Qt::AlignVCenter, m_name);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicNode *FxSchematicDock::getNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode *node = dynamic_cast<FxSchematicNode *>(parentItem());
Toshihiro Shimizu 890ddd
	return node;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicNode::FxSchematicNode(FxSchematicScene *scene, TFx *fx, qreal width, qreal height, eFxType type)
Toshihiro Shimizu 890ddd
	: SchematicNode(scene), m_fx(fx), m_type(type), m_isCurrentFxLinked(false), m_isLargeScaled(scene->isLargeScaled())
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_type == eGroupedFx)
Toshihiro Shimizu 890ddd
		m_actualFx = 0;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		// m_fx could be the zerary wrapper to the actual (user-coded) fx - find and store it.
Toshihiro Shimizu 890ddd
		TZeraryColumnFx *zfx = dynamic_cast<TZeraryColumnFx *>(m_fx.getPointer());
Toshihiro Shimizu 890ddd
		m_actualFx = zfx ? zfx->getZeraryFx() : m_fx;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setWidth(width);
Toshihiro Shimizu 890ddd
	setHeight(height);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::setSchematicNodePos(const QPointF &pos) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPointD p(pos.x(), pos.y());
Toshihiro Shimizu 890ddd
	if (!m_fx->getAttributes()->isGrouped() || m_fx->getAttributes()->isGroupEditing()) {
Toshihiro Shimizu 890ddd
		m_fx->getAttributes()->setDagNodePos(p);
Toshihiro Shimizu 890ddd
		TMacroFx *macro = dynamic_cast<TMacroFx *>(m_fx.getPointer());
Toshihiro Shimizu 890ddd
		if (macro) {
Toshihiro Shimizu 890ddd
			TPointD delta = p - macro->getRoot()->getAttributes()->getDagNodePos();
Toshihiro Shimizu 890ddd
			vector<TFxP> fxs = macro->getFxs();
Toshihiro Shimizu 890ddd
			int i;
Toshihiro Shimizu 890ddd
			for (i = 0; i < (int)fxs.size(); i++) {
Toshihiro Shimizu 890ddd
				TPointD oldPos = fxs[i]->getAttributes()->getDagNodePos();
Toshihiro Shimizu 890ddd
				fxs[i]->getAttributes()->setDagNodePos(oldPos + delta);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		const FxGroupNode *groupNode = dynamic_cast<const FxGroupNode *>(this);
Toshihiro Shimizu 890ddd
		assert(groupNode);
Toshihiro Shimizu 890ddd
		groupNode->updateFxsDagPosition(p);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FxSchematicNode::getInputDockId(FxSchematicDock *dock)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_inDocks.indexOf(dock);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::onClicked()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	emit switchCurrentFx(m_fx.getPointer());
Toshihiro Shimizu 890ddd
	if (TColumnFx *cfx = dynamic_cast<TColumnFx *>(m_fx.getPointer())) {
Toshihiro Shimizu 890ddd
		int columnIndex = cfx->getColumnIndex();
Toshihiro Shimizu 890ddd
		if (columnIndex >= 0)
Toshihiro Shimizu 890ddd
			emit currentColumnChanged(columnIndex);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::setIsCurrentFxLinked(bool value, FxSchematicNode *comingNode)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_isCurrentFxLinked = value;
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
	if (!m_linkDock)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_linkDock->getPort()->getLinkCount(); i++) {
Toshihiro Shimizu 890ddd
		SchematicNode *node = m_linkDock->getPort()->getLinkedNode(i);
Toshihiro Shimizu 890ddd
		if (!node || node == comingNode)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		FxSchematicNode *fxNode = dynamic_cast<FxSchematicNode *>(node);
Toshihiro Shimizu 890ddd
		assert(fxNode);
Toshihiro Shimizu 890ddd
		fxNode->setIsCurrentFxLinked(value, this);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::setPosition(const QPointF &newPos)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	assert(fxScene);
Toshihiro Shimizu 890ddd
	fxScene->updateNestedGroupEditors(this, newPos);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxSchematicNode::isEnabled() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TZeraryColumnFx *zcFx = dynamic_cast<TZeraryColumnFx *>(m_fx.getPointer());
Toshihiro Shimizu 890ddd
	return zcFx ? zcFx->getColumn()->isPreviewVisible() : m_fx->getAttributes()->isEnabled();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxSchematicNode::isCached() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return TPassiveCacheManager::instance()->cacheEnabled(m_fx.getPointer());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::checkDynamicInputPortSize() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_actualFx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_actualFx->hasDynamicPortGroups())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Shift holes in each dynamic port group links toward the end of the group
Toshihiro Shimizu 890ddd
	shiftLinks();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Treat each dynamic port group independently
Toshihiro Shimizu 890ddd
	int g, gCount = m_actualFx->dynamicPortGroupsCount();
Toshihiro Shimizu 890ddd
	for (g = 0; g != gCount; ++g) {
Toshihiro Shimizu 890ddd
		const TFxPortDG *group = m_actualFx->dynamicPortGroup(g);
Toshihiro Shimizu 890ddd
		int gSize = group->ports().size();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int minPortsCount = group->minPortsCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (gSize < minPortsCount) {
Toshihiro Shimizu 890ddd
			// Add empty ports up to the group's minimal required quota
Toshihiro Shimizu 890ddd
			for (; gSize != minPortsCount; ++gSize)
Toshihiro Shimizu 890ddd
				addDynamicInputPort(g);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Must remove all unlinked ports beyond the minimal - however, we'll be iterating
Toshihiro Shimizu 890ddd
		// on the ports container, so it's easier if we avoid removing WHILE iterating
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// So, fill in a list of all the fx's unlinked ports first
Toshihiro Shimizu 890ddd
		QList<std::string> unlinkedPorts;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int p, portCount = m_actualFx->getInputPortCount();
Toshihiro Shimizu 890ddd
		for (p = 0; p != portCount; ++p) {
Toshihiro Shimizu 890ddd
			TFxPort *port = m_actualFx->getInputPort(p);
Toshihiro Shimizu 890ddd
			assert(port);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if ((port->getGroupIndex() == g) && !port->isConnected())
Toshihiro Shimizu 890ddd
				unlinkedPorts.append(m_actualFx->getInputPortName(p));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Remove excess empty ports save for 1 (needed to let the user insert new links)
Toshihiro Shimizu 890ddd
		if (unlinkedPorts.empty())
Toshihiro Shimizu 890ddd
			addDynamicInputPort(g);
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			while (unlinkedPorts.size() > 1 &&
Toshihiro Shimizu 890ddd
				   m_actualFx->getInputPortCount() > minPortsCount) {
Toshihiro Shimizu 890ddd
				removeDynamicInputPort(unlinkedPorts.last());
Toshihiro Shimizu 890ddd
				unlinkedPorts.pop_back();
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::addDynamicInputPort(int groupIdx) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_actualFx);
Toshihiro Shimizu 890ddd
	assert(groupIdx < m_actualFx->dynamicPortGroupsCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *port = new TRasterFxPort;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Add the port with a suitable port name
Toshihiro Shimizu 890ddd
	const TFxPortDG *group = m_actualFx->dynamicPortGroup(groupIdx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int n = group->ports().size() + 1; // +1 since ports start from <prefix>1
Toshihiro Shimizu 890ddd
		 !m_actualFx->addInputPort(group->portsPrefix() + QString::number(n).toStdString(), port, groupIdx);
Toshihiro Shimizu 890ddd
		 ++n)
Toshihiro Shimizu 890ddd
		;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxSchematicNode::removeDynamicInputPort(const std::string &name) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_actualFx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *port = m_actualFx->getInputPort(name); // Must retrieve the port to access its infos
Toshihiro Shimizu 890ddd
	if (!port || port->getFx() || port->getGroupIndex() < 0) {
Toshihiro Shimizu 890ddd
		assert(port && !port->isConnected() && port->getGroupIndex() >= 0);
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_actualFx->removeInputPort(name);
Toshihiro Shimizu 890ddd
	//delete port;                                                // TFxPortDG owns it - so it would be wrong
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::shiftLinks() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct locals {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Advances p along the ports array, stopping at the first port in the group with the specified
Toshihiro Shimizu 890ddd
		// connection state. Returns whether the port index is in the ports array range.
Toshihiro Shimizu 890ddd
		static inline bool moveToNext(const TFxPortDG &group, bool connected, int &p)
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			int pCount = group.ports().size();
Toshihiro Shimizu 890ddd
			while (p < pCount && (group.ports()[p]->isConnected() != connected))
Toshihiro Shimizu 890ddd
				++p;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return (p < pCount);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	}; // locals
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_actualFx);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Treat each dynamic port group individually
Toshihiro Shimizu 890ddd
	int g, gCount = m_actualFx->dynamicPortGroupsCount();
Toshihiro Shimizu 890ddd
	for (g = 0; g != gCount; ++g) {
Toshihiro Shimizu 890ddd
		const TFxPortDG *group = m_actualFx->dynamicPortGroup(g);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Traverse fx ports, moving all the group links to the front
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// First, couple empty and not-empty ports manually
Toshihiro Shimizu 890ddd
		int e = 0;
Toshihiro Shimizu 890ddd
		locals::moveToNext(*group, false, e); // manual advance
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int ne = e + 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (locals::moveToNext(*group, true, ne)) // manual advance
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			do {
Toshihiro Shimizu 890ddd
				// Swap links between the empty and not-empty ports
Toshihiro Shimizu 890ddd
				TFxPort *ePort = group->ports()[e];
Toshihiro Shimizu 890ddd
				TFxPort *nePort = group->ports()[ne];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				ePort->setFx(nePort->getFx());
Toshihiro Shimizu 890ddd
				nePort->setFx(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				++e, ++ne;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				// Then, advance coupled from there
Toshihiro Shimizu 890ddd
			} while (locals::moveToNext(*group, false, e) &&
Toshihiro Shimizu 890ddd
					 locals::moveToNext(*group, true, ne));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::updateOutputDockToolTips(const QString &name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicPort *outPort = getOutputPort();
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < outPort->getLinkCount(); i++) {
Toshihiro Shimizu 890ddd
		SchematicLink *link = outPort->getLink(i);
Toshihiro Shimizu 890ddd
		if (!link)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		SchematicPort *linkedPort = link->getOtherPort(outPort);
Toshihiro Shimizu 890ddd
		assert(linkedPort);
Toshihiro Shimizu 890ddd
		FxSchematicPort *linkedFxPort = dynamic_cast<FxSchematicPort *>(linkedPort);
Toshihiro Shimizu 890ddd
		FxSchematicDock *linkedFxDock = linkedFxPort->getDock();
Toshihiro Shimizu 890ddd
		linkedFxDock->setToolTip(name);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNode::updatePortsPosition()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	struct locals {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		struct PositionAssigner {
Toshihiro Shimizu 890ddd
			double m_lastYPos;
Toshihiro Shimizu 890ddd
			bool isLarge;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			inline void assign(FxSchematicDock *dock)
Toshihiro Shimizu 890ddd
			{
Toshihiro Shimizu 890ddd
				dock->setPos(0, m_lastYPos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				if (isLarge)
Toshihiro Shimizu 890ddd
					m_lastYPos += dock->boundingRect().height();
Toshihiro Shimizu 890ddd
				else
Toshihiro Shimizu 890ddd
					m_lastYPos += dock->boundingRect().height() + 4; // 4 is margin
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	}; // locals
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	locals::PositionAssigner positioner;
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		positioner.m_lastYPos = m_height;
Toshihiro Shimizu 890ddd
		positioner.isLarge = true;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		positioner.m_lastYPos = 0;
Toshihiro Shimizu 890ddd
		positioner.isLarge = false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!(m_actualFx && m_actualFx->hasDynamicPortGroups())) {
Toshihiro Shimizu 890ddd
		// 'Fake' or common schematic fx nodes can just list the prepared m_inDocks
Toshihiro Shimizu 890ddd
		// container incrementally
Toshihiro Shimizu 890ddd
		for (int i = 0; i != m_inDocks.size(); ++i)
Toshihiro Shimizu 890ddd
			positioner.assign(m_inDocks[i]);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		// Otherwise, port groups must be treated
Toshihiro Shimizu 890ddd
		assert(m_inDocks.size() == m_actualFx->getInputPortCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int incrementalGroupIndex = -1; // We'll assume that groups are encountered
Toshihiro Shimizu 890ddd
										// incrementally (requires not ill-formed fxs).
Toshihiro Shimizu 890ddd
		int p, pCount = m_actualFx->getInputPortCount();
Toshihiro Shimizu 890ddd
		for (p = 0; p != pCount; ++p) {
Toshihiro Shimizu 890ddd
			int g = m_actualFx->getInputPort(p)->getGroupIndex();
Toshihiro Shimizu 890ddd
			if (g < 0)
Toshihiro Shimizu 890ddd
				positioner.assign(m_inDocks[p]); // The port is in no group - just add it
Toshihiro Shimizu 890ddd
			else if (g > incrementalGroupIndex) {
Toshihiro Shimizu 890ddd
				// Position the whole group
Toshihiro Shimizu 890ddd
				incrementalGroupIndex = g;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				for (int gp = p; gp != pCount; ++gp)
Toshihiro Shimizu 890ddd
					if (m_actualFx->getInputPort(gp)->getGroupIndex() == g)
Toshihiro Shimizu 890ddd
						positioner.assign(m_inDocks[gp]);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicOutputNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicOutputNode::FxSchematicOutputNode(FxSchematicScene *scene, TOutputFx *fx)
Toshihiro Shimizu 890ddd
	: FxSchematicNode(scene, fx, 67, 18, eOutpuFx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// resize if small scaled
Toshihiro Shimizu 890ddd
	if (!m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		setWidth(60);
Toshihiro Shimizu 890ddd
		setHeight(36);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
	m_outDock = 0;
Toshihiro Shimizu 890ddd
	m_linkDock = 0;
Toshihiro Shimizu 890ddd
	FxSchematicDock *inDock = new FxSchematicDock(this, "", 0, eFxInputPort);
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled)
Toshihiro Shimizu 890ddd
		inDock->setPos(0, 2);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		inDock->setPos(0, 0);
Toshihiro Shimizu 890ddd
	inDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_inDocks.push_back(inDock);
Toshihiro Shimizu 890ddd
	addPort(0, inDock->getPort());
Toshihiro Shimizu 890ddd
	m_outputPainter = new FxOutputPainter(this, m_width, m_height);
Toshihiro Shimizu 890ddd
	m_outputPainter->setZValue(1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicOutputNode::~FxSchematicOutputNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicOutputNode::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicOutputNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode::paint(painter, option, widget);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicOutputNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QAction *outputSettingsPopup = CommandManager::instance()->getAction("MI_OutputSettings");
Toshihiro Shimizu 890ddd
	outputSettingsPopup->trigger();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicXSheetNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicXSheetNode::FxSchematicXSheetNode(FxSchematicScene *scene, TXsheetFx *fx)
Toshihiro Shimizu 890ddd
	: FxSchematicNode(scene, fx, 90, 18, eXSheetFx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		setWidth(70);
Toshihiro Shimizu 890ddd
		setHeight(36);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
	m_linkDock = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_outDock = new FxSchematicDock(this, "", 0, eFxOutputPort);
Toshihiro Shimizu 890ddd
	FxSchematicDock *inDock = new FxSchematicDock(this, "", 0, eFxInputPort);
Toshihiro Shimizu 890ddd
	m_xsheetPainter = new FxXSheetPainter(this, m_width, m_height);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addPort(0, m_outDock->getPort());
Toshihiro Shimizu 890ddd
	addPort(1, inDock->getPort());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_inDocks.push_back(inDock);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		m_outDock->setPos(72, 0);
Toshihiro Shimizu 890ddd
		inDock->setPos(0, 2);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_outDock->setPos(60, 0);
Toshihiro Shimizu 890ddd
		inDock->setPos(0, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_outDock->setZValue(2);
Toshihiro Shimizu 890ddd
	inDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_xsheetPainter->setZValue(1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicXSheetNode::~FxSchematicXSheetNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicXSheetNode::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicXSheetNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode::paint(painter, option, widget);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicXSheetNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QAction *sceneSettingsPopup = CommandManager::instance()->getAction("MI_SceneSettings");
Toshihiro Shimizu 890ddd
	sceneSettingsPopup->trigger();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicNormalFxNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//TODO: Fxの分類、各Fxに自己申告させるべき 2016/1/8 shun_iwasawa
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
bool isImageAdjustFx(string id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (id == "STD_toneCurveFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoChannelSelectorFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoDensityFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inohlsAddFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inohlsAdjustFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inohsvAddFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inohsvAdjustFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLevelAutoFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLevelMasterFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLevelrgbaFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoNegateFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_localTransparencyFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_multiToneFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_premultiplyFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_rgbmCutFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_rgbmFadeFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_rgbmScaleFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_sharpenFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_fadeFx")
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool isLayerBlendingFx(string id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (id == "STD_inoOverFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoCrossDissolveFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoDarkenFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoMultiplyFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoColorBurnFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLinearBurnFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoDarkerColorFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoAddFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLightenFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoScreenFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoColorDodgeFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLinearDodgeFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLighterColorFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoOverlayFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoSoftLightFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoHardLightFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoVividLightFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoLinearLightFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoPinLightFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoHardMixFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoDivideFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_inoSubtractFx")
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool isMatteFx(string id)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (id == "STD_hsvKeyFx" ||
Toshihiro Shimizu 890ddd
		id == "inFx" ||
Toshihiro Shimizu 890ddd
		id == "outFx" ||
Toshihiro Shimizu 890ddd
		id == "STD_rgbKeyFx" ||
Toshihiro Shimizu 890ddd
		id == "atopFx")
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicNormalFxNode::FxSchematicNormalFxNode(FxSchematicScene *scene, TFx *fx)
Toshihiro Shimizu 890ddd
	: FxSchematicNode(scene, fx, 90, 32, eNormalFx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	checkDynamicInputPortSize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//resize if small scaled
Toshihiro Shimizu 890ddd
	if (!m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		setWidth(70);
Toshihiro Shimizu 890ddd
		setHeight(50);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TMacroFx *macroFx = dynamic_cast<TMacroFx *>(fx);
Toshihiro Shimizu 890ddd
	if (macroFx) {
Toshihiro Shimizu 890ddd
		m_type = eMacroFx;
Toshihiro Shimizu 890ddd
		vector<TFxP> fxs = macroFx->getFxs();
Toshihiro Shimizu 890ddd
		bool enable = false;
Toshihiro Shimizu 890ddd
		int i;
Toshihiro Shimizu 890ddd
		for (i = 0; i < (int)fxs.size(); i++)
Toshihiro Shimizu 890ddd
			enable = enable || fxs[i]->getAttributes()->isEnabled();
Toshihiro Shimizu 890ddd
		macroFx->getAttributes()->enable(enable);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_name = QString::fromStdWString(fx->getName());
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//set fx type
Toshihiro Shimizu 890ddd
	string id = fx->getFxType();
Toshihiro Shimizu 890ddd
	if (isImageAdjustFx(id))
Toshihiro Shimizu 890ddd
		m_type = eNormalImageAdjustFx;
Toshihiro Shimizu 890ddd
	else if (isLayerBlendingFx(id))
Toshihiro Shimizu 890ddd
		m_type = eNormalLayerBlendingFx;
Toshihiro Shimizu 890ddd
	else if (isMatteFx(id))
Toshihiro Shimizu 890ddd
		m_type = eNormalMatteFx;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem = new SchematicName(this, 72, 20); //for rename
Toshihiro Shimizu 890ddd
	m_outDock = new FxSchematicDock(this, "", 0, eFxOutputPort);
Toshihiro Shimizu 890ddd
	m_linkDock = new FxSchematicDock(this, "", 0, eFxLinkPort);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_renderToggle = new SchematicToggle(this, QPixmap(":Resources/schematic_prev_eye.png"), 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_painter = new FxPainter(this, m_width, m_height, m_name, m_type, fx->getFxType());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
	//-----
Toshihiro Shimizu 890ddd
	m_nameItem->setName(m_name);
Toshihiro Shimizu 890ddd
	m_renderToggle->setIsActive(m_fx->getAttributes()->isEnabled());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addPort(0, m_outDock->getPort());
Toshihiro Shimizu 890ddd
	addPort(-1, m_linkDock->getPort());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(1, -1);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(72, 14);
Toshihiro Shimizu 890ddd
		m_linkDock->setPos(72, 7);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(72, 0);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		QFont fnt = m_nameItem->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		m_nameItem->setFont(fnt);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(-1, 0);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(60, 0);
Toshihiro Shimizu 890ddd
		m_linkDock->setPos(60, -5);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(35, -5);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem->setZValue(3);
Toshihiro Shimizu 890ddd
	m_outDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_linkDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_renderToggle->setZValue(2);
Toshihiro Shimizu 890ddd
	m_painter->setZValue(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
Toshihiro Shimizu 890ddd
	connect(m_renderToggle, SIGNAL(toggled(bool)), this, SLOT(onRenderToggleClicked(bool)));
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int i, inputPorts = fx->getInputPortCount();
Toshihiro Shimizu 890ddd
	double lastPosY = (m_isLargeScaled) ? m_height : 0;
Toshihiro Shimizu 890ddd
	for (i = 0; i < inputPorts; i++) {
Toshihiro Shimizu 890ddd
		string portName = fx->getInputPortName(i);
Toshihiro Shimizu 890ddd
		QString qPortName = QString::fromStdString(portName);
Toshihiro Shimizu 890ddd
		QString toolTip = "";
Toshihiro Shimizu 890ddd
		if (isA(eMacroFx)) {
Toshihiro Shimizu 890ddd
			//Add a Tool Tip to the Dock showing the name of the port and the original fx id.
Toshihiro Shimizu 890ddd
			int firstIndex = qPortName.indexOf("_");
Toshihiro Shimizu 890ddd
			int secondIndex = qPortName.indexOf("_", firstIndex + 1);
Toshihiro Shimizu 890ddd
			qPortName.remove(qPortName.indexOf("_"), secondIndex - firstIndex);
Toshihiro Shimizu 890ddd
			toolTip = qPortName;
Toshihiro Shimizu 890ddd
			toolTip.replace("_", "(");
Toshihiro Shimizu 890ddd
			toolTip.append(")");
Toshihiro Shimizu 890ddd
			QString qInMacroFxId = qPortName;
Toshihiro Shimizu 890ddd
			qInMacroFxId.remove(0, qInMacroFxId.indexOf("_") + 1);
Toshihiro Shimizu 890ddd
			vector<TFxP> macroFxs = macroFx->getFxs();
Toshihiro Shimizu 890ddd
			int j;
Toshihiro Shimizu 890ddd
			for (j = 0; j < (int)macroFxs.size(); j++) {
Toshihiro Shimizu 890ddd
				TFx *inMacroFx = macroFxs[j].getPointer();
Toshihiro Shimizu 890ddd
				if (inMacroFx->getFxId() == qInMacroFxId.toStdWString()) {
Toshihiro Shimizu 890ddd
					int count = inMacroFx->getInputPortCount();
Toshihiro Shimizu 890ddd
					if (count == 1)
Toshihiro Shimizu 890ddd
						qPortName = qInMacroFxId;
Toshihiro Shimizu 890ddd
					else {
Toshihiro Shimizu 890ddd
						qPortName.remove(1, qPortName.size());
Toshihiro Shimizu 890ddd
						qPortName += ". " + qInMacroFxId;
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		FxSchematicDock *inDock;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
			inDock = new FxSchematicDock(this, qPortName, m_width - 18, eFxInputPort);
Toshihiro Shimizu 890ddd
			inDock->setPos(0, lastPosY);
Toshihiro Shimizu 890ddd
			lastPosY += inDock->boundingRect().height();
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			inDock = new FxSchematicDock(this, qPortName, 10, eFxInputPort);
Toshihiro Shimizu 890ddd
			inDock->setPos(0, lastPosY);
Toshihiro Shimizu 890ddd
			lastPosY += inDock->boundingRect().height() + 4; //4 is margin
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		inDock->setZValue(2);
Toshihiro Shimizu 890ddd
		m_inDocks.push_back(inDock);
Toshihiro Shimizu 890ddd
		addPort(i + 1, inDock->getPort());
Toshihiro Shimizu 890ddd
		if (toolTip != "")
Toshihiro Shimizu 890ddd
			inDock->setToolTip(toolTip);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicNormalFxNode::~FxSchematicNormalFxNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicNormalFxNode::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNormalFxNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode::paint(painter, option, widget);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNormalFxNode::onNameChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
	m_name = m_nameItem->toPlainText();
Toshihiro Shimizu 890ddd
	m_painter->setName(m_name);
Toshihiro Shimizu 890ddd
	setToolTip(m_name);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, true);
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFxCommand::renameFx(m_fx.getPointer(), m_name.toStdWString(), fxScene->getXsheetHandle());
Toshihiro Shimizu 890ddd
	updateOutputDockToolTips(m_name);
Toshihiro Shimizu 890ddd
	emit sceneChanged();
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNormalFxNode::onRenderToggleClicked(bool value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_fx->getAttributes()->enable(value);
Toshihiro Shimizu 890ddd
	TMacroFx *macro = dynamic_cast<TMacroFx *>(m_fx.getPointer());
Toshihiro Shimizu 890ddd
	if (macro) {
Toshihiro Shimizu 890ddd
		vector<TFxP> fxs = macro->getFxs();
Toshihiro Shimizu 890ddd
		int i;
Toshihiro Shimizu 890ddd
		for (i = 0; i < (int)fxs.size(); i++)
Toshihiro Shimizu 890ddd
			fxs[i]->getAttributes()->enable(value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
	emit sceneChanged();
Toshihiro Shimizu 890ddd
	emit xsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNormalFxNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QRectF nameArea(0, 0, m_width, 14);
Toshihiro Shimizu 890ddd
	if (nameArea.contains(me->pos()) && me->modifiers() == Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
		m_nameItem->setPlainText(m_name);
Toshihiro Shimizu 890ddd
		m_nameItem->show();
Toshihiro Shimizu 890ddd
		m_nameItem->setFocus();
Toshihiro Shimizu 890ddd
		setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		QAction *fxEitorPopup = CommandManager::instance()->getAction("MI_FxParamEditor");
Toshihiro Shimizu 890ddd
		fxEitorPopup->trigger();
Toshihiro Shimizu 890ddd
		//this signal cause the update the contents of the FxSettings
Toshihiro Shimizu 890ddd
		emit fxNodeDoubleClicked();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicNormalFxNode::resize(bool maximized)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicZeraryNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicZeraryNode::FxSchematicZeraryNode(FxSchematicScene *scene, TZeraryColumnFx *fx)
Toshihiro Shimizu 890ddd
	: FxSchematicNode(scene, fx, 90, 32, eZeraryFx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	checkDynamicInputPortSize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		setWidth(90);
Toshihiro Shimizu 890ddd
		setHeight(50);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_columnIndex = fx->getColumnIndex();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFx *zeraryFx = fx->getZeraryFx();
Toshihiro Shimizu 890ddd
	TStageObjectId id = TStageObjectId::ColumnId(m_columnIndex);
Toshihiro Shimizu 890ddd
	string name = scene->getXsheet()->getStageObject(id)->getName();
Toshihiro Shimizu 890ddd
	m_name = QString::fromStdString(name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem = new SchematicName(this, 72, 20); //for rename
Toshihiro Shimizu 890ddd
	m_outDock = new FxSchematicDock(this, "", 0, eFxOutputPort);
Toshihiro Shimizu 890ddd
	m_linkDock = new FxSchematicDock(this, "", 0, eFxLinkPort);
Toshihiro Shimizu 890ddd
	m_renderToggle = new SchematicToggle(this, QPixmap(":Resources/schematic_prev_eye.png"), SchematicToggle::eIsParentColumn, m_isLargeScaled);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//get the fx icons according to the fx type
Toshihiro Shimizu 890ddd
	m_painter = new FxPainter(this, m_width, m_height, m_name, m_type, zeraryFx->getFxType());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//---
Toshihiro Shimizu 890ddd
	m_nameItem->setName(m_name);
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addPort(0, m_outDock->getPort());
Toshihiro Shimizu 890ddd
	addPort(-1, m_linkDock->getPort());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TXshColumn *column = scene->getXsheet()->getColumn(m_columnIndex);
Toshihiro Shimizu 890ddd
	if (column)
Toshihiro Shimizu 890ddd
		m_renderToggle->setIsActive(column->isPreviewVisible());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// define positions
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(1, -1);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(72, 14);
Toshihiro Shimizu 890ddd
		m_linkDock->setPos(72, m_height);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(72, 0);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		QFont fnt = m_nameItem->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		m_nameItem->setFont(fnt);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(-1, 0);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(80, 0);
Toshihiro Shimizu 890ddd
		m_linkDock->setPos(80, -5);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(55, -5);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem->setZValue(3);
Toshihiro Shimizu 890ddd
	m_outDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_renderToggle->setZValue(2);
Toshihiro Shimizu 890ddd
	m_painter->setZValue(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
Toshihiro Shimizu 890ddd
	connect(m_renderToggle, SIGNAL(toggled(bool)), this, SLOT(onRenderToggleClicked(bool)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (zeraryFx) {
Toshihiro Shimizu 890ddd
		int i, inputPorts = zeraryFx->getInputPortCount();
Toshihiro Shimizu 890ddd
		double lastPosY = (m_isLargeScaled) ? m_height : 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (i = 0; i < inputPorts; i++) {
Toshihiro Shimizu 890ddd
			FxSchematicDock *inDock;
Toshihiro Shimizu 890ddd
			if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
				inDock = new FxSchematicDock(this, QString::fromStdString(zeraryFx->getInputPortName(i)), m_width - 18, eFxInputPort);
Toshihiro Shimizu 890ddd
				inDock->setPos(0, lastPosY);
Toshihiro Shimizu 890ddd
				lastPosY += inDock->boundingRect().height();
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				inDock = new FxSchematicDock(this, QString::fromStdString(zeraryFx->getInputPortName(i)), 10, eFxInputPort);
Toshihiro Shimizu 890ddd
				inDock->setPos(0, lastPosY);
Toshihiro Shimizu 890ddd
				lastPosY += inDock->boundingRect().height() + 4; //4 is margin
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			m_inDocks.push_back(inDock);
Toshihiro Shimizu 890ddd
			addPort(i + 1, inDock->getPort());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updatePortsPosition();
Toshihiro Shimizu 890ddd
	updateLinksGeometry();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicZeraryNode::~FxSchematicZeraryNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicZeraryNode::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicZeraryNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode::paint(painter, option, widget);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicZeraryNode::onRenderToggleClicked(bool toggled)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TXshColumn *column = fxScene->getXsheet()->getColumn(m_columnIndex);
Toshihiro Shimizu 890ddd
	if (column) {
Toshihiro Shimizu 890ddd
		column->setPreviewVisible(toggled);
Toshihiro Shimizu 890ddd
		emit sceneChanged();
Toshihiro Shimizu 890ddd
		emit xsheetChanged();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxSchematicZeraryNode::isCached() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TZeraryColumnFx *zfx = dynamic_cast<TZeraryColumnFx *>(m_fx.getPointer());
Toshihiro Shimizu 890ddd
	if (!zfx)
Toshihiro Shimizu 890ddd
		return TPassiveCacheManager::instance()->cacheEnabled(m_fx.getPointer());
Toshihiro Shimizu 890ddd
	TFx *zeraryFx = zfx->getZeraryFx();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (zeraryFx)
Toshihiro Shimizu 890ddd
		return TPassiveCacheManager::instance()->cacheEnabled(zeraryFx);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return TPassiveCacheManager::instance()->cacheEnabled(m_fx.getPointer());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicZeraryNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QAction *fxEditorPopup = CommandManager::instance()->getAction("MI_FxParamEditor");
Toshihiro Shimizu 890ddd
	fxEditorPopup->trigger();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//this signal cause the update the contents of the FxSettings
Toshihiro Shimizu 890ddd
	emit fxNodeDoubleClicked();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicZeraryNode::onNameChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
	m_name = m_nameItem->toPlainText();
Toshihiro Shimizu 890ddd
	m_painter->setName(m_name);
Toshihiro Shimizu 890ddd
	setToolTip(m_name);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, true);
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFxCommand::renameFx(m_fx.getPointer(), m_name.toStdWString(), fxScene->getXsheetHandle());
Toshihiro Shimizu 890ddd
	updateOutputDockToolTips(m_name);
Toshihiro Shimizu 890ddd
	emit sceneChanged();
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicZeraryNode::resize(bool maximized)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicColumnNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicColumnNode::FxSchematicColumnNode(FxSchematicScene *scene, TLevelColumnFx *fx)
Toshihiro Shimizu 890ddd
	: FxSchematicNode(scene, fx, 90, 32, eColumnFx), m_isOpened(false) //iwasawa
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		setWidth(90);
Toshihiro Shimizu 890ddd
		setHeight(50);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_columnIndex = fx->getColumnIndex();
Toshihiro Shimizu 890ddd
	TStageObjectId id = TStageObjectId::ColumnId(m_columnIndex);
Toshihiro Shimizu 890ddd
	string name = scene->getXsheet()->getStageObject(id)->getName();
Toshihiro Shimizu 890ddd
	m_name = QString::fromStdString(name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_resizeItem = new SchematicThumbnailToggle(this, fx->getAttributes()->isOpened()); //サムネイル矢印
Toshihiro Shimizu 890ddd
	m_nameItem = new SchematicName(this, 54, 20);										//リネーム部分
Toshihiro Shimizu 890ddd
	m_outDock = new FxSchematicDock(this, "", 0, eFxOutputPort);						//Outポート
Toshihiro Shimizu 890ddd
	m_renderToggle = new SchematicToggle(this, QPixmap(":Resources/schematic_prev_eye.png"), SchematicToggle::eIsParentColumn, m_isLargeScaled);
Toshihiro Shimizu 890ddd
	m_cameraStandToggle = new SchematicToggle(this, QPixmap(":Resources/schematic_table_view.png"), QPixmap(":Resources/schematic_table_view_transp.png"), SchematicToggle::eIsParentColumn | SchematicToggle::eEnableNullState, m_isLargeScaled);
Toshihiro Shimizu 890ddd
	m_columnPainter = new FxColumnPainter(this, m_width, m_height, m_name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//no link port
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
	m_linkDock = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//-----
Toshihiro Shimizu 890ddd
	m_nameItem->setName(m_name);
Toshihiro Shimizu 890ddd
	setToolTip(m_name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addPort(0, m_outDock->getPort());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
	TXshColumn *column = scene->getXsheet()->getColumn(m_columnIndex);
Toshihiro Shimizu 890ddd
	if (column) {
Toshihiro Shimizu 890ddd
		m_renderToggle->setIsActive(column->isPreviewVisible());
Toshihiro Shimizu 890ddd
		m_cameraStandToggle->setState(column->isCamstandVisible() ? (column->getOpacity() < 255 ? 2 : 1) : 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// set geometry
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		m_resizeItem->setPos(2, 0);
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(16, -1);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(72, 14);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(72, 0);
Toshihiro Shimizu 890ddd
		m_cameraStandToggle->setPos(72, 7);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_resizeItem->hide();
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(0, 0);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(80, 0);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(60, -5);
Toshihiro Shimizu 890ddd
		m_cameraStandToggle->setPos(30, -5);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_resizeItem->setZValue(2);
Toshihiro Shimizu 890ddd
	m_nameItem->setZValue(2);
Toshihiro Shimizu 890ddd
	m_outDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_renderToggle->setZValue(2);
Toshihiro Shimizu 890ddd
	m_cameraStandToggle->setZValue(2);
Toshihiro Shimizu 890ddd
	m_columnPainter->setZValue(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool ret = true;
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_resizeItem, SIGNAL(toggled(bool)), this, SLOT(onChangedSize(bool)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_renderToggle, SIGNAL(toggled(bool)), this, SLOT(onRenderToggleClicked(bool)));
Toshihiro Shimizu 890ddd
	ret = ret && connect(m_cameraStandToggle, SIGNAL(stateChanged(int)), this, SLOT(onCameraStandToggleClicked(int)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(ret);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	onChangedSize(fx->getAttributes()->isOpened());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicColumnNode::~FxSchematicColumnNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicColumnNode::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_isOpened && m_isLargeScaled)
Toshihiro Shimizu 890ddd
		return QRectF(-5, -54, m_width + 10, m_height + 59);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode::paint(painter, option, widget);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::onRenderToggleClicked(bool toggled)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TXshColumn *column = fxScene->getXsheet()->getColumn(m_columnIndex);
Toshihiro Shimizu 890ddd
	if (column) {
Toshihiro Shimizu 890ddd
		column->setPreviewVisible(toggled);
Toshihiro Shimizu 890ddd
		emit sceneChanged();
Toshihiro Shimizu 890ddd
		emit xsheetChanged();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::onCameraStandToggleClicked(int state)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TXshColumn *column = fxScene->getXsheet()->getColumn(m_columnIndex);
Toshihiro Shimizu 890ddd
	if (column) {
Toshihiro Shimizu 890ddd
		column->setCamstandVisible(!column->isCamstandVisible());
Toshihiro Shimizu 890ddd
		//column->setCamstandVisible(toggled);
Toshihiro Shimizu 890ddd
		emit sceneChanged();
Toshihiro Shimizu 890ddd
		emit xsheetChanged();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QPixmap FxSchematicColumnNode::getPixmap()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return QPixmap();
Toshihiro Shimizu 890ddd
	TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
	if (xsh && !xsh->isColumnEmpty(m_columnIndex)) {
Toshihiro Shimizu 890ddd
		int r0, r1;
Toshihiro Shimizu 890ddd
		xsh->getCellRange(m_columnIndex, r0, r1);
Toshihiro Shimizu 890ddd
		if (r1 >= r0) {
Toshihiro Shimizu 890ddd
			TXshCell cell = xsh->getCell(r0, m_columnIndex);
Toshihiro Shimizu 890ddd
			TXshLevel *xl = cell.m_level.getPointer();
Toshihiro Shimizu 890ddd
			if (xl)
Toshihiro Shimizu 890ddd
				return IconGenerator::instance()->getIcon(xl, cell.m_frameId, false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return QPixmap();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//--------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::getLevelTypeAndName(int &ltype, QString &levelName)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene) {
Toshihiro Shimizu 890ddd
		ltype = NO_XSHLEVEL;
Toshihiro Shimizu 890ddd
		levelName = QString();
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
	if (xsh && !xsh->isColumnEmpty(m_columnIndex)) {
Toshihiro Shimizu 890ddd
		int r0, r1;
Toshihiro Shimizu 890ddd
		xsh->getCellRange(m_columnIndex, r0, r1);
Toshihiro Shimizu 890ddd
		if (r1 >= r0) {
Toshihiro Shimizu 890ddd
			TXshCell cell = xsh->getCell(r0, m_columnIndex);
Toshihiro Shimizu 890ddd
			TXshLevel *xl = cell.m_level.getPointer();
Toshihiro Shimizu 890ddd
			if (xl) {
Toshihiro Shimizu 890ddd
				ltype = cell.m_level->getType();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				levelName = QString::fromStdWString(xl->getName());
Toshihiro Shimizu 890ddd
				return;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ltype = NO_XSHLEVEL;
Toshihiro Shimizu 890ddd
	levelName = QString();
Toshihiro Shimizu 890ddd
	return;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::onChangedSize(bool expand)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	prepareGeometryChange();
Toshihiro Shimizu 890ddd
	m_isOpened = expand;
Toshihiro Shimizu 890ddd
	m_fx->getAttributes()->setIsOpened(m_isOpened);
Toshihiro Shimizu 890ddd
	m_height = (m_isLargeScaled) ? 32 : 50;
Toshihiro Shimizu 890ddd
	updateLinksGeometry();
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::onNameChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
	m_name = m_nameItem->toPlainText();
Toshihiro Shimizu 890ddd
	m_columnPainter->setName(m_name);
Toshihiro Shimizu 890ddd
	setToolTip(m_name);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStageObjectId id = TStageObjectId::ColumnId(m_columnIndex);
Toshihiro Shimizu 890ddd
	renameObject(id, m_name.toStdString());
Toshihiro Shimizu 890ddd
	updateOutputDockToolTips(m_name);
Toshihiro Shimizu 890ddd
	emit sceneChanged();
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::resize(bool maximized)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_resizeItem->setIsDown(!maximized);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QRectF nameArea(14, 0, m_width - 15, 14);
Toshihiro Shimizu 890ddd
	if (nameArea.contains(me->pos()) && me->modifiers() == Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
		TStageObjectId id = TStageObjectId::ColumnId(m_columnIndex);
Toshihiro Shimizu 890ddd
		FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
		if (!fxScene)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		TStageObject *pegbar = fxScene->getXsheet()->getStageObject(id);
Toshihiro Shimizu 890ddd
		if (!pegbar)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		m_name = QString::fromStdString(pegbar->getName());
Toshihiro Shimizu 890ddd
		m_nameItem->setPlainText(m_name);
Toshihiro Shimizu 890ddd
		m_nameItem->show();
Toshihiro Shimizu 890ddd
		m_nameItem->setFocus();
Toshihiro Shimizu 890ddd
		setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicColumnNode::renameObject(const TStageObjectId &id, string name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TStageObjectCmd::rename(id, name, fxScene->getXsheetHandle());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxSchematicPaletteNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicPaletteNode::FxSchematicPaletteNode(FxSchematicScene *scene, TPaletteColumnFx *fx)
Toshihiro Shimizu 890ddd
	: FxSchematicNode(scene, fx, 90, 32, eColumnFx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		setWidth(90);
Toshihiro Shimizu 890ddd
		setHeight(50);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_columnIndex = fx->getColumnIndex();
Toshihiro Shimizu 890ddd
	TStageObjectId id = TStageObjectId::ColumnId(m_columnIndex);
Toshihiro Shimizu 890ddd
	string name = scene->getXsheet()->getStageObject(id)->getFullName();
Toshihiro Shimizu 890ddd
	m_name = QString::fromStdString(name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
	m_linkDock = 0;
Toshihiro Shimizu 890ddd
	m_nameItem = new SchematicName(this, 54, 20); // for rename
Toshihiro Shimizu 890ddd
	m_outDock = new FxSchematicDock(this, "", 0, eFxOutputPort);
Toshihiro Shimizu 890ddd
	m_renderToggle = new SchematicToggle(this, QPixmap(":Resources/schematic_prev_eye.png"), SchematicToggle::eIsParentColumn, m_isLargeScaled);
Toshihiro Shimizu 890ddd
	m_palettePainter = new FxPalettePainter(this, m_width, m_height, m_name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//----
Toshihiro Shimizu 890ddd
	QString paletteName = getPaletteName();
Toshihiro Shimizu 890ddd
	setToolTip(QString("%1 : %2").arg(m_name, paletteName));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem->setName(m_name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addPort(0, m_outDock->getPort());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TXshColumn *column = scene->getXsheet()->getColumn(m_columnIndex);
Toshihiro Shimizu 890ddd
	if (column)
Toshihiro Shimizu 890ddd
		m_renderToggle->setIsActive(column->isPreviewVisible());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//set geometry
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(19, -1);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(72, 14);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(72, 0);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		QFont fnt = m_nameItem->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		m_nameItem->setFont(fnt);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(-1, 0);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(80, 0);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(60, -5);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem->setZValue(2);
Toshihiro Shimizu 890ddd
	m_outDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_renderToggle->setZValue(2);
Toshihiro Shimizu 890ddd
	m_palettePainter->setZValue(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
Toshihiro Shimizu 890ddd
	connect(m_renderToggle, SIGNAL(toggled(bool)), this, SLOT(onRenderToggleClicked(bool)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
	prepareGeometryChange();
Toshihiro Shimizu 890ddd
	m_fx->getAttributes()->setIsOpened(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString FxSchematicPaletteNode::getPaletteName()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene) {
Toshihiro Shimizu 890ddd
		return QString();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
	if (xsh && !xsh->isColumnEmpty(m_columnIndex)) {
Toshihiro Shimizu 890ddd
		int r0, r1;
Toshihiro Shimizu 890ddd
		xsh->getCellRange(m_columnIndex, r0, r1);
Toshihiro Shimizu 890ddd
		if (r1 >= r0) {
Toshihiro Shimizu 890ddd
			TXshCell cell = xsh->getCell(r0, m_columnIndex);
Toshihiro Shimizu 890ddd
			TXshLevel *xl = cell.m_level.getPointer();
Toshihiro Shimizu 890ddd
			if (xl) {
Toshihiro Shimizu 890ddd
				return QString::fromStdWString(xl->getName());
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QString();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxSchematicPaletteNode::~FxSchematicPaletteNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxSchematicPaletteNode::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPaletteNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicNode::paint(painter, option, widget);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPaletteNode::onRenderToggleClicked(bool toggled)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TXshColumn *column = fxScene->getXsheet()->getColumn(m_columnIndex);
Toshihiro Shimizu 890ddd
	if (column) {
Toshihiro Shimizu 890ddd
		column->setPreviewVisible(toggled);
Toshihiro Shimizu 890ddd
		emit sceneChanged();
Toshihiro Shimizu 890ddd
		emit xsheetChanged();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QPixmap FxSchematicPaletteNode::getPixmap()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QPixmap();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPaletteNode::onNameChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
	m_name = m_nameItem->toPlainText();
Toshihiro Shimizu 890ddd
	m_palettePainter->setName(m_name);
Toshihiro Shimizu 890ddd
	setToolTip(m_name);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStageObjectId id = TStageObjectId::ColumnId(m_columnIndex);
Toshihiro Shimizu 890ddd
	renameObject(id, m_name.toStdString());
Toshihiro Shimizu 890ddd
	updateOutputDockToolTips(m_name);
Toshihiro Shimizu 890ddd
	emit sceneChanged();
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPaletteNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QRectF nameArea(18, 2, 54, 14);
Toshihiro Shimizu 890ddd
	if (nameArea.contains(me->pos()) && me->modifiers() == Qt::ControlModifier) {
Toshihiro Shimizu 890ddd
		m_nameItem->setPlainText(m_name);
Toshihiro Shimizu 890ddd
		m_nameItem->show();
Toshihiro Shimizu 890ddd
		m_nameItem->setFocus();
Toshihiro Shimizu 890ddd
		setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		QAction *fxEitorPopup = CommandManager::instance()->getAction("MI_FxParamEditor");
Toshihiro Shimizu 890ddd
		fxEitorPopup->trigger();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxSchematicPaletteNode::renameObject(const TStageObjectId &id, string name)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TStageObjectCmd::rename(id, name, fxScene->getXsheetHandle());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//FxGroupNode
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//*****************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxGroupNode::FxGroupNode(FxSchematicScene *scene, const QList<TFxP> &groupedFx, const QList<TFxP> &roots, int groupId, const wstring &groupName)
Toshihiro Shimizu 890ddd
	: FxSchematicNode(scene, roots[0].getPointer(), 90, 32, eGroupedFx), m_groupId(groupId), m_groupedFxs(groupedFx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		setWidth(90);
Toshihiro Shimizu 890ddd
		setHeight(50);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_name = QString::fromStdWString(groupName);
Toshihiro Shimizu 890ddd
	m_roots = roots;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem = new SchematicName(this, 72, 20); //for rename
Toshihiro Shimizu 890ddd
	m_renderToggle = new SchematicToggle(this, QPixmap(":Resources/schematic_prev_eye.png"), SchematicToggle::eIsParentColumn, m_isLargeScaled);
Toshihiro Shimizu 890ddd
	m_outDock = new FxSchematicDock(this, "", 0, eFxGroupedOutPort);
Toshihiro Shimizu 890ddd
	FxSchematicDock *inDock = new FxSchematicDock(this, "Source", (m_isLargeScaled) ? m_width - 18 : 10, eFxGroupedInPort);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_painter = new FxPainter(this, m_width, m_height, m_name, m_type, roots[0]->getFxType());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_linkedNode = 0;
Toshihiro Shimizu 890ddd
	m_linkDock = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//-----
Toshihiro Shimizu 890ddd
	m_nameItem->setName(m_name);
Toshihiro Shimizu 890ddd
	m_renderToggle->setIsActive(m_fx->getAttributes()->isEnabled());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	addPort(0, m_outDock->getPort());
Toshihiro Shimizu 890ddd
	addPort(1, inDock->getPort());
Toshihiro Shimizu 890ddd
	m_inDocks.push_back(inDock);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//set geometry
Toshihiro Shimizu 890ddd
	if (m_isLargeScaled) {
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(1, -1);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(72, 0);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(72, 14);
Toshihiro Shimizu 890ddd
		inDock->setPos(0, m_height);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		QFont fnt = m_nameItem->font();
Toshihiro Shimizu 890ddd
		fnt.setPixelSize(fnt.pixelSize() * 2);
Toshihiro Shimizu 890ddd
		m_nameItem->setFont(fnt);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_nameItem->setPos(-1, 0);
Toshihiro Shimizu 890ddd
		m_renderToggle->setPos(60, -5);
Toshihiro Shimizu 890ddd
		m_outDock->setPos(80, 0);
Toshihiro Shimizu 890ddd
		inDock->setPos(0, 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_nameItem->setZValue(3);
Toshihiro Shimizu 890ddd
	m_renderToggle->setZValue(2);
Toshihiro Shimizu 890ddd
	m_outDock->setZValue(2);
Toshihiro Shimizu 890ddd
	inDock->setZValue(2);
Toshihiro Shimizu 890ddd
	m_painter->setZValue(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	connect(m_nameItem, SIGNAL(focusOut()), this, SLOT(onNameChanged()));
Toshihiro Shimizu 890ddd
	connect(m_renderToggle, SIGNAL(toggled(bool)), this, SLOT(onRenderToggleClicked(bool)));
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setPos(computePos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FxGroupNode::~FxGroupNode()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRectF FxGroupNode::boundingRect() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QRectF(-5, -5, m_width + 10, m_height + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxGroupNode::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//FxSchematicNode::paint(painter,option,widget);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxGroupNode::updateFxsDagPosition(const TPointD &pos) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QPointF qOldPos = computePos();
Toshihiro Shimizu 890ddd
	TPointD oldPos(qOldPos.x(), qOldPos.y());
Toshihiro Shimizu 890ddd
	TPointD delta = pos - oldPos;
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_groupedFxs.size(); i++) {
Toshihiro Shimizu 890ddd
		m_groupedFxs[i]->getAttributes()->setDagNodePos(m_groupedFxs[i]->getAttributes()->getDagNodePos() + delta);
Toshihiro Shimizu 890ddd
		TMacroFx *macro = dynamic_cast<TMacroFx *>(m_groupedFxs[i].getPointer());
Toshihiro Shimizu 890ddd
		if (macro) {
Toshihiro Shimizu 890ddd
			vector<TFxP> fxs = macro->getFxs();
Toshihiro Shimizu 890ddd
			int i;
Toshihiro Shimizu 890ddd
			for (i = 0; i < (int)fxs.size(); i++) {
Toshihiro Shimizu 890ddd
				TPointD oldP = fxs[i]->getAttributes()->getDagNodePos();
Toshihiro Shimizu 890ddd
				fxs[i]->getAttributes()->setDagNodePos(oldP + delta);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxGroupNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *me)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	QRectF nameArea(0, 0, m_width, 14);
Toshihiro Shimizu 890ddd
	if (nameArea.contains(me->pos())) {
Toshihiro Shimizu 890ddd
		m_nameItem->setPlainText(m_name);
Toshihiro Shimizu 890ddd
		m_nameItem->show();
Toshihiro Shimizu 890ddd
		m_nameItem->setFocus();
Toshihiro Shimizu 890ddd
		setFlag(QGraphicsItem::ItemIsSelectable, false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QPointF FxGroupNode::computePos() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i, notCounted = 0, fxCount = m_groupedFxs.size();
Toshihiro Shimizu 890ddd
	TPointD pos;
Toshihiro Shimizu 890ddd
	for (i = 0; i < fxCount; i++) {
Toshihiro Shimizu 890ddd
		TFx *fx = m_groupedFxs[i].getPointer();
Toshihiro Shimizu 890ddd
		TPointD fxPos = fx->getAttributes()->getDagNodePos();
Toshihiro Shimizu 890ddd
		if (fxPos != TConst::nowhere)
Toshihiro Shimizu 890ddd
			pos += fxPos;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			notCounted++;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	fxCount -= notCounted;
Toshihiro Shimizu 890ddd
	if (fxCount > 0)
Toshihiro Shimizu 890ddd
		return QPointF(pos.x / fxCount, pos.y / fxCount);
Toshihiro Shimizu 890ddd
	else if (fxCount == 0 && pos != TPointD())
Toshihiro Shimizu 890ddd
		return QPointF(pos.x, pos.y);
Toshihiro Shimizu 890ddd
	return QPointF(25000, 25000); //Qualcosa e' andato male... posiziono nel cebntro della scena per non far danni
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxGroupNode::onNameChanged()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_nameItem->hide();
Toshihiro Shimizu 890ddd
	m_name = m_nameItem->toPlainText();
Toshihiro Shimizu 890ddd
	m_painter->setName(m_name);
Toshihiro Shimizu 890ddd
	setToolTip(m_name);
Toshihiro Shimizu 890ddd
	setFlag(QGraphicsItem::ItemIsSelectable, true);
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	if (!fxScene)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFxCommand::renameGroup(m_groupedFxs.toStdList(), m_name.toStdWString(), false, fxScene->getXsheetHandle());
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxGroupNode::onRenderToggleClicked(bool value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_groupedFxs.size(); i++) {
Toshihiro Shimizu 890ddd
		TFxP fx = m_groupedFxs[i];
Toshihiro Shimizu 890ddd
		if (TLevelColumnFx *lcFx = dynamic_cast<TLevelColumnFx *>(fx.getPointer()))
Toshihiro Shimizu 890ddd
			lcFx->getColumn()->setPreviewVisible(value);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			fx->getAttributes()->enable(value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	update();
Toshihiro Shimizu 890ddd
	emit sceneChanged();
Toshihiro Shimizu 890ddd
	emit xsheetChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FxGroupNode::resize(bool maximized)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxGroupNode::contains(TFxP fx)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_groupedFxs.size(); i++) {
Toshihiro Shimizu 890ddd
		if (m_groupedFxs[i].getPointer() == fx.getPointer())
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int FxGroupNode::getOutputConnectionsCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FxSchematicScene *fxScene = dynamic_cast<FxSchematicScene *>(scene());
Toshihiro Shimizu 890ddd
	assert(fxScene);
Toshihiro Shimizu 890ddd
	TXsheet *xsh = fxScene->getXsheet();
Toshihiro Shimizu 890ddd
	assert(xsh);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int i, count = 0;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_roots.size(); i++) {
Toshihiro Shimizu 890ddd
		TFx *fx = m_roots[i].getPointer();
Toshihiro Shimizu 890ddd
		count += fx->getOutputConnectionCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (xsh->getFxDag()->getTerminalFxs()->containsFx(fx))
Toshihiro Shimizu 890ddd
			count++;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return count;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxGroupNode::isEnabled() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	bool isEnabled = true;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_roots.size(); i++) {
Toshihiro Shimizu 890ddd
		TFx *fx = m_roots[i].getPointer();
Toshihiro Shimizu 890ddd
		if (TZeraryColumnFx *zcFx = dynamic_cast<TZeraryColumnFx *>(fx))
Toshihiro Shimizu 890ddd
			isEnabled = isEnabled && zcFx->getColumn()->isPreviewVisible();
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			isEnabled = isEnabled && fx->getAttributes()->isEnabled();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return isEnabled;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool FxGroupNode::isCached() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	bool isCached = true;
Toshihiro Shimizu 890ddd
	for (i = 0; i < m_roots.size(); i++) {
Toshihiro Shimizu 890ddd
		TFx *fx = m_roots[i].getPointer();
Toshihiro Shimizu 890ddd
		if (TZeraryColumnFx *zcFx = dynamic_cast<TZeraryColumnFx *>(fx))
Toshihiro Shimizu 890ddd
			isCached = isCached && TPassiveCacheManager::instance()->cacheEnabled(zcFx->getZeraryFx());
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			isCached = isCached && TPassiveCacheManager::instance()->cacheEnabled(fx);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return isCached;
Toshihiro Shimizu 890ddd
}