Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/schematicviewer.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
manongjohn d6e3cc
#include "toonzqt/fxtypes.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/schematicnode.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/fxschematicnode.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/schematicgroupeditor.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/stageschematicscene.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/fxschematicscene.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/tselectionhandle.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/imageutils.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvscrollwidget.h"
shun-iwasawa 4a3868
#include "toonzqt/fxselection.h"
shun-iwasawa 4a3868
#include "stageobjectselection.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tobjecthandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tfxhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelcolumn.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnfx.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshzeraryfxcolumn.h"
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
#include "toonz/fxdag.h"
Toshihiro Shimizu 890ddd
#include "toonz/tapplication.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
manongjohn d6e3cc
#include "toonz/txshleveltypes.h"
Toshihiro Shimizu 890ddd
manongjohn a99cb6
#include "../toonz/menubarcommandids.h"
manongjohn a99cb6
manongjohn da05a0
#include "tools/cursormanager.h"
manongjohn da05a0
#include "tools/cursors.h"
manongjohn da05a0
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qgraphicsscenemouseevent></qgraphicsscenemouseevent>
Toshihiro Shimizu 890ddd
#include <qmouseevent></qmouseevent>
Campbell Barton d0e335
#include <qgraphicsitem></qgraphicsitem>
Toshihiro Shimizu 890ddd
#include <qtoolbar></qtoolbar>
Toshihiro Shimizu 890ddd
#include <qtoolbutton></qtoolbutton>
Toshihiro Shimizu 890ddd
#include <qmenu></qmenu>
Toshihiro Shimizu 890ddd
#include <qicon></qicon>
Toshihiro Shimizu 890ddd
#include <qaction></qaction>
Toshihiro Shimizu 890ddd
#include <qmainwindow></qmainwindow>
Toshihiro Shimizu 890ddd
#include <qvboxlayout></qvboxlayout>
manongjohn a99cb6
#include <qgestureevent></qgestureevent>
Toshihiro Shimizu 890ddd
manongjohn ebce7c
#include <qdebug></qdebug>
manongjohn ebce7c
Toshihiro Shimizu 890ddd
// STD includes
Toshihiro Shimizu 890ddd
#include "assert.h"
Toshihiro Shimizu 890ddd
#include "math.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class SchematicZoomer final : public ImageUtils::ShortcutZoomer {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SchematicZoomer(QWidget *parent) : ShortcutZoomer(parent) {}
Toshihiro Shimizu 890ddd
shun-iwasawa 92d40c
  bool zoom(bool zoomin, bool resetView) override {
shun-iwasawa 92d40c
    static_cast<schematicsceneviewer *="">(getWidget())->zoomQt(zoomin, resetView);</schematicsceneviewer>
shun-iwasawa 92d40c
    return true;
shun-iwasawa 92d40c
  }
shun-iwasawa 92d40c
  bool resetZoom() override {
shun-iwasawa 92d40c
    static_cast<schematicsceneviewer *="">(getWidget())->normalizeScene();</schematicsceneviewer>
shun-iwasawa 92d40c
    return true;
shun-iwasawa 92d40c
  }
