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