shun-iwasawa 92d40c
  bool fit() override {
shun-iwasawa 92d40c
    static_cast<schematicsceneviewer *="">(getWidget())->fitScene();</schematicsceneviewer>
Shinya Kitaoka 120a6e
    return true;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
shun-iwasawa 57ba4e
const int snapDistance = 15;
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
shun-iwasawa 57ba4e
int SchematicScene::snapHSpacing  = 50;
shun-iwasawa 57ba4e
int SchematicScene::snapVInterval = 75;
shun-iwasawa 57ba4e
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// SchematicScene
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
SchematicScene::SchematicScene(QWidget *parent) : QGraphicsScene(parent) {
Shinya Kitaoka 120a6e
  setSceneRect(0, 0, 50000, 50000);
Shinya Kitaoka 120a6e
  setItemIndexMethod(NoIndex);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
SchematicScene::~SchematicScene() { clearAllItems(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicScene::showEvent(QShowEvent *se) {
Shinya Kitaoka 120a6e
  TSelectionHandle *selHandle = TSelectionHandle::getCurrent();
Shinya Kitaoka 120a6e
  connect(selHandle, SIGNAL(selectionSwitched(TSelection *, TSelection *)),
Shinya Kitaoka 120a6e
          this, SLOT(onSelectionSwitched(TSelection *, TSelection *)));
Shinya Kitaoka 120a6e
  clearSelection();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicScene::hideEvent(QHideEvent *se) {
Shinya Kitaoka 120a6e
  TSelectionHandle *selHandle = TSelectionHandle::getCurrent();
Shinya Kitaoka 120a6e
  disconnect(selHandle, SIGNAL(selectionSwitched(TSelection *, TSelection *)),
Shinya Kitaoka 120a6e
             this, SLOT(onSelectionSwitched(TSelection *, TSelection *)));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! Removes and then deletes all item in the scene.
shun-iwasawa 92d40c
 */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicScene::clearAllItems() {
Shinya Kitaoka 120a6e
  clearSelection();
Shinya Kitaoka 120a6e
  m_highlightedLinks.clear();
Shinya Kitaoka 120a6e
  QList<schematicwindoweditor *=""> editors;</schematicwindoweditor>
Shinya Kitaoka 120a6e
  QList<schematicnode *=""> nodes;</schematicnode>
Shinya Kitaoka 120a6e
  QList<schematiclink *=""> links;</schematiclink>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> sceneItems = items();</qgraphicsitem>
Shinya Kitaoka 120a6e
  int size                          = sceneItems.size();
Shinya Kitaoka 120a6e
  // create nodes and links list
Shinya Kitaoka 120a6e
  for (i = 0; i < size; i++) {
Shinya Kitaoka 120a6e
    QGraphicsItem *item           = sceneItems.at(i);
Shinya Kitaoka 120a6e
    SchematicWindowEditor *editor = dynamic_cast<schematicwindoweditor *="">(item);</schematicwindoweditor>
Shinya Kitaoka 120a6e
    SchematicNode *node           = dynamic_cast<schematicnode *="">(item);</schematicnode>
Shinya Kitaoka 120a6e
    SchematicLink *link           = dynamic_cast<schematiclink *="">(item);</schematiclink>
Shinya Kitaoka 120a6e
    if (editor) editors.append(editor);
Shinya Kitaoka 120a6e
    if (node) nodes.append(node);
Shinya Kitaoka 120a6e
    if (link) links.append(link);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  while (links.size() > 0) {
Shinya Kitaoka 120a6e
    SchematicLink *link = links.back();
Shinya Kitaoka 120a6e
    removeItem(link);
Shinya Kitaoka 120a6e
    links.removeLast();
Shinya Kitaoka 120a6e
    SchematicPort *startPort = link->getStartPort();
Shinya Kitaoka 120a6e
    SchematicPort *endPort   = link->getEndPort();
Shinya Kitaoka 120a6e
    if (startPort) startPort->removeLink(link);
Shinya Kitaoka 120a6e
    if (endPort) endPort->removeLink(link);
Shinya Kitaoka 120a6e
    delete link;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  while (editors.size() > 0) {
Shinya Kitaoka 120a6e
    SchematicWindowEditor *editor = editors.back();
Shinya Kitaoka 120a6e
    removeItem(editor);
Shinya Kitaoka 120a6e
    editors.removeLast();
Shinya Kitaoka 120a6e
    delete editor;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  while (nodes.size() > 0) {
Shinya Kitaoka 120a6e
    SchematicNode *node = nodes.back();
Shinya Kitaoka 120a6e
    removeItem(node);
Shinya Kitaoka 120a6e
    nodes.removeLast();
Shinya Kitaoka 120a6e
    delete node;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  assert(items().size() == 0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! check if any item exists in the rect
shun-iwasawa 92d40c
 */
Shinya Kitaoka 120a6e
bool SchematicScene::isAnEmptyZone(const QRectF &rect) {
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> allItems = items();</qgraphicsitem>
Shinya Kitaoka 120a6e
  for (auto const level : allItems) {
Shinya Kitaoka 120a6e
    SchematicNode *node = dynamic_cast<schematicnode *="">(level);</schematicnode>
Shinya Kitaoka 120a6e
    if (!node) continue;
Shinya Kitaoka 120a6e
    FxSchematicNode *fxNode = dynamic_cast<fxschematicnode *="">(node);</fxschematicnode>
Shinya Kitaoka 120a6e
    if (fxNode && fxNode->isA(eXSheetFx)) continue;
Shinya Kitaoka 120a6e
    if (node->boundingRect().translated(node->scenePos()).intersects(rect))
Shinya Kitaoka 120a6e
      return false;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return true;
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
//------------------------------------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
QVector<schematicnode *=""> SchematicScene::getPlacedNode(SchematicNode *node) {</schematicnode>
Shinya Kitaoka 120a6e
  QRectF rect = node->boundingRect().translated(node->scenePos());
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> allItems = items();</qgraphicsitem>
Shinya Kitaoka 120a6e
  QVector<schematicnode *=""> nodes;</schematicnode>
Shinya Kitaoka 120a6e
  for (auto const item : allItems) {
Shinya Kitaoka 120a6e
    SchematicNode *placedNode = dynamic_cast<schematicnode *="">(item);</schematicnode>
Shinya Kitaoka 120a6e
    if (!placedNode || placedNode == node) continue;
Shinya Kitaoka 120a6e
    QRectF nodeRect =
Shinya Kitaoka 120a6e
        placedNode->boundingRect().translated(placedNode->scenePos());
Shinya Kitaoka 120a6e
    QRectF enlargedRect = rect.adjusted(-10, -10, 10, 10);
Shinya Kitaoka 120a6e
    if (enlargedRect.contains(nodeRect)) nodes.push_back(placedNode);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return nodes;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
shun-iwasawa 57ba4e
//------------------------------------------------------------------
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
void SchematicScene::addSnapTarget(const QPointF &pos, const QRectF &rect,
shun-iwasawa 57ba4e
                                   const QPointF &theOtherEndPos,
shun-iwasawa 57ba4e
                                   const QPointF &endPosOffset) {
shun-iwasawa 57ba4e
  // reduce highlight margin
shun-iwasawa 57ba4e
  QRectF nodeRect = rect.adjusted(5, 5, -5, -5);
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  /*
shun-iwasawa 57ba4e
  auto findSnapPos = [&](QPointF pos) {
shun-iwasawa 57ba4e
    for (auto item : m_snapTargets) {
shun-iwasawa 57ba4e
      if (item->scenePos() == pos) return true;
shun-iwasawa 57ba4e
    }
shun-iwasawa 57ba4e
    return false;
shun-iwasawa 57ba4e
  };
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  QList<qpointf> posList = {pos};</qpointf>
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  for (int i = 1; i <= 10; i++) {
shun-iwasawa 57ba4e
    QPointF tmp_pos =
shun-iwasawa 57ba4e
        pos + QPointF(0, (double)(SchematicScene::snapVInterval * i));
shun-iwasawa 57ba4e
    posList.append(tmp_pos);
shun-iwasawa 57ba4e
    if (isAnEmptyZone(nodeRect.translated(tmp_pos))) break;
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
  for (int i = -1; i >= -10; i--) {
shun-iwasawa 57ba4e
    QPointF tmp_pos =
shun-iwasawa 57ba4e
        pos + QPointF(0, (double)(SchematicScene::snapVInterval * i));
shun-iwasawa 57ba4e
    posList.append(tmp_pos);
shun-iwasawa 57ba4e
    if (isAnEmptyZone(nodeRect.translated(tmp_pos))) break;
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  for (auto p : posList) {
shun-iwasawa 57ba4e
    if (findSnapPos(p)) continue;
shun-iwasawa 57ba4e
    SnapTargetItem *item = new SnapTargetItem(p, nodeRect);
shun-iwasawa 57ba4e
    addItem(item);
shun-iwasawa 57ba4e
    m_snapTargets.append(item);
shun-iwasawa 57ba4e
  }*/
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  SnapTargetItem *item =
shun-iwasawa 57ba4e
      new SnapTargetItem(pos, nodeRect, theOtherEndPos, endPosOffset);
shun-iwasawa 57ba4e
  addItem(item);
shun-iwasawa 57ba4e
  m_snapTargets.append(item);
shun-iwasawa 57ba4e
}
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
//------------------------------------------------------------------
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
void SchematicScene::clearSnapTargets() {
shun-iwasawa 57ba4e
  for (auto item : m_snapTargets) {
shun-iwasawa 57ba4e
    removeItem(item);
shun-iwasawa 57ba4e
    delete item;
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
  m_snapTargets.clear();
shun-iwasawa 57ba4e
}
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
//------------------------------------------------------------------
shun-iwasawa 57ba4e
// snap to neighbor nodes on dragging
shun-iwasawa 57ba4e
void SchematicScene::computeSnap(SchematicNode *node, QPointF &delta,
shun-iwasawa 57ba4e
                                 bool enable) {
shun-iwasawa 57ba4e
  if (m_snapTargets.isEmpty()) return;
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  if (!enable) {
shun-iwasawa 57ba4e
    // hide targets
shun-iwasawa 57ba4e
    if (m_snapTargets[0]->isVisible()) {
shun-iwasawa 57ba4e
      for (auto item : m_snapTargets) item->setVisible(false);
shun-iwasawa 57ba4e
    }
shun-iwasawa 57ba4e
    return;
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  if (!m_snapTargets[0]->isVisible()) {
shun-iwasawa 57ba4e
    for (auto item : m_snapTargets) item->setVisible(true);
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  QPointF newScenePos = node->scenePos() + delta;
shun-iwasawa 57ba4e
  QPointF newPos      = views()[0]->mapFromScene(newScenePos);
shun-iwasawa 57ba4e
shun-iwasawa 57ba4e
  for (auto target : m_snapTargets) {
shun-iwasawa 57ba4e
    QPointF targetPos = target->scenePos();
shun-iwasawa 57ba4e
    int snapIndex     = std::nearbyint((newScenePos.y() - targetPos.y()) /
shun-iwasawa 57ba4e
                                       (double)SchematicScene::snapVInterval);
shun-iwasawa 57ba4e
    targetPos.setY(targetPos.y() +
shun-iwasawa 57ba4e
                   (double)(snapIndex * SchematicScene::snapVInterval));
shun-iwasawa 57ba4e
    target->setPos(targetPos);
shun-iwasawa 57ba4e
    if ((newPos - views()[0]->mapFromScene(targetPos)).manhattanLength() <
shun-iwasawa 57ba4e
        snapDistance) {
shun-iwasawa 57ba4e
      delta = targetPos - node->scenePos();
shun-iwasawa 57ba4e
      return;
shun-iwasawa 57ba4e
    }
shun-iwasawa 57ba4e
  }
shun-iwasawa 57ba4e
}
shun-iwasawa 57ba4e
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// SchematicSceneViewer
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SchematicSceneViewer::SchematicSceneViewer(QWidget *parent)
Shinya Kitaoka 120a6e
    : QGraphicsView(parent)
Shinya Kitaoka 120a6e
    , m_buttonState(Qt::NoButton)
Shinya Kitaoka 120a6e
    , m_oldWinPos()
Shinya Kitaoka 120a6e
    , m_oldScenePos()
Shinya Kitaoka 120a6e
    , m_firstShowing(true) {
Shinya Kitaoka 120a6e
  setObjectName("SchematicSceneViewer");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Shinya Kitaoka 120a6e
  setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Shinya Kitaoka 120a6e
  setDragMode(QGraphicsView::NoDrag);
Shinya Kitaoka 120a6e
  setTransformationAnchor(QGraphicsView::NoAnchor);
Shinya Kitaoka 120a6e
  setRenderHint(QPainter::SmoothPixmapTransform);
Shinya Kitaoka 120a6e
  setRenderHint(QPainter::TextAntialiasing);
Shinya Kitaoka 120a6e
  setRenderHint(QPainter::Antialiasing);
Shinya Kitaoka 120a6e
  setInteractive(true);
Shinya Kitaoka 120a6e
  setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
Shinya Kitaoka 120a6e
  show();
manongjohn a99cb6
manongjohn a99cb6
  setAttribute(Qt::WA_AcceptTouchEvents);
manongjohn a99cb6
  grabGesture(Qt::SwipeGesture);
manongjohn a99cb6
  grabGesture(Qt::PanGesture);
manongjohn a99cb6
  grabGesture(Qt::PinchGesture);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
SchematicSceneViewer::~SchematicSceneViewer() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
/*! Reimplemets the QGraphicsView::mousePressEvent()
shun-iwasawa 92d40c
 */
Shinya Kitaoka 120a6e
void SchematicSceneViewer::mousePressEvent(QMouseEvent *me) {
manongjohn 6087a0
  // qDebug() << "[mousePressEvent]";
manongjohn 6af389
  if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen &&
manongjohn 6af389
      !m_stylusUsed) {
manongjohn a99cb6
    return;
manongjohn a99cb6
  }
manongjohn a99cb6
Shinya Kitaoka 120a6e
  m_buttonState = me->button();
manongjohn 6b57d9
  m_oldWinPos   = me->pos();
manongjohn 6b57d9
  m_oldScenePos = mapToScene(m_oldWinPos);
manongjohn a99cb6
manongjohn a99cb6
  if (m_buttonState == Qt::LeftButton) {
manongjohn a99cb6
    if (m_cursorMode == CursorMode::Zoom) {
manongjohn 931ad2
      m_zoomPoint = me->pos();
manongjohn 931ad2
      m_zooming   = true;
manongjohn a99cb6
      return;
manongjohn a99cb6
    } else if (m_cursorMode == CursorMode::Hand) {
manongjohn 0b7d7e
      m_mousePanPoint = m_touchDevice == QTouchDevice::TouchScreen
manongjohn eca762
                            ? mapToScene(me->pos())
shun-iwasawa f2e168
                            : me->pos() * getDevicePixelRatio(this);
shun-iwasawa 57ba4e
      m_panning       = true;
manongjohn a99cb6
      return;
manongjohn a99cb6
    }
shun-iwasawa 443318
  } else if (m_buttonState == Qt::MiddleButton) {
manongjohn 0b7d7e
    m_mousePanPoint = m_touchDevice == QTouchDevice::TouchScreen
manongjohn eca762
                          ? mapToScene(me->pos())
shun-iwasawa f2e168
                          : me->pos() * getDevicePixelRatio(this);
manongjohn a99cb6
  }
Shinya Kitaoka 120a6e
  bool drawRect                       = true;
Shinya Kitaoka 120a6e
  QList<qgraphicsitem *=""> pointedItems = items(me->pos());</qgraphicsitem>
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < pointedItems.size(); i++) {
Shinya Kitaoka 120a6e
    SchematicWindowEditor *editor =
Shinya Kitaoka 120a6e
        dynamic_cast<schematicwindoweditor *="">(pointedItems[i]);</schematicwindoweditor>
Shinya Kitaoka 120a6e
    if (!editor) {
Shinya Kitaoka 120a6e
      drawRect = false;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_buttonState == Qt::LeftButton && drawRect)
Shinya Kitaoka 120a6e
    setDragMode(QGraphicsView::RubberBandDrag);
Shinya Kitaoka 120a6e
  QGraphicsView::mousePressEvent(me);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
/*! Reimplemets the QGraphicsView::mouseMoveEvent()
shun-iwasawa 92d40c
 */
Shinya Kitaoka 120a6e
void SchematicSceneViewer::mouseMoveEvent(QMouseEvent *me) {
manongjohn 6af389
  if (m_gestureActive && m_touchDevice == QTouchDevice::TouchScreen &&
manongjohn 6af389
      !m_stylusUsed) {
manongjohn a99cb6
    return;
manongjohn a99cb6
  }
manongjohn a99cb6
Shinya Kitaoka 120a6e
  QPoint currWinPos    = me->pos();
Shinya Kitaoka 120a6e
  QPointF currScenePos = mapToScene(currWinPos);
manongjohn a99cb6
  if ((m_cursorMode == CursorMode::Hand && m_panning) ||
shun-iwasawa 443318
      m_buttonState == Qt::MiddleButton) {
shun-iwasawa 57ba4e
    QPointF usePos     = m_touchDevice == QTouchDevice::TouchScreen
shun-iwasawa 57ba4e
                             ? mapToScene(me->pos())
shun-iwasawa 57ba4e
                             : me->pos() * getDevicePixelRatio(this);
manongjohn 0b7d7e
    QPointF deltaPoint = usePos - m_mousePanPoint;
manongjohn 6b57d9
    panQt(deltaPoint);
manongjohn 0b7d7e
    m_mousePanPoint = m_touchDevice == QTouchDevice::TouchScreen
manongjohn 7dbf30
                          ? mapToScene(me->pos())
shun-iwasawa f2e168
                          : me->pos() * getDevicePixelRatio(this);
manongjohn a99cb6
  } else {
manongjohn 6b57d9
    if (m_cursorMode == CursorMode::Zoom && m_zooming) {
manongjohn 6b57d9
      int deltaY     = (m_oldWinPos.y() - me->pos().y()) * 10;
manongjohn 6b57d9
      double factorY = exp(deltaY * 0.001);
manongjohn 6e9f12
      changeScale(m_zoomPoint, factorY);
manongjohn 0b7d7e
      m_panning = false;
manongjohn 6b57d9
    }
manongjohn a99cb6
    m_oldWinPos   = currWinPos;
manongjohn a99cb6
    m_oldScenePos = currScenePos;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QGraphicsView::mouseMoveEvent(me);
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
//------------------------------------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
/*! Reimplemets the QGraphicsView::mouseReleaseEvent()
shun-iwasawa 92d40c
 */
Shinya Kitaoka 120a6e
void SchematicSceneViewer::mouseReleaseEvent(QMouseEvent *me) {
manongjohn 6087a0
  // qDebug() << "[mouseReleaseEvent]";
manongjohn 36f776
  m_gestureActive = false;
manongjohn 36f776
  m_zooming       = false;
manongjohn 36f776
  m_panning       = false;
manongjohn 36f776
  m_stylusUsed    = false;
manongjohn 36f776
  m_scaleFactor   = 0.0;
manongjohn a99cb6
Shinya Kitaoka 120a6e
  m_buttonState = Qt::NoButton;
Shinya Kitaoka 120a6e
  QGraphicsView::mouseReleaseEvent(me);
Shinya Kitaoka 120a6e
  setDragMode(QGraphicsView::NoDrag);
Shinya Kitaoka 120a6e
  // update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
manongjohn a99cb6
void SchematicSceneViewer::mouseDoubleClickEvent(QMouseEvent *event) {
manongjohn 6087a0
  // qDebug() << "[mouseDoubleClickEvent]";
manongjohn 6af389
  if (m_gestureActive && !m_stylusUsed) {
manongjohn a99cb6
    m_gestureActive = false;
manongjohn 36f776
    QGraphicsItem *item =
manongjohn 36f776
        scene()->itemAt(mapToScene(event->pos()), QTransform());
manongjohn 36f776
    if (!item) {
manongjohn 36f776
      fitScene();
manongjohn 36f776
      return;
manongjohn 36f776
    }
manongjohn 36f776
manongjohn 36f776
    mousePressEvent(event);
manongjohn a99cb6
  }
manongjohn ebce7c
manongjohn a99cb6
  QGraphicsView::mouseDoubleClickEvent(event);
manongjohn a99cb6
}
manongjohn 36f776
manongjohn a99cb6
//------------------------------------------------------------------
manongjohn a99cb6
Shinya Kitaoka 120a6e
void SchematicSceneViewer::keyPressEvent(QKeyEvent *ke) {
Shinya Kitaoka 120a6e
  ke->ignore();
Shinya Kitaoka 120a6e
  QGraphicsView::keyPressEvent(ke);
Shinya Kitaoka 120a6e
  if (!ke->isAccepted()) SchematicZoomer(this).exec(ke);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
/*! Reimplemets the QGraphicsView::wheelEvent()
shun-iwasawa 92d40c
 */
Shinya Kitaoka 120a6e
void SchematicSceneViewer::wheelEvent(QWheelEvent *me) {
manongjohn 6087a0
  // qDebug() << "[wheelEvent]";
manongjohn 6087a0
manongjohn 6087a0
  int delta = 0;
manongjohn 6087a0
  switch (me->source()) {
manongjohn 6087a0
  case Qt::MouseEventNotSynthesized: {
manongjohn 6087a0
    if (me->modifiers() & Qt::AltModifier)
manongjohn 6087a0
      delta = me->angleDelta().x();
manongjohn 6087a0
    else
manongjohn 6087a0
      delta = me->angleDelta().y();
manongjohn 6087a0
    break;
manongjohn 6087a0
  }
manongjohn 6087a0
manongjohn 6087a0
  case Qt::MouseEventSynthesizedBySystem: {
manongjohn 6087a0
    QPoint numPixels  = me->pixelDelta();
manongjohn 6087a0
    QPoint numDegrees = me->angleDelta() / 8;
manongjohn 6087a0
    if (!numPixels.isNull()) {
manongjohn 6087a0
      delta = me->pixelDelta().y();
manongjohn 6087a0
    } else if (!numDegrees.isNull()) {
manongjohn 6087a0
      QPoint numSteps = numDegrees / 15;
manongjohn 6087a0
      delta           = numSteps.y();
manongjohn 6087a0
    }
manongjohn 6087a0
    break;
manongjohn ebce7c
  }
manongjohn 6087a0
manongjohn 6087a0
  default:  // Qt::MouseEventSynthesizedByQt,
manongjohn 6087a0
            // Qt::MouseEventSynthesizedByApplication
shun-iwasawa 4a3868
  {
shun-iwasawa 4a3868
    std::cout << "not supported event: Qt::MouseEventSynthesizedByQt, "
shun-iwasawa 4a3868
                 "Qt::MouseEventSynthesizedByApplication"
shun-iwasawa 4a3868
              << std::endl;
shun-iwasawa 4a3868
    break;
shun-iwasawa 4a3868
  }
manongjohn 6087a0
manongjohn 6087a0
  }  // end switch
manongjohn 6087a0
manongjohn 6087a0
  if (abs(delta) > 0) {
manongjohn 6087a0
    if ((m_gestureActive == true &&
manongjohn 6087a0
         m_touchDevice == QTouchDevice::TouchScreen) ||
manongjohn 6087a0
        m_gestureActive == false) {
manongjohn 6087a0
      double factor = exp(delta * 0.001);
shun-iwasawa 443318
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
shun-iwasawa 443318
      changeScale(me->position().toPoint(), factor);
shun-iwasawa 443318
#else
manongjohn 931ad2
      changeScale(me->pos(), factor);
shun-iwasawa 443318
#endif
manongjohn 0b7d7e
      m_panning = false;
manongjohn 6087a0
    }
manongjohn 6087a0
  }
manongjohn 6087a0
  me->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
shun-iwasawa 92d40c
void SchematicSceneViewer::zoomQt(bool zoomin, bool resetView) {
shun-iwasawa 92d40c
  if (resetView) {
shun-iwasawa 443318
    resetTransform();
luz paz 6454c4
    // resetting will set view to the center of items bounding
shun-iwasawa 92d40c
    centerOn(scene()->itemsBoundingRect().center());
shun-iwasawa 92d40c
    return;
shun-iwasawa 92d40c
  }
shun-iwasawa 92d40c
shun-iwasawa 443318
  double scale2 = transform().determinant();
shun-iwasawa 92d40c
  if ((scale2 < 100000 || !zoomin) && (scale2 > 0.001 * 0.05 || zoomin)) {
Shinya Kitaoka 120a6e
    double oldZoomScale = sqrt(scale2);
shun-iwasawa 4a3868
    double zoomScale =
shun-iwasawa 4a3868
        resetView ? 1
shun-iwasawa 4a3868
                  : ImageUtils::getQuantizedZoomFactor(oldZoomScale, zoomin);
shun-iwasawa 443318
    QTransform scale =
shun-iwasawa 443318
        QTransform().scale(zoomScale / oldZoomScale, zoomScale / oldZoomScale);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // See QGraphicsView::mapToScene()'s doc for details
shun-iwasawa 92d40c
    QPointF sceneCenter(mapToScene(rect().center()));
shun-iwasawa 443318
    setTransform(scale, true);
shun-iwasawa 92d40c
    centerOn(sceneCenter);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! The view is scaled around the point \b winPos by \b scaleFactor;
shun-iwasawa 92d40c
 */
Shinya Kitaoka 120a6e
void SchematicSceneViewer::changeScale(const QPoint &winPos,
Shinya Kitaoka 120a6e
                                       qreal scaleFactor) {
manongjohn 0b7d7e
  QPointF startScenePos = mapToScene(winPos);
shun-iwasawa 443318
  QTransform scale      = QTransform().scale(scaleFactor, scaleFactor);
shun-iwasawa 443318
  setTransform(scale, true);
manongjohn 0b7d7e
  QPointF endScenePos = mapToScene(winPos);
manongjohn 0b7d7e
  QPointF delta       = endScenePos - startScenePos;
Shinya Kitaoka 120a6e
  translate(delta.x(), delta.y());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicSceneViewer::fitScene() {
Shinya Kitaoka 120a6e
  if (scene()) {
Shinya Kitaoka 120a6e
    QRectF rect = scene()->itemsBoundingRect();
Shinya Kitaoka 120a6e
    fitInView(rect, Qt::KeepAspectRatio);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicSceneViewer::centerOnCurrent() {
Shinya Kitaoka 120a6e
  SchematicScene *schematicScene = dynamic_cast<schematicscene *="">(scene());</schematicscene>
Shinya Kitaoka 120a6e
  QGraphicsItem *node            = schematicScene->getCurrentNode();
Shinya Kitaoka 120a6e
  if (node) centerOn(node);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicSceneViewer::reorderScene() {
Shinya Kitaoka 120a6e
  SchematicScene *schematicScene = dynamic_cast<schematicscene *="">(scene());</schematicscene>
Shinya Kitaoka 120a6e
  schematicScene->reorderScene();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicSceneViewer::normalizeScene() {
Shinya Kitaoka 120a6e
  // See QGraphicsView::mapToScene()'s doc for details
shun-iwasawa 92d40c
  QPointF sceneCenter(mapToScene(rect().center()));
shun-iwasawa 443318
  resetTransform();
Toshihiro Shimizu 890ddd
#if defined(MACOSX)
Shinya Kitaoka 120a6e
  scale(1.32, 1.32);
Toshihiro Shimizu 890ddd
#endif
shun-iwasawa 92d40c
  centerOn(sceneCenter);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
manongjohn 6b57d9
void SchematicSceneViewer::panQt(const QPointF &delta) {
manongjohn 0b7d7e
  if (delta == QPointF()) return;
manongjohn a99cb6
  setInteractive(false);
manongjohn a99cb6
  // I need to disable QGraphicsView event handling to avoid the generation of
manongjohn a99cb6
  // 'virtual' mouseMoveEvent
manongjohn 6b57d9
  translate(delta.x(), delta.y());
manongjohn a99cb6
  // translate has changed the matrix affecting the mapToScene() method. I
manongjohn a99cb6
  // have to recompute currScenePos
manongjohn a99cb6
  setInteractive(true);
manongjohn a99cb6
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicSceneViewer::showEvent(QShowEvent *se) {
Shinya Kitaoka 120a6e
  QGraphicsView::showEvent(se);
Shinya Kitaoka 120a6e
  if (m_firstShowing) {
Shinya Kitaoka 120a6e
    m_firstShowing = false;
Shinya Kitaoka 120a6e
    QRectF rect    = scene()->itemsBoundingRect();
shun-iwasawa 443318
    resetTransform();
Shinya Kitaoka 120a6e
    centerOn(rect.center());
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
manongjohn a99cb6
//------------------------------------------------------------------
manongjohn 6af389
manongjohn 3c9f8d
void SchematicSceneViewer::enterEvent(QEvent *e) {
manongjohn 3c9f8d
  switch (m_cursorMode) {
manongjohn 3c9f8d
  case CursorMode::Hand:
manongjohn 3c9f8d
    setToolCursor(this, ToolCursor::PanCursor);
manongjohn 3c9f8d
    break;
manongjohn 3c9f8d
  case CursorMode::Zoom:
manongjohn 3c9f8d
    setToolCursor(this, ToolCursor::ZoomCursor);
manongjohn 3c9f8d
    break;
manongjohn 3c9f8d
  default:
manongjohn 3c9f8d
    setToolCursor(this, ToolCursor::StrokeSelectCursor);
manongjohn 3c9f8d
    break;
manongjohn 3c9f8d
  }
manongjohn 3c9f8d
}
manongjohn 3c9f8d
manongjohn 3c9f8d
//------------------------------------------------------------------
manongjohn 3c9f8d
manongjohn 3c9f8d
void SchematicSceneViewer::leaveEvent(QEvent *e) { setCursor(Qt::ArrowCursor); }
manongjohn 3c9f8d
manongjohn 3c9f8d
//------------------------------------------------------------------
manongjohn 3c9f8d
manongjohn 6af389
void SchematicSceneViewer::tabletEvent(QTabletEvent *e) {
manongjohn 6087a0
  // qDebug() << "[tabletEvent]";
manongjohn 6af389
  if (e->type() == QTabletEvent::TabletPress) {
manongjohn 6af389
    m_stylusUsed = e->pointerType() ? true : false;
manongjohn 6af389
  } else if (e->type() == QTabletEvent::TabletRelease) {
manongjohn 6af389
    m_stylusUsed = false;
manongjohn 6af389
  }
manongjohn 6af389
manongjohn 6af389
  e->accept();
manongjohn 6af389
}
manongjohn 6af389
manongjohn 6af389
//------------------------------------------------------------------
manongjohn ebce7c
manongjohn a99cb6
void SchematicSceneViewer::gestureEvent(QGestureEvent *e) {
manongjohn 6087a0
  // qDebug() << "[gestureEvent]";
manongjohn a99cb6
  m_gestureActive = false;
manongjohn a99cb6
  if (QGesture *swipe = e->gesture(Qt::SwipeGesture)) {
manongjohn a99cb6
    m_gestureActive = true;
manongjohn a99cb6
  } else if (QGesture *pan = e->gesture(Qt::PanGesture)) {
manongjohn a99cb6
    m_gestureActive = true;
manongjohn a99cb6
  }
manongjohn a99cb6
  if (QGesture *pinch = e->gesture(Qt::PinchGesture)) {
manongjohn a99cb6
    QPinchGesture *gesture = static_cast<qpinchgesture *="">(pinch);</qpinchgesture>
manongjohn a99cb6
    QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags();
manongjohn c2ff21
    QPoint firstCenter                     = gesture->centerPoint().toPoint();
manongjohn c2ff21
    if (m_touchDevice == QTouchDevice::TouchScreen)
manongjohn c2ff21
      firstCenter = mapFromGlobal(firstCenter);
manongjohn a99cb6
manongjohn a99cb6
    if (gesture->state() == Qt::GestureStarted) {
manongjohn 6b57d9
      m_gestureActive = true;
manongjohn a99cb6
    } else if (gesture->state() == Qt::GestureFinished) {
manongjohn 6b57d9
      m_gestureActive = false;
manongjohn 6b57d9
      m_zooming       = false;
manongjohn 6b57d9
      m_scaleFactor   = 0.0;
manongjohn a99cb6
    } else {
manongjohn a99cb6
      if (changeFlags & QPinchGesture::ScaleFactorChanged) {
manongjohn a99cb6
        double scaleFactor = gesture->scaleFactor();
manongjohn a99cb6
        // the scale factor makes for too sensitive scaling
manongjohn a99cb6
        // divide the change in half
manongjohn a99cb6
        if (scaleFactor > 1) {
manongjohn a99cb6
          double decimalValue = scaleFactor - 1;
manongjohn a99cb6
          decimalValue /= 1.5;
manongjohn a99cb6
          scaleFactor = 1 + decimalValue;
manongjohn a99cb6
        } else if (scaleFactor < 1) {
manongjohn a99cb6
          double decimalValue = 1 - scaleFactor;
manongjohn a99cb6
          decimalValue /= 1.5;
manongjohn a99cb6
          scaleFactor = 1 - decimalValue;
manongjohn a99cb6
        }
manongjohn a99cb6
        if (!m_zooming) {
manongjohn a99cb6
          double delta = scaleFactor - 1;
manongjohn a99cb6
          m_scaleFactor += delta;
manongjohn a99cb6
          if (m_scaleFactor > .2 || m_scaleFactor < -.2) {
manongjohn a99cb6
            m_zooming = true;
manongjohn a99cb6
          }
manongjohn a99cb6
        }
manongjohn a99cb6
        if (m_zooming) {
manongjohn 931ad2
          changeScale(firstCenter, scaleFactor);
manongjohn 0b7d7e
          m_panning = false;
manongjohn a99cb6
        }
manongjohn a99cb6
        m_gestureActive = true;
manongjohn a99cb6
      }
manongjohn a99cb6
manongjohn a99cb6
      if (changeFlags & QPinchGesture::CenterPointChanged) {
shun-iwasawa f2e168
        QPointF centerDelta =
shun-iwasawa f2e168
            (gesture->centerPoint() * getDevicePixelRatio(this)) -
shun-iwasawa f2e168
            (gesture->lastCenterPoint() * getDevicePixelRatio(this));
manongjohn 6b57d9
        if (centerDelta.manhattanLength() > 1) {
manongjohn 6b57d9
          // panQt(centerDelta.toPoint());
manongjohn a99cb6
        }
manongjohn a99cb6
        m_gestureActive = true;
manongjohn a99cb6
      }
manongjohn a99cb6
    }
manongjohn a99cb6
  }
manongjohn a99cb6
  e->accept();
manongjohn a99cb6
}
manongjohn a99cb6
manongjohn 6b57d9
void SchematicSceneViewer::touchEvent(QTouchEvent *e, int type) {
manongjohn 6087a0
  // qDebug() << "[touchEvent]";
manongjohn 6b57d9
  if (type == QEvent::TouchBegin) {
manongjohn 6b57d9
    m_touchActive   = true;
manongjohn 6b57d9
    m_firstPanPoint = e->touchPoints().at(0).pos();
manongjohn 6b57d9
    // obtain device type
manongjohn 6b57d9
    m_touchDevice = e->device()->type();
manongjohn 6b57d9
  } else if (m_touchActive) {
manongjohn 6b57d9
    // touchpads must have 2 finger panning for tools and navigation to be
manongjohn 6b57d9
    // functional on other devices, 1 finger panning is preferred
manongjohn 6b57d9
    if ((e->touchPoints().count() == 2 &&
manongjohn 6b57d9
         m_touchDevice == QTouchDevice::TouchPad) ||
manongjohn 6b57d9
        (e->touchPoints().count() == 1 &&
manongjohn 6b57d9
         m_touchDevice == QTouchDevice::TouchScreen)) {
manongjohn 6b57d9
      QTouchEvent::TouchPoint panPoint = e->touchPoints().at(0);
manongjohn 6b57d9
      if (!m_panning) {
manongjohn 6b57d9
        QPointF deltaPoint = panPoint.pos() - m_firstPanPoint;
manongjohn 6b57d9
        // minimize accidental and jerky zooming/rotating during 2 finger
manongjohn 6b57d9
        // panning
manongjohn 6b57d9
        if ((deltaPoint.manhattanLength() > 100) && !m_zooming) {
manongjohn 6b57d9
          m_panning = true;
manongjohn 6b57d9
        }
manongjohn 6b57d9
      }
manongjohn 6b57d9
      if (m_panning) {
shun-iwasawa 57ba4e
        QPointF curPos      = m_touchDevice == QTouchDevice::TouchScreen
shun-iwasawa 57ba4e
                                  ? mapToScene(panPoint.pos().toPoint())
shun-iwasawa 57ba4e
                                  : mapToScene(panPoint.pos().toPoint()) *
shun-iwasawa f2e168
                                   getDevicePixelRatio(this);
shun-iwasawa 57ba4e
        QPointF lastPos     = m_touchDevice == QTouchDevice::TouchScreen
shun-iwasawa 57ba4e
                                  ? mapToScene(panPoint.lastPos().toPoint())
shun-iwasawa 57ba4e
                                  : mapToScene(panPoint.lastPos().toPoint()) *
shun-iwasawa f2e168
                                    getDevicePixelRatio(this);
manongjohn 6e9f12
        QPointF centerDelta = curPos - lastPos;
manongjohn fe6ab3
        panQt(centerDelta);
manongjohn 6b57d9
      }
manongjohn 6b57d9
    }
manongjohn 6b57d9
  }
manongjohn 6b57d9
  if (type == QEvent::TouchEnd || type == QEvent::TouchCancel) {
manongjohn 6b57d9
    m_touchActive = false;
manongjohn 6b57d9
    m_panning     = false;
manongjohn 6b57d9
  }
manongjohn 6b57d9
  e->accept();
manongjohn 6b57d9
}
manongjohn a99cb6
manongjohn a99cb6
bool SchematicSceneViewer::event(QEvent *e) {
manongjohn ebce7c
  /*
manongjohn 6087a0
  switch (e->type()) {
manongjohn 6087a0
  case QEvent::TabletPress: {
manongjohn 6087a0
    QTabletEvent *te = static_cast<qtabletevent *="">(e);</qtabletevent>
manongjohn 6087a0
    qDebug() << "[event] TabletPress: pointerType(" << te->pointerType()
manongjohn 6087a0
             << ") device(" << te->device() << ")";
manongjohn 6087a0
  } break;
manongjohn 6087a0
  case QEvent::TabletRelease:
manongjohn 6087a0
    qDebug() << "[event] TabletRelease";
manongjohn 6087a0
    break;
manongjohn 6087a0
  case QEvent::TouchBegin:
manongjohn 6087a0
    qDebug() << "[event] TouchBegin";
manongjohn 6087a0
    break;
manongjohn 6087a0
  case QEvent::TouchEnd:
manongjohn 6087a0
    qDebug() << "[event] TouchEnd";
manongjohn 6087a0
    break;
manongjohn 6087a0
  case QEvent::TouchCancel:
manongjohn 6087a0
    qDebug() << "[event] TouchCancel";
manongjohn 6087a0
    break;
manongjohn 6087a0
  case QEvent::MouseButtonPress:
manongjohn 6087a0
    qDebug() << "[event] MouseButtonPress";
manongjohn 6087a0
    break;
manongjohn 6087a0
  case QEvent::MouseButtonDblClick:
manongjohn 6087a0
    qDebug() << "[event] MouseButtonDblClick";
manongjohn 6087a0
    break;
manongjohn 6087a0
  case QEvent::MouseButtonRelease:
manongjohn 6087a0
    qDebug() << "[event] MouseButtonRelease";
manongjohn 6087a0
    break;
manongjohn 6087a0
  case QEvent::Gesture:
manongjohn 6087a0
    qDebug() << "[event] Gesture";
manongjohn 6087a0
    break;
manongjohn 6087a0
  default:
manongjohn 6087a0
    break;
manongjohn 6087a0
  }
manongjohn ebce7c
  */
manongjohn ebce7c
shun-iwasawa 4a3868
  if (e->type() == QEvent::Gesture && CommandManager::instance()
shun-iwasawa 4a3868
                                          ->getAction(MI_TouchGestureControl)
shun-iwasawa 4a3868
                                          ->isChecked()) {
manongjohn f5d48a
    gestureEvent(static_cast<qgestureevent *="">(e));</qgestureevent>
manongjohn f5d48a
    return true;
manongjohn f5d48a
  }
manongjohn 0b7d7e
  if ((e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchEnd ||
manongjohn 0b7d7e
       e->type() == QEvent::TouchCancel || e->type() == QEvent::TouchUpdate) &&
manongjohn 0b7d7e
      CommandManager::instance()
manongjohn 0b7d7e
          ->getAction(MI_TouchGestureControl)
manongjohn 0b7d7e
          ->isChecked()) {
manongjohn f5d48a
    touchEvent(static_cast<qtouchevent *="">(e), e->type());</qtouchevent>
manongjohn f5d48a
    m_gestureActive = true;
manongjohn f5d48a
    return true;
manongjohn a99cb6
  }
manongjohn a99cb6
  return QGraphicsView::event(e);
manongjohn a99cb6
}
manongjohn a99cb6
manongjohn a99cb6
//------------------------------------------------------------------
manongjohn a99cb6
manongjohn a99cb6
void SchematicSceneViewer::setCursorMode(CursorMode cursorMode) {
manongjohn a99cb6
  m_cursorMode = cursorMode;
manongjohn a99cb6
}
manongjohn a99cb6
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// SchematicViewer
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
SchematicViewer::SchematicViewer(QWidget *parent)
Shinya Kitaoka 120a6e
    : QWidget(parent)
Shinya Kitaoka 120a6e
    , m_fullSchematic(true)
Shinya Kitaoka 120a6e
    , m_maximizedNode(false)
manongjohn a99cb6
    , m_sceneHandle(0)
manongjohn a99cb6
    , m_cursorMode(CursorMode::Select) {
Shinya Kitaoka 120a6e
  m_viewer     = new SchematicSceneViewer(this);
Shinya Kitaoka 120a6e
  m_stageScene = new StageSchematicScene(this);
Shinya Kitaoka 120a6e
  m_fxScene    = new FxSchematicScene(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_commonToolbar = new QToolBar(m_viewer);
Shinya Kitaoka 120a6e
  m_stageToolbar  = new QToolBar(m_viewer);
Shinya Kitaoka 120a6e
  m_fxToolbar     = new QToolBar(m_viewer);
Shinya Kitaoka 120a6e
  m_swapToolbar   = new QToolBar(m_viewer);
Toshihiro Shimizu 890ddd
shun_iwasawa 4a5f42
  m_commonToolbar->setObjectName("MediumPaddingToolBar");
shun_iwasawa 4a5f42
  m_stageToolbar->setObjectName("MediumPaddingToolBar");
shun_iwasawa 4a5f42
  m_fxToolbar->setObjectName("MediumPaddingToolBar");
shun_iwasawa 4a5f42
  m_swapToolbar->setObjectName("MediumPaddingToolBar");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  createToolbars();
Shinya Kitaoka 120a6e
  createActions();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // layout
Shinya Kitaoka 120a6e
  QVBoxLayout *mainLayout = new QVBoxLayout();
Jeremy Bullock 915f19
  mainLayout->setMargin(0);
Shinya Kitaoka 120a6e
  mainLayout->setSpacing(0);
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    mainLayout->addWidget(m_viewer, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    QFrame *bottomFrame = new QFrame(this);
Shinya Kitaoka 120a6e
    bottomFrame->setObjectName("SchematicBottomFrame");
Shinya Kitaoka 120a6e
    QHBoxLayout *horizontalLayout = new QHBoxLayout();
Shinya Kitaoka 120a6e
    horizontalLayout->setMargin(0);
Shinya Kitaoka 120a6e
    horizontalLayout->setSpacing(0);
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      horizontalLayout->addWidget(m_commonToolbar);
Shinya Kitaoka 120a6e
      horizontalLayout->addStretch();
Shinya Kitaoka 120a6e
      horizontalLayout->addWidget(m_fxToolbar);
Shinya Kitaoka 120a6e
      horizontalLayout->addWidget(m_stageToolbar);
Shinya Kitaoka 120a6e
      horizontalLayout->addWidget(m_swapToolbar);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    bottomFrame->setLayout(horizontalLayout);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    mainLayout->addWidget(bottomFrame, 0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  setLayout(mainLayout);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  connect(m_fxScene, SIGNAL(showPreview(TFxP)), this,
Shinya Kitaoka 120a6e
          SIGNAL(showPreview(TFxP)));
Shinya Kitaoka 120a6e
  connect(m_fxScene, SIGNAL(doCollapse(const QList<tfxp> &)), this,</tfxp>
Shinya Kitaoka 120a6e
          SIGNAL(doCollapse(const QList<tfxp> &)));</tfxp>
Shinya Kitaoka 120a6e
  connect(m_stageScene, SIGNAL(doCollapse(QList<tstageobjectid>)), this,</tstageobjectid>
Shinya Kitaoka 120a6e
          SIGNAL(doCollapse(QList<tstageobjectid>)));</tstageobjectid>
Shinya Kitaoka 120a6e
  connect(m_fxScene, SIGNAL(doExplodeChild(const QList<tfxp> &)), this,</tfxp>
Shinya Kitaoka 120a6e
          SIGNAL(doExplodeChild(const QList<tfxp> &)));</tfxp>
Shinya Kitaoka 120a6e
  connect(m_stageScene, SIGNAL(doExplodeChild(QList<tstageobjectid>)), this,</tstageobjectid>
Shinya Kitaoka 120a6e
          SIGNAL(doExplodeChild(QList<tstageobjectid>)));</tstageobjectid>
Shinya Kitaoka 120a6e
  connect(m_stageScene, SIGNAL(editObject()), this, SIGNAL(editObject()));
Shinya Kitaoka 120a6e
  connect(m_fxScene, SIGNAL(editObject()), this, SIGNAL(editObject()));
Toshihiro Shimizu 890ddd
shun-iwasawa 4a3868
  connect(m_fxScene->getFxSelection(), SIGNAL(doDelete()), this,
shun-iwasawa 4a3868
          SLOT(deleteFxs()));
shun-iwasawa 4a3868
  connect(m_stageScene->getStageSelection(), SIGNAL(doDelete()), this,
shun-iwasawa 4a3868
          SLOT(deleteStageObjects()));
shun-iwasawa 4a3868
shun-iwasawa 60079f
  connect(m_fxScene->getFxSelection(),
shun-iwasawa 60079f
          SIGNAL(columnPasted(const QList<txshcolumnp> &)), this,</txshcolumnp>
shun-iwasawa 60079f
          SIGNAL(columnPasted(const QList<txshcolumnp> &)));</txshcolumnp>
shun-iwasawa 60079f
  connect(m_stageScene->getStageSelection(),
shun-iwasawa 60079f
          SIGNAL(columnPasted(const QList<txshcolumnp> &)), this,</txshcolumnp>
shun-iwasawa 60079f
          SIGNAL(columnPasted(const QList<txshcolumnp> &)));</txshcolumnp>
shun-iwasawa 60079f
Shinya Kitaoka 120a6e
  m_viewer->setScene(m_stageScene);
Shinya Kitaoka 120a6e
  m_fxToolbar->hide();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  setFocusProxy(m_viewer);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
SchematicViewer::~SchematicViewer() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
manongjohn d6e3cc
void SchematicViewer::getNodeColor(int ltype, QColor &nodeColor) {
manongjohn d6e3cc
  switch (ltype) {
manongjohn d6e3cc
  case TZI_XSHLEVEL:
manongjohn d6e3cc
  case OVL_XSHLEVEL:
manongjohn d6e3cc
    nodeColor = getFullcolorColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case PLI_XSHLEVEL:
manongjohn d6e3cc
    nodeColor = getVectorColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case TZP_XSHLEVEL:
manongjohn d6e3cc
    nodeColor = getLevelColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case ZERARYFX_XSHLEVEL:
manongjohn d6e3cc
    nodeColor = getFxColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case CHILD_XSHLEVEL:
manongjohn d6e3cc
    nodeColor = getChildColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case MESH_XSHLEVEL:
manongjohn d6e3cc
    nodeColor = getMeshColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case PLT_XSHLEVEL:
manongjohn d6e3cc
    nodeColor = getPaletteColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case eNormalFx:
manongjohn d6e3cc
    nodeColor = getNormalFxColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case eZeraryFx:
manongjohn d6e3cc
    nodeColor = getFxColumnColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case eMacroFx:
manongjohn d6e3cc
    nodeColor = getMacroFxColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case eGroupedFx:
manongjohn d6e3cc
    nodeColor = getGroupColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case eNormalImageAdjustFx:
manongjohn d6e3cc
    nodeColor = getImageAdjustFxColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case eNormalLayerBlendingFx:
manongjohn d6e3cc
    nodeColor = getLayerBlendingFxColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  case eNormalMatteFx:
manongjohn d6e3cc
    nodeColor = getMatteFxColor();
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  default:
manongjohn d6e3cc
    nodeColor = grey210;
manongjohn d6e3cc
    break;
manongjohn d6e3cc
  }
manongjohn d6e3cc
}
manongjohn d6e3cc
manongjohn d6e3cc
//------------------------------------------------------------------
manongjohn d6e3cc
Shinya Kitaoka 120a6e
void SchematicViewer::setApplication(TApplication *app) {
Shinya Kitaoka 120a6e
  m_stageScene->setXsheetHandle(app->getCurrentXsheet());
Shinya Kitaoka 120a6e
  m_stageScene->setObjectHandle(app->getCurrentObject());
Shinya Kitaoka 120a6e
  m_stageScene->setFxHandle(app->getCurrentFx());
Shinya Kitaoka 120a6e
  m_stageScene->setColumnHandle(app->getCurrentColumn());
Shinya Kitaoka 120a6e
  m_stageScene->setSceneHandle(app->getCurrentScene());
Shinya Kitaoka 120a6e
  m_stageScene->setFrameHandle(app->getCurrentFrame());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_fxScene->setApplication(app);
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
//------------------------------------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void SchematicViewer::updateSchematic() {
Shinya Kitaoka 120a6e
  m_stageScene->updateScene();
Shinya Kitaoka 120a6e
  m_fxScene->updateScene();
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
//------------------------------------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void SchematicViewer::setSchematicScene(SchematicScene *scene) {
Shinya Kitaoka 120a6e
  if (scene) {
Shinya Kitaoka 120a6e
    m_viewer->setScene(scene);
Shinya Kitaoka 120a6e
    m_viewer->centerOn(scene->sceneRect().center());
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
//------------------------------------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void SchematicViewer::createToolbars() {
Shinya Kitaoka 120a6e
  // Initialize them
Shinya Kitaoka 120a6e
  m_stageToolbar->setMovable(false);
Kite 521c84
  m_stageToolbar->setIconSize(QSize(20, 20));
Shinya Kitaoka 120a6e
  m_stageToolbar->setLayoutDirection(Qt::RightToLeft);
Shinya Kitaoka 120a6e
  m_stageToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_commonToolbar->setMovable(false);
Kite 521c84
  m_commonToolbar->setIconSize(QSize(20, 20));
Shinya Kitaoka 120a6e
  m_commonToolbar->setLayoutDirection(Qt::RightToLeft);
Shinya Kitaoka 120a6e
  m_commonToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_fxToolbar->setMovable(false);
Kite 521c84
  m_fxToolbar->setIconSize(QSize(20, 20));
Shinya Kitaoka 120a6e
  m_fxToolbar->setLayoutDirection(Qt::RightToLeft);
Shinya Kitaoka 120a6e
  m_fxToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_swapToolbar->setMovable(false);
Kite 521c84
  m_swapToolbar->setIconSize(QSize(20, 20));
Shinya Kitaoka 120a6e
  m_swapToolbar->setLayoutDirection(Qt::RightToLeft);
Shinya Kitaoka 120a6e
  m_swapToolbar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
//------------------------------------------------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void SchematicViewer::createActions() {
Shinya Kitaoka 120a6e
  // Create all actions
Shinya Kitaoka 120a6e
  QAction *addPegbar = 0, *addSpline = 0, *addCamera = 0, *insertFx = 0,
manongjohn d6e3cc
          *addOutputFx = 0, *switchPort = 0, *iconifyNodes = 0;
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    // Fit schematic
Kite 521c84
    QIcon fitSchematicIcon = createQIcon("fit_to_window");
Shinya Kitaoka 120a6e
    m_fitSchematic =
Shinya Kitaoka 120a6e
        new QAction(fitSchematicIcon, tr("&Fit to Window"), m_commonToolbar);
Shinya Kitaoka 120a6e
    connect(m_fitSchematic, SIGNAL(triggered()), m_viewer, SLOT(fitScene()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Center On
Kite 521c84
    QIcon centerOnIcon = createQIcon("focus");
Shinya Kitaoka 120a6e
    m_centerOn =
Shinya Kitaoka 120a6e
        new QAction(centerOnIcon, tr("&Focus on Current"), m_commonToolbar);
Shinya Kitaoka 120a6e
    connect(m_centerOn, SIGNAL(triggered()), m_viewer, SLOT(centerOnCurrent()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Reorder schematic
Kite 521c84
    QIcon reorderIcon = createQIcon("reorder", false);
Shinya Kitaoka 120a6e
    m_reorder = new QAction(reorderIcon, tr("&Reorder Nodes"), m_commonToolbar);
Shinya Kitaoka 120a6e
    connect(m_reorder, SIGNAL(triggered()), m_viewer, SLOT(reorderScene()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Normalize schematic schematic
Kite 521c84
    QIcon normalizeIcon = createQIcon("actual_pixel_size");
Shinya Kitaoka 120a6e
    m_normalize =
Shinya Kitaoka 120a6e
        new QAction(normalizeIcon, tr("&Reset Size"), m_commonToolbar);
Shinya Kitaoka 120a6e
    connect(m_normalize, SIGNAL(triggered()), m_viewer, SLOT(normalizeScene()));
Toshihiro Shimizu 890ddd
Kite 521c84
    QIcon nodeSizeIcon =
Kite 521c84
        createQIcon(m_maximizedNode ? "minimizenodes" : "maximizenodes");
shun-iwasawa 4a3868
    m_nodeSize = new QAction(
shun-iwasawa 4a3868
        nodeSizeIcon,
shun-iwasawa 4a3868
        m_maximizedNode ? tr("&Minimize Nodes") : tr("&Maximize Nodes"),
shun-iwasawa 4a3868
        m_commonToolbar);
Shinya Kitaoka 120a6e
    connect(m_nodeSize, SIGNAL(triggered()), this, SLOT(changeNodeSize()));
Toshihiro Shimizu 890ddd
Kite 521c84
    QIcon selectModeIcon = createQIcon("selection_schematic");
manongjohn a99cb6
    m_selectMode =
manongjohn a99cb6
        new QAction(selectModeIcon, tr("&Selection Mode"), m_commonToolbar);
manongjohn a99cb6
    m_selectMode->setCheckable(true);
manongjohn a99cb6
    connect(m_selectMode, SIGNAL(triggered()), this, SLOT(selectModeEnabled()));
manongjohn a99cb6
Kite 521c84
    QIcon zoomModeIcon = createQIcon("zoom_schematic");
manongjohn a99cb6
    m_zoomMode = new QAction(zoomModeIcon, tr("&Zoom Mode"), m_commonToolbar);
manongjohn a99cb6
    m_zoomMode->setCheckable(true);
manongjohn a99cb6
    connect(m_zoomMode, SIGNAL(triggered()), this, SLOT(zoomModeEnabled()));
manongjohn a99cb6
Kite 521c84
    QIcon handModeIcon = createQIcon("hand_schematic");
manongjohn a99cb6
    m_handMode = new QAction(handModeIcon, tr("&Hand Mode"), m_commonToolbar);
manongjohn a99cb6
    m_handMode->setCheckable(true);
manongjohn a99cb6
    connect(m_handMode, SIGNAL(triggered()), this, SLOT(handModeEnabled()));
manongjohn a99cb6
manongjohn a99cb6
    setCursorMode(m_cursorMode);
manongjohn a99cb6
Shinya Kitaoka 120a6e
    if (m_fullSchematic) {
Shinya Kitaoka 120a6e
      // AddPegbar
Shinya Kitaoka 120a6e
      addPegbar           = new QAction(tr("&New Pegbar"), m_stageToolbar);
Kite 521c84
      QIcon addPegbarIcon = createQIcon("pegbar");
Shinya Kitaoka 120a6e
      addPegbar->setIcon(addPegbarIcon);
Shinya Kitaoka 120a6e
      connect(addPegbar, SIGNAL(triggered()), m_stageScene,
Shinya Kitaoka 120a6e
              SLOT(onPegbarAdded()));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      // AddCamera
Shinya Kitaoka 120a6e
      addCamera           = new QAction(tr("&New Camera"), m_stageToolbar);
Kite 521c84
      QIcon addCameraIcon = createQIcon("camera");
Shinya Kitaoka 120a6e
      addCamera->setIcon(addCameraIcon);
Shinya Kitaoka 120a6e
      connect(addCamera, SIGNAL(triggered()), m_stageScene,
Shinya Kitaoka 120a6e
              SLOT(onCameraAdded()));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      // AddSpline
Shinya Kitaoka 120a6e
      addSpline           = new QAction(tr("&New Motion Path"), m_stageToolbar);
Kite 521c84
      QIcon addSplineIcon = createQIcon("motionpath");
Shinya Kitaoka 120a6e
      addSpline->setIcon(addSplineIcon);
Shinya Kitaoka 120a6e
      connect(addSpline, SIGNAL(triggered()), m_stageScene,
Shinya Kitaoka 120a6e
              SLOT(onSplineAdded()));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      // Switch display of stage schematic's output port
Shinya Kitaoka 120a6e
      switchPort =
luz paz 6454c4
          new QAction(tr("&Switch output port display mode"), m_stageToolbar);
Shinya Kitaoka 120a6e
      switchPort->setCheckable(true);
Shinya Kitaoka 120a6e
      switchPort->setChecked(m_stageScene->isShowLetterOnPortFlagEnabled());
Kite 521c84
      QIcon switchPortIcon = createQIcon("switchport");
Shinya Kitaoka 120a6e
      switchPort->setIcon(switchPortIcon);
Shinya Kitaoka 120a6e
      connect(switchPort, SIGNAL(toggled(bool)), m_stageScene,
Shinya Kitaoka 120a6e
              SLOT(onSwitchPortModeToggled(bool)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // InsertFx
Shinya Kitaoka 120a6e
      insertFx = CommandManager::instance()->getAction("MI_InsertFx");
Shinya Kitaoka 120a6e
      if (insertFx) {
Kite 521c84
        QIcon insertFxIcon = createQIcon("fx_logo");
Shinya Kitaoka 120a6e
        insertFx->setIcon(insertFxIcon);
Shinya Kitaoka 120a6e
      }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      // AddOutputFx
Shinya Kitaoka 120a6e
      addOutputFx = CommandManager::instance()->getAction("MI_NewOutputFx");
Shinya Kitaoka 120a6e
manongjohn d6e3cc
      // Iconify Fx nodes
manongjohn d6e3cc
      iconifyNodes = new QAction(tr("&Toggle node icons"), m_fxToolbar);
manongjohn d6e3cc
      iconifyNodes->setCheckable(true);
manongjohn d6e3cc
      iconifyNodes->setChecked(!m_fxScene->isNormalIconView());
Kite 521c84
      QIcon iconifyNodesIcon = createQIcon("iconifynodes");
manongjohn d6e3cc
      iconifyNodes->setIcon(iconifyNodesIcon);
manongjohn d6e3cc
      connect(iconifyNodes, SIGNAL(toggled(bool)), m_fxScene,
manongjohn d6e3cc
              SLOT(onIconifyNodesToggled(bool)));
manongjohn d6e3cc
Shinya Kitaoka 120a6e
      // Swap fx/stage schematic
Kite 521c84
      QIcon changeSchematicIcon = createQIcon("swap");
Shinya Kitaoka 120a6e
      m_changeScene =
Shinya Kitaoka 120a6e
          CommandManager::instance()->getAction("A_FxSchematicToggle", true);
Shinya Kitaoka 120a6e
      if (m_changeScene) {
Shinya Kitaoka 120a6e
        m_changeScene->setIcon(changeSchematicIcon);
Shinya Kitaoka 120a6e
        connect(m_changeScene, SIGNAL(triggered()), this,
Shinya Kitaoka 120a6e
                SLOT(onSceneChanged()));
Shinya Kitaoka 120a6e
      } else
Shinya Kitaoka 120a6e
        m_changeScene = 0;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Add actions to toolbars (in reverse)
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_commonToolbar->addSeparator();
Shinya Kitaoka 120a6e
  m_commonToolbar->addAction(m_nodeSize);
Shinya Kitaoka 120a6e
  m_commonToolbar->addAction(m_normalize);
Shinya Kitaoka 120a6e
  m_commonToolbar->addAction(m_reorder);
Shinya Kitaoka 120a6e
  m_commonToolbar->addAction(m_centerOn);
Shinya Kitaoka 120a6e
  m_commonToolbar->addAction(m_fitSchematic);
manongjohn a99cb6
  m_commonToolbar->addSeparator();
manongjohn a99cb6
  m_commonToolbar->addAction(m_handMode);
manongjohn a99cb6
  m_commonToolbar->addAction(m_zoomMode);
manongjohn a99cb6
  m_commonToolbar->addAction(m_selectMode);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_fullSchematic) {
Shinya Kitaoka 120a6e
    m_stageToolbar->addSeparator();
Shinya Kitaoka 120a6e
    m_stageToolbar->addAction(switchPort);
Shinya Kitaoka 120a6e
    m_stageToolbar->addSeparator();
Shinya Kitaoka 120a6e
    m_stageToolbar->addAction(addSpline);
Shinya Kitaoka 120a6e
    m_stageToolbar->addAction(addCamera);
Shinya Kitaoka 120a6e
    m_stageToolbar->addAction(addPegbar);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_fxToolbar->addSeparator();
manongjohn d6e3cc
    m_fxToolbar->addAction(iconifyNodes);
manongjohn d6e3cc
    m_fxToolbar->addSeparator();
Shinya Kitaoka 120a6e
    m_fxToolbar->addAction(addOutputFx);
Shinya Kitaoka 120a6e
    m_fxToolbar->addAction(insertFx);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    if (m_changeScene) m_swapToolbar->addAction(m_changeScene);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicViewer::setStageSchematic() {
Shinya Kitaoka 120a6e
  if (m_viewer->scene() != m_stageScene) {
Shinya Kitaoka 120a6e
    m_viewer->setScene(m_stageScene);
Shinya Kitaoka 120a6e
    QRectF rect = m_stageScene->itemsBoundingRect();
Toshihiro Shimizu 890ddd
shun-iwasawa 443318
    m_viewer->resetTransform();
Shinya Kitaoka 120a6e
    m_viewer->centerOn(rect.center());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_fxToolbar->hide();
Shinya Kitaoka 120a6e
    m_stageToolbar->show();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_viewer->update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  parentWidget()->setWindowTitle(QObject::tr("Stage Schematic"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicViewer::setFxSchematic() {
Shinya Kitaoka 120a6e
  if (m_viewer->scene() != m_fxScene) {
Shinya Kitaoka 120a6e
    m_viewer->setScene(m_fxScene);
Shinya Kitaoka 120a6e
    QRectF rect = m_fxScene->itemsBoundingRect();
Toshihiro Shimizu 890ddd
shun-iwasawa 443318
    m_viewer->resetTransform();
Shinya Kitaoka 120a6e
    m_viewer->centerOn(rect.center());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_stageToolbar->hide();
Shinya Kitaoka 120a6e
    m_fxToolbar->show();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // check if the fx scene was small scaled (icon view mode)
manongjohn d6e3cc
    if (!m_fxScene->isNormalIconView()) m_fxScene->updateScene();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_viewer->update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  parentWidget()->setWindowTitle(QObject::tr("FX Schematic"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicViewer::onSceneChanged() {
Shinya Kitaoka 120a6e
  if (!hasFocus()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QGraphicsScene *scene = m_viewer->scene();
Shinya Kitaoka 120a6e
  if (scene == m_fxScene)
Shinya Kitaoka 120a6e
    setStageSchematic();
Shinya Kitaoka 120a6e
  else if (scene == m_stageScene)
Shinya Kitaoka 120a6e
    setFxSchematic();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicViewer::onSceneSwitched() {
Shinya Kitaoka 120a6e
  m_maximizedNode = m_fxScene->getXsheetHandle()
Shinya Kitaoka 120a6e
                        ->getXsheet()
Shinya Kitaoka 120a6e
                        ->getFxDag()
Shinya Kitaoka 120a6e
                        ->getDagGridDimension() == 0;
Kite 521c84
  QIcon nodeSizeIcon =
Kite 521c84
      createQIcon(m_maximizedNode ? "minimizenodes" : "maximizenodes");
Shinya Kitaoka 120a6e
  m_nodeSize->setIcon(nodeSizeIcon);
Shinya Kitaoka 120a6e
  QString label(m_maximizedNode ? tr("&Minimize Nodes")
Shinya Kitaoka 120a6e
                                : tr("&Maximize Nodes"));
Shinya Kitaoka 120a6e
  m_nodeSize->setText(label);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // reset schematic
shun-iwasawa 443318
  m_viewer->resetTransform();
Shinya Kitaoka 120a6e
  m_viewer->centerOn(m_viewer->scene()->itemsBoundingRect().center());
manongjohn d6e3cc
  if (m_viewer->scene() == m_fxScene && !m_fxScene->isNormalIconView())
Shinya Kitaoka 120a6e
    m_fxScene->updateScene();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool SchematicViewer::isStageSchematicViewed() {
Shinya Kitaoka 120a6e
  QGraphicsScene *scene = m_viewer->scene();
Shinya Kitaoka 120a6e
  return scene == m_stageScene;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicViewer::setStageSchematicViewed(bool isStageSchematic) {
Shinya Kitaoka 120a6e
  if (!m_fullSchematic) isStageSchematic = true;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (isStageSchematic == isStageSchematicViewed()) return;
Shinya Kitaoka 120a6e
  if (isStageSchematic)
Shinya Kitaoka 120a6e
    setStageSchematic();
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    setFxSchematic();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
luz paz 6454c4
// called when the signals xshLevelChanged or objectSwitched is emitted
Shinya Kitaoka 120a6e
void SchematicViewer::updateScenes() {
Shinya Kitaoka 120a6e
  TStageObjectId id = m_stageScene->getCurrentObject();
Shinya Kitaoka 120a6e
  if (id.isColumn()) {
Shinya Kitaoka 120a6e
    m_stageScene->update();
Shinya Kitaoka 120a6e
    TXsheet *xsh = m_stageScene->getXsheetHandle()->getXsheet();
Shinya Kitaoka 120a6e
    if (!xsh) return;
Shinya Kitaoka 120a6e
    TXshColumn *column = xsh->getColumn(id.getIndex());
shun-iwasawa 44381c
    if (!column || !column->getZeraryFxColumn()) return;
shun-iwasawa 44381c
    TFx *fx = column->getZeraryFxColumn()->getZeraryColumnFx();
shun-iwasawa 44381c
    m_fxScene->getFxHandle()->setFx(fx);
Shinya Kitaoka 120a6e
    m_fxScene->update();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void SchematicViewer::changeNodeSize() {
Shinya Kitaoka 120a6e
  m_maximizedNode = !m_maximizedNode;
Shinya Kitaoka 120a6e
  // aggiono l'icona del pulsante;
Shinya Kitaoka 120a6e
  m_fxScene->resizeNodes(m_maximizedNode);
Shinya Kitaoka 120a6e
  m_stageScene->resizeNodes(m_maximizedNode);
Kite 521c84
  QIcon nodeSizeIcon =
Kite 521c84
      createQIcon(m_maximizedNode ? "minimizenodes" : "maximizenodes");
Shinya Kitaoka 120a6e
  m_nodeSize->setIcon(nodeSizeIcon);
Shinya Kitaoka 120a6e
  QString label(m_maximizedNode ? tr("&Minimize Nodes")
Shinya Kitaoka 120a6e
                                : tr("&Maximize Nodes"));
Shinya Kitaoka 120a6e
  m_nodeSize->setText(label);
Toshihiro Shimizu 890ddd
}
manongjohn a99cb6
manongjohn a99cb6
//------------------------------------------------------------------
manongjohn a99cb6
manongjohn d6e3cc
QColor SchematicViewer::getSelectedNodeTextColor() {
manongjohn d6e3cc
  // get colors
manongjohn d6e3cc
  TPixel currentColumnPixel;
manongjohn d6e3cc
  Preferences::instance()->getCurrentColumnData(currentColumnPixel);
manongjohn d6e3cc
  QColor currentColumnColor((int)currentColumnPixel.r,
manongjohn d6e3cc
                            (int)currentColumnPixel.g,
manongjohn d6e3cc
                            (int)currentColumnPixel.b, 255);
manongjohn d6e3cc
  return currentColumnColor;
manongjohn d6e3cc
}
manongjohn 71163f
manongjohn 71163f
//------------------------------------------------------------------
manongjohn 71163f
manongjohn a99cb6
void SchematicViewer::setCursorMode(CursorMode cursorMode) {
manongjohn a99cb6
  m_cursorMode = cursorMode;
manongjohn a99cb6
  m_viewer->setCursorMode(m_cursorMode);
manongjohn a99cb6
manongjohn a99cb6
  m_selectMode->setChecked((m_cursorMode == CursorMode::Select));
manongjohn a99cb6
  m_zoomMode->setChecked((m_cursorMode == CursorMode::Zoom));
manongjohn a99cb6
  m_handMode->setChecked((m_cursorMode == CursorMode::Hand));
manongjohn a99cb6
}
manongjohn a99cb6
manongjohn a99cb6
//------------------------------------------------------------------
manongjohn a99cb6
manongjohn 3c9f8d
void SchematicViewer::selectModeEnabled() { setCursorMode(CursorMode::Select); }
manongjohn a99cb6
manongjohn a99cb6
//------------------------------------------------------------------
manongjohn a99cb6
manongjohn 3c9f8d
void SchematicViewer::zoomModeEnabled() { setCursorMode(CursorMode::Zoom); }
manongjohn a99cb6
manongjohn a99cb6
//------------------------------------------------------------------
manongjohn a99cb6
manongjohn 3c9f8d
void SchematicViewer::handModeEnabled() { setCursorMode(CursorMode::Hand); }
shun-iwasawa 4a3868
shun-iwasawa 4a3868
//------------------------------------------------------------------
shun-iwasawa 4a3868
shun-iwasawa 4a3868
void SchematicViewer::deleteFxs() {
shun-iwasawa 4a3868
  emit doDeleteFxs(m_fxScene->getFxSelection());
shun-iwasawa 4a3868
}
shun-iwasawa 4a3868
shun-iwasawa 4a3868
//------------------------------------------------------------------
shun-iwasawa 4a3868
shun-iwasawa 4a3868
void SchematicViewer::deleteStageObjects() {
shun-iwasawa 4a3868
  emit doDeleteStageObjects(m_stageScene->getStageSelection());
shun-iwasawa 4a3868
}