|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/fxschematicscene.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzQt includes
|
|
manongjohn |
d6e3cc |
#include "toonzqt/fxtypes.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/fxschematicnode.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/gutil.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/dvdialog.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/fxselection.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/schematicgroupeditor.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/swatchviewer.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/tselectionhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzLib includes
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheet.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/toonzscene.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcolumnfxset.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/fxdag.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshlevelcolumn.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcolumnfx.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshpalettecolumn.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshzeraryfxcolumn.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/fxcommand.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheethandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tfxhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tscenehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcolumnhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tframehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tobjecthandle.h"
|
|
manongjohn |
d6e3cc |
#include "toonz/childstack.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzBase includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tmacrofx.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "fxdata.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpassivecachemanager.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tfxattributes.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzCore includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tconst.h"
|
|
manongjohn |
d6e3cc |
#include "tenv.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Qt includes
|
|
Toshihiro Shimizu |
890ddd |
#include <qmenu></qmenu>
|
|
Toshihiro Shimizu |
890ddd |
#include <qapplication></qapplication>
|
|
Toshihiro Shimizu |
890ddd |
#include <qgraphicsscenecontextmenuevent></qgraphicsscenecontextmenuevent>
|
|
shun-iwasawa |
a8fd67 |
#include <qstack></qstack>
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
d6e3cc |
TEnv::IntVar IconifyFxSchematicNodes("IconifyFxSchematicNodes", 0);
|
|
manongjohn |
d6e3cc |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class MatchesFx {
|
|
Shinya Kitaoka |
120a6e |
TFxP m_fx;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
MatchesFx(const TFxP &fx) : m_fx(fx) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool operator()(const TFxP &fx) {
|
|
Shinya Kitaoka |
120a6e |
TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx.getPointer());</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
return (m_fx.getPointer() == fx.getPointer()) ||
|
|
Shinya Kitaoka |
120a6e |
(zfx && m_fx.getPointer() == zfx->getZeraryFx());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void keepSubgroup(QMap<int, *="" qlist<schematicnode="">> &editedGroup) {</int,>
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" qlist<schematicnode="">>::iterator it;</int,>
|
|
Shinya Kitaoka |
120a6e |
for (it = editedGroup.begin(); it != editedGroup.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
QList<schematicnode *=""> groupedNodes = it.value();</schematicnode>
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < groupedNodes.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = dynamic_cast<fxschematicnode *="">(groupedNodes[i]);</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
if (!node) continue;
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = node->getFx();
|
|
Shinya Kitaoka |
120a6e |
assert(fx);
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" qlist<schematicnode="">>::iterator it2;</int,>
|
|
Shinya Kitaoka |
120a6e |
for (it2 = editedGroup.begin(); it2 != editedGroup.end(); it2++) {
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->isContainedInGroup(it2.key()) &&
|
|
Shinya Kitaoka |
120a6e |
!editedGroup[it2.key()].contains(node))
|
|
Shinya Kitaoka |
120a6e |
editedGroup[it2.key()].append(node);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//! Find the input and the output fx contained in \b visitedFxs.
|
|
Shinya Kitaoka |
120a6e |
//! \b visitedFxs must be a connected fx selection. In \b outputFx is put the
|
|
Shinya Kitaoka |
120a6e |
//! root of the connected fx selection.
|
|
Toshihiro Shimizu |
890ddd |
//! In \b inputFx is put a leaf of the connected fx selection.
|
|
Shinya Kitaoka |
120a6e |
void findBoundariesFxs(TFx *&inputFx, TFx *&outputFx,
|
|
Shinya Kitaoka |
120a6e |
QMap<tfx *,="" bool=""> &visitedFxs, TFx *currentFx = 0) {</tfx>
|
|
Shinya Kitaoka |
120a6e |
if (visitedFxs.isEmpty()) return;
|
|
Shinya Kitaoka |
120a6e |
if (!currentFx) currentFx = visitedFxs.begin().key();
|
|
Shinya Kitaoka |
120a6e |
int inputPortCount = currentFx->getInputPortCount();
|
|
Shinya Kitaoka |
120a6e |
int outputConnectionCount = currentFx->getOutputConnectionCount();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (inputPortCount > 0 && !visitedFxs[currentFx]) {
|
|
Shinya Kitaoka |
120a6e |
visitedFxs[currentFx] = true;
|
|
Shinya Kitaoka |
120a6e |
TFxPort *fxPort = currentFx->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = fxPort->getFx();
|
|
Shinya Kitaoka |
120a6e |
if (fx && visitedFxs.count(fx) == 1) {
|
|
Shinya Kitaoka |
120a6e |
if (!visitedFxs[fx]) findBoundariesFxs(inputFx, outputFx, visitedFxs, fx);
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
inputFx = currentFx;
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
inputFx = currentFx;
|
|
Shinya Kitaoka |
120a6e |
if (!outputFx) {
|
|
Shinya Kitaoka |
120a6e |
if (outputConnectionCount > 0) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = currentFx->getOutputConnection(0)->getOwnerFx();
|
|
Shinya Kitaoka |
120a6e |
if (fx && visitedFxs.count(fx) == 1) {
|
|
Shinya Kitaoka |
120a6e |
if (!visitedFxs[fx])
|
|
Shinya Kitaoka |
120a6e |
findBoundariesFxs(inputFx, outputFx, visitedFxs, fx);
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
outputFx = currentFx;
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
outputFx = currentFx;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool canDisconnectSelection(FxSelection *selection) {
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> selectedFx = selection->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < selectedFx.size(); i++) // .....
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = selectedFx[i].getPointer();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TLevelColumnFx *lcFx = dynamic_cast<tlevelcolumnfx *="">(fx);</tlevelcolumnfx>
|
|
Shinya Kitaoka |
120a6e |
TPaletteColumnFx *pfx = dynamic_cast<tpalettecolumnfx *="">(fx);</tpalettecolumnfx>
|
|
Shinya Kitaoka |
120a6e |
TXsheetFx *xfx = dynamic_cast<txsheetfx *="">(fx);</txsheetfx>
|
|
Shinya Kitaoka |
120a6e |
TOutputFx *ofx = dynamic_cast<toutputfx *="">(fx);</toutputfx>
|
|
Shinya Kitaoka |
120a6e |
TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx);</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
return (!lcFx && !pfx && !xfx && !ofx &&
|
|
Shinya Kitaoka |
120a6e |
(!zfx || zfx->getInputPortCount() > 0)); // !!!!!
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> getRoots(const QList<tfxp> &fxs, TFxSet *terminals) {</tfxp></tfxp>
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> roots;</tfxp>
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < fxs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = fxs[i].getPointer();
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
bool isRoot = true;
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < fx->getOutputConnectionCount(); j++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *outFx = fx->getOutputConnection(j)->getOwnerFx();
|
|
Shinya Kitaoka |
120a6e |
if (outFx &&
|
|
Shinya Kitaoka |
120a6e |
std::find_if(fxs.begin(), fxs.end(), MatchesFx(outFx)) != fxs.end() &&
|
|
Shinya Kitaoka |
120a6e |
!terminals->containsFx(fx))
|
|
Shinya Kitaoka |
120a6e |
isRoot = false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (isRoot) roots.append(fx);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return roots;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
manongjohn |
adae7d |
bool resizingNodes = false;
|
|
manongjohn |
adae7d |
bool updatingScene = false;
|
|
shun-iwasawa |
9d4ead |
|
|
shun-iwasawa |
9d4ead |
bool nodePosDefined(const TFx *fx1, const TFx *fx2) {
|
|
shun-iwasawa |
9d4ead |
bool isPosDefined[2] = {
|
|
shun-iwasawa |
9d4ead |
fx1->getAttributes()->getDagNodePos() != TConst::nowhere,
|
|
shun-iwasawa |
9d4ead |
fx2->getAttributes()->getDagNodePos() != TConst::nowhere};
|
|
shun-iwasawa |
9d4ead |
|
|
shun-iwasawa |
9d4ead |
if (isPosDefined[0] == isPosDefined[1])
|
|
shun-iwasawa |
9d4ead |
return fx1->getIdentifier() < fx2->getIdentifier();
|
|
shun-iwasawa |
9d4ead |
else
|
|
shun-iwasawa |
9d4ead |
return isPosDefined[0];
|
|
shun-iwasawa |
9d4ead |
}
|
|
shun-iwasawa |
9d4ead |
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// FxSchematicScene::SupportLinks
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::addBridgeLink(SchematicLink *link) {
|
|
Shinya Kitaoka |
120a6e |
if (link && !m_bridges.contains(link)) m_bridges.push_back(link);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::addOutputLink(SchematicLink *link) {
|
|
Shinya Kitaoka |
120a6e |
if (link && !m_outputs.contains(link)) m_outputs.push_back(link);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::addInputLink(SchematicLink *link) {
|
|
Shinya Kitaoka |
120a6e |
if (link && !m_inputs.contains(link)) m_inputs.push_back(link);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::hideBridgeLinks() {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_bridges.size(); i++) m_bridges[i]->hide();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::hideInputLinks() {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_inputs.size(); i++) m_inputs[i]->hide();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::hideOutputLinks() {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_outputs.size(); i++) m_outputs[i]->hide();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::showBridgeLinks() {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_bridges.size(); i++) m_bridges[i]->show();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::showInputLinks() {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_inputs.size(); i++) m_inputs[i]->show();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::showOutputLinks() {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_outputs.size(); i++) m_outputs[i]->show();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::removeBridgeLinks(bool deleteLink) {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_bridges.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link = m_bridges[i];
|
|
Shinya Kitaoka |
120a6e |
m_bridges.removeAt(i);
|
|
Shinya Kitaoka |
120a6e |
if (deleteLink) {
|
|
Shinya Kitaoka |
120a6e |
link->getStartPort()->removeLink(link);
|
|
Shinya Kitaoka |
120a6e |
link->getEndPort()->removeLink(link);
|
|
Shinya Kitaoka |
120a6e |
delete link;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::removeInputLinks(bool deleteLink) {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_inputs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link = m_inputs[i];
|
|
Shinya Kitaoka |
120a6e |
m_inputs.removeAt(i);
|
|
Shinya Kitaoka |
120a6e |
if (deleteLink) {
|
|
Shinya Kitaoka |
120a6e |
link->getStartPort()->removeLink(link);
|
|
Shinya Kitaoka |
120a6e |
link->getEndPort()->removeLink(link);
|
|
Shinya Kitaoka |
120a6e |
delete link;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::removeOutputLinks(bool deleteLink) {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < m_outputs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link = m_outputs[i];
|
|
Shinya Kitaoka |
120a6e |
m_outputs.removeAt(i);
|
|
Shinya Kitaoka |
120a6e |
if (deleteLink) {
|
|
Shinya Kitaoka |
120a6e |
link->getStartPort()->removeLink(link);
|
|
Shinya Kitaoka |
120a6e |
link->getEndPort()->removeLink(link);
|
|
Shinya Kitaoka |
120a6e |
delete link;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::SupportLinks::clearAll() {
|
|
Shinya Kitaoka |
120a6e |
m_bridges.clear();
|
|
Shinya Kitaoka |
120a6e |
m_inputs.clear();
|
|
Shinya Kitaoka |
120a6e |
m_outputs.clear();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int FxSchematicScene::SupportLinks::size() {
|
|
Shinya Kitaoka |
120a6e |
return m_bridges.size() + m_inputs.size() + m_outputs.size();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// FxSchematicScene
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
FxSchematicScene::FxSchematicScene(QWidget *parent)
|
|
Shinya Kitaoka |
120a6e |
: SchematicScene(parent)
|
|
Shinya Kitaoka |
120a6e |
, m_firstPoint(sceneRect().center())
|
|
Shinya Kitaoka |
120a6e |
, m_xshHandle(0)
|
|
Shinya Kitaoka |
120a6e |
, m_fxHandle(0)
|
|
Shinya Kitaoka |
120a6e |
, m_addFxContextMenu()
|
|
Shinya Kitaoka |
120a6e |
, m_disconnectionLinks()
|
|
Shinya Kitaoka |
120a6e |
, m_connectionLinks()
|
|
Shinya Kitaoka |
120a6e |
, m_isConnected(false)
|
|
Shinya Kitaoka |
120a6e |
, m_linkUnlinkSimulation(false)
|
|
Shinya Kitaoka |
120a6e |
, m_altPressed(false)
|
|
Shinya Kitaoka |
120a6e |
, m_lastPos(0, 0)
|
|
Shinya Kitaoka |
120a6e |
, m_currentFxNode(0)
|
|
Shinya Kitaoka |
120a6e |
, m_gridDimension(eSmall)
|
|
manongjohn |
d6e3cc |
, m_isNormalIconView(!IconifyFxSchematicNodes)
|
|
manongjohn |
d6e3cc |
, m_viewer() {
|
|
manongjohn |
d6e3cc |
m_viewer = (SchematicViewer *)parent;
|
|
manongjohn |
d6e3cc |
|
|
Shinya Kitaoka |
120a6e |
m_selection = new FxSelection();
|
|
Shinya Kitaoka |
120a6e |
m_selection->setFxSchematicScene(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
connect(m_selection, SIGNAL(doCollapse(const QList<tfxp> &)), this,</tfxp>
|
|
Shinya Kitaoka |
120a6e |
SLOT(onCollapse(const QList<tfxp> &)));</tfxp>
|
|
Shinya Kitaoka |
120a6e |
connect(m_selection, SIGNAL(doExplodeChild(const QList<tfxp> &)), this,</tfxp>
|
|
Shinya Kitaoka |
120a6e |
SIGNAL(doExplodeChild(const QList<tfxp> &)));</tfxp>
|
|
Shinya Kitaoka |
120a6e |
connect(this, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_addFxContextMenu.setSelection(m_selection);
|
|
Shinya Kitaoka |
120a6e |
m_highlightedLinks.clear();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
FxSchematicScene::~FxSchematicScene() {
|
|
Shinya Kitaoka |
120a6e |
if (m_selection) delete m_selection;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::setApplication(TApplication *app) {
|
|
Shinya Kitaoka |
120a6e |
m_app = app;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_xshHandle = app->getCurrentXsheet();
|
|
Shinya Kitaoka |
120a6e |
m_fxHandle = app->getCurrentFx();
|
|
Shinya Kitaoka |
120a6e |
m_frameHandle = app->getCurrentFrame();
|
|
Shinya Kitaoka |
120a6e |
m_columnHandle = app->getCurrentColumn();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (m_fxHandle)
|
|
Shinya Kitaoka |
120a6e |
connect(m_fxHandle, SIGNAL(fxSwitched()), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onCurrentFxSwitched()));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_addFxContextMenu.setApplication(app);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_selection->setXsheetHandle(m_xshHandle);
|
|
Shinya Kitaoka |
120a6e |
m_selection->setFxHandle(m_fxHandle);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updateScene() {
|
|
manongjohn |
adae7d |
if (updatingScene) return;
|
|
manongjohn |
adae7d |
updatingScene = true;
|
|
manongjohn |
d6e3cc |
if (!views().empty()) m_disconnectionLinks.clearAll();
|
|
Shinya Kitaoka |
120a6e |
m_connectionLinks.clearAll();
|
|
Shinya Kitaoka |
120a6e |
m_selectionOldPos.clear();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
clearSelection();
|
|
Shinya Kitaoka |
120a6e |
clearAllItems();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_table.clear();
|
|
Shinya Kitaoka |
120a6e |
m_groupedTable.clear();
|
|
Shinya Kitaoka |
120a6e |
m_groupEditorTable.clear();
|
|
Shinya Kitaoka |
120a6e |
m_macroEditorTable.clear();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_currentFxNode = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// GroupId->Fx
|
|
Shinya Kitaoka |
120a6e |
QMap<int, qlist<tfxp="">> groupedFxs;</int,>
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" qlist<schematicnode="">> editedGroup;</int,>
|
|
Shinya Kitaoka |
120a6e |
QMap<tmacrofx *="" *,="" qlist<schematicnode="">> editedMacro;</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xshHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
m_gridDimension = xsh->getFxDag()->getDagGridDimension();
|
|
Shinya Kitaoka |
120a6e |
TFxSet *fxSet = xsh->getFxDag()->getInternalFxs();
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
FxDag *fxDag = xsh->getFxDag();
|
|
Shinya Kitaoka |
120a6e |
// Add XSheetFX node
|
|
Shinya Kitaoka |
120a6e |
addFxSchematicNode(fxDag->getXsheetFx());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Add outputFx nodes
|
|
Shinya Kitaoka |
120a6e |
int k;
|
|
Shinya Kitaoka |
120a6e |
for (k = 0; k < fxDag->getOutputFxCount(); k++) {
|
|
Shinya Kitaoka |
120a6e |
TOutputFx *fx = fxDag->getOutputFx(k);
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->isGrouped() &&
|
|
Shinya Kitaoka |
120a6e |
!fx->getAttributes()->isGroupEditing()) {
|
|
Shinya Kitaoka |
120a6e |
groupedFxs[fx->getAttributes()->getGroupId()].push_back(fx);
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *node = addFxSchematicNode(fx);
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->isGrouped())
|
|
Shinya Kitaoka |
120a6e |
editedGroup[fx->getAttributes()->getEditingGroupId()].append(node);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Add columnFx and zeraryFx nodes
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < xsh->getColumnCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TXshColumn *column = xsh->getColumn(i);
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = 0;
|
|
Shinya Kitaoka |
120a6e |
if (TXshLevelColumn *lc = column->getLevelColumn())
|
|
Shinya Kitaoka |
120a6e |
fx = lc->getLevelColumnFx();
|
|
Shinya Kitaoka |
120a6e |
else if (TXshPaletteColumn *pc = dynamic_cast<txshpalettecolumn *="">(column))</txshpalettecolumn>
|
|
Shinya Kitaoka |
120a6e |
fx = pc->getPaletteColumnFx();
|
|
Shinya Kitaoka |
120a6e |
else if (TXshZeraryFxColumn *zc =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<txshzeraryfxcolumn *="">(column))</txshzeraryfxcolumn>
|
|
Shinya Kitaoka |
120a6e |
fx = zc->getZeraryColumnFx();
|
|
Shinya Kitaoka |
120a6e |
if (!fx) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->isGrouped() &&
|
|
Shinya Kitaoka |
120a6e |
!fx->getAttributes()->isGroupEditing()) {
|
|
Shinya Kitaoka |
120a6e |
groupedFxs[fx->getAttributes()->getGroupId()].push_back(fx);
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (column->isEmpty() && fx && fx->getOutputConnectionCount() == 0)
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *node = addFxSchematicNode(fx);
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->isGrouped())
|
|
Shinya Kitaoka |
120a6e |
editedGroup[fx->getAttributes()->getEditingGroupId()].append(node);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Add normalFx
|
|
shun-iwasawa |
9d4ead |
QList<tfx *=""> fxsToBePlaced;</tfx>
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < fxSet->getFxCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = fxSet->getFx(i);
|
|
Shinya Kitaoka |
120a6e |
TMacroFx *macro = dynamic_cast<tmacrofx *="">(fx);</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->isGrouped() &&
|
|
Shinya Kitaoka |
120a6e |
!fx->getAttributes()->isGroupEditing()) {
|
|
Shinya Kitaoka |
120a6e |
groupedFxs[fx->getAttributes()->getGroupId()].push_back(fx);
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
} else if (macro && macro->isEditing()) {
|
|
Shinya Kitaoka |
120a6e |
std::vector<tfxp> fxs = macro->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < (int)fxs.size(); j++) {
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *node = addFxSchematicNode(fxs[j].getPointer());
|
|
Shinya Kitaoka |
120a6e |
editedMacro[macro].append(node);
|
|
Shinya Kitaoka |
120a6e |
if (fxs[j]->getAttributes()->isGrouped() &&
|
|
Shinya Kitaoka |
120a6e |
macro->getAttributes()->isGroupEditing())
|
|
Shinya Kitaoka |
120a6e |
editedGroup[fx->getAttributes()->getEditingGroupId()].append(node);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
9d4ead |
fxsToBePlaced.append(fx);
|
|
shun-iwasawa |
9d4ead |
}
|
|
shun-iwasawa |
9d4ead |
|
|
shun-iwasawa |
9d4ead |
// sorting fxs so that fxs with specified positions are placed first
|
|
shun-iwasawa |
443318 |
std::sort(fxsToBePlaced.begin(), fxsToBePlaced.end(), nodePosDefined);
|
|
shun-iwasawa |
9d4ead |
|
|
shun-iwasawa |
9d4ead |
for (auto fx : fxsToBePlaced) {
|
|
Shinya Kitaoka |
120a6e |
SchematicNode *node = addFxSchematicNode(fx);
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->isGrouped())
|
|
Shinya Kitaoka |
120a6e |
editedGroup[fx->getAttributes()->getEditingGroupId()].append(node);
|
|
shun-iwasawa |
9d4ead |
TMacroFx *macro = dynamic_cast<tmacrofx *="">(fx);</tmacrofx>
|
|
manongjohn |
f37f4a |
// If adding an unedited macro and nodes are not yet set, let's position the
|
|
manongjohn |
f37f4a |
// internal nodes now
|
|
manongjohn |
f37f4a |
if (macro) {
|
|
manongjohn |
f37f4a |
double minY = macro->getAttributes()->getDagNodePos().y;
|
|
manongjohn |
f37f4a |
double maxX = macro->getAttributes()->getDagNodePos().x;
|
|
manongjohn |
f37f4a |
double y = minY;
|
|
manongjohn |
f37f4a |
double x = maxX;
|
|
manongjohn |
f37f4a |
std::vector<tfxp> fxs = macro->getFxs();</tfxp>
|
|
manongjohn |
f37f4a |
for (int j = 0; j < (int)fxs.size(); j++) {
|
|
manongjohn |
f37f4a |
TFx *macroFx = fxs[j].getPointer();
|
|
manongjohn |
f37f4a |
if (macroFx && !m_placedFxs.contains(macroFx)) {
|
|
manongjohn |
f37f4a |
placeNodeAndParents(macroFx, x, maxX, minY);
|
|
manongjohn |
f37f4a |
y -= (m_gridDimension == eLarge ? 100 : 50);
|
|
manongjohn |
f37f4a |
minY = std::min(y, minY);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// grouped node
|
|
Shinya Kitaoka |
120a6e |
QMap<int, qlist<tfxp="">>::const_iterator it;</int,>
|
|
Shinya Kitaoka |
120a6e |
for (it = groupedFxs.begin(); it != groupedFxs.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = addGroupedFxSchematicNode(it.key(), it.value());
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = node->getFx();
|
|
Shinya Kitaoka |
120a6e |
assert(fx);
|
|
Shinya Kitaoka |
120a6e |
int editingGroupId = fx->getAttributes()->getEditingGroupId();
|
|
Shinya Kitaoka |
120a6e |
if (editingGroupId != -1) editedGroup[editingGroupId].append(node);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
keepSubgroup(editedGroup);
|
|
Shinya Kitaoka |
120a6e |
updateEditedGroups(editedGroup);
|
|
Shinya Kitaoka |
120a6e |
updateEditedMacros(editedMacro);
|
|
Shinya Kitaoka |
120a6e |
updateLink();
|
|
Shinya Kitaoka |
120a6e |
m_nodesToPlace.clear();
|
|
manongjohn |
adae7d |
updatingScene = false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updateEditedGroups(
|
|
Shinya Kitaoka |
120a6e |
const QMap<int, *="" qlist<schematicnode="">> &editedGroup) {</int,>
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" qlist<schematicnode="">>::const_iterator it;</int,>
|
|
Shinya Kitaoka |
120a6e |
for (it = editedGroup.begin(); it != editedGroup.end(); it++) {
|
|
shun-iwasawa |
b322e1 |
int zValue = 2;
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" qlist<schematicnode="">>::const_iterator it2 = editedGroup.begin();</int,>
|
|
Shinya Kitaoka |
120a6e |
while (it2 != editedGroup.end()) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *placedFxNode =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematicnode *="">(it2.value()[0]);</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *fxNode = dynamic_cast<fxschematicnode *="">(it.value()[0]);</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
if (!placedFxNode || !fxNode) {
|
|
Shinya Kitaoka |
120a6e |
it2++;
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
int placedGroupedId =
|
|
Shinya Kitaoka |
120a6e |
placedFxNode->getFx()->getAttributes()->getEditingGroupId();
|
|
Shinya Kitaoka |
120a6e |
if (fxNode->getFx()->getAttributes()->isContainedInGroup(
|
|
Shinya Kitaoka |
120a6e |
placedGroupedId) &&
|
|
Shinya Kitaoka |
120a6e |
fxNode->getFx()->getAttributes()->getEditingGroupId() != it2.key())
|
|
Shinya Kitaoka |
120a6e |
zValue += 2;
|
|
Shinya Kitaoka |
120a6e |
it2++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
FxSchematicGroupEditor *node =
|
|
Shinya Kitaoka |
120a6e |
addEditedGroupedFxSchematicNode(it.key(), it.value());
|
|
Shinya Kitaoka |
120a6e |
node->setZValue(zValue);
|
|
Shinya Kitaoka |
120a6e |
node->setGroupedNodeZValue(zValue + 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updateEditedMacros(
|
|
Shinya Kitaoka |
120a6e |
const QMap<tmacrofx *="" *,="" qlist<schematicnode="">> &editedMacro) {</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
QMap<tmacrofx *="" *,="" qlist<schematicnode="">>::const_iterator it;</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
for (it = editedMacro.begin(); it != editedMacro.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
TMacroFx *macro = it.key();
|
|
Shinya Kitaoka |
120a6e |
int zValue = 2;
|
|
Shinya Kitaoka |
120a6e |
if (macro->getAttributes()->isGrouped()) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicGroupEditor *containingGroup =
|
|
Shinya Kitaoka |
120a6e |
m_groupEditorTable[macro->getAttributes()->getEditingGroupId()];
|
|
Shinya Kitaoka |
120a6e |
assert(containingGroup);
|
|
Shinya Kitaoka |
120a6e |
zValue = containingGroup->zValue() + 2;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
FxSchematicMacroEditor *node =
|
|
Shinya Kitaoka |
120a6e |
addEditedMacroFxSchematicNode(it.key(), it.value());
|
|
Shinya Kitaoka |
120a6e |
node->setZValue(zValue);
|
|
Shinya Kitaoka |
120a6e |
node->setGroupedNodeZValue(zValue + 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *FxSchematicScene::addFxSchematicNode(TFx *fx) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = createFxSchematicNode(fx);
|
|
Shinya Kitaoka |
120a6e |
if (!node) return 0;
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged()));
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(xsheetChanged()), this, SLOT(onXsheetChanged()));
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(switchCurrentFx(TFx *)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onSwitchCurrentFx(TFx *)));
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(currentColumnChanged(int)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onCurrentColumnChanged(int)));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(fxNodeDoubleClicked()), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onFxNodeDoubleClicked()));
|
|
manongjohn |
adae7d |
|
|
manongjohn |
adae7d |
connect(node, SIGNAL(nodeChangedSize()), this, SLOT(onNodeChangedSize()));
|
|
manongjohn |
adae7d |
|
|
Shinya Kitaoka |
120a6e |
if (fx->getAttributes()->getDagNodePos() == TConst::nowhere) {
|
|
Shinya Kitaoka |
120a6e |
node->resize(m_gridDimension == 0);
|
|
Shinya Kitaoka |
120a6e |
placeNode(node);
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
updatePosition(node, fx->getAttributes()->getDagNodePos());
|
|
Shinya Kitaoka |
120a6e |
m_table[fx] = node;
|
|
Shinya Kitaoka |
120a6e |
return node;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *FxSchematicScene::addGroupedFxSchematicNode(
|
|
Shinya Kitaoka |
120a6e |
int groupId, const QList<tfxp> &groupedFxs) {</tfxp>
|
|
Shinya Kitaoka |
120a6e |
TFxSet *terminals = getXsheet()->getFxDag()->getTerminalFxs();
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> roots = getRoots(groupedFxs, terminals);</tfxp>
|
|
Shinya Kitaoka |
120a6e |
if (roots.isEmpty()) return 0;
|
|
Shinya Kitaoka |
120a6e |
std::wstring name = roots[0]->getAttributes()->getGroupName(false);
|
|
Shinya Kitaoka |
120a6e |
FxGroupNode *node = new FxGroupNode(this, groupedFxs, roots, groupId, name);
|
|
Shinya Kitaoka |
120a6e |
if (!node) return 0;
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(sceneChanged()), this, SLOT(onSceneChanged()));
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(xsheetChanged()), this, SLOT(onXsheetChanged()));
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(switchCurrentFx(TFx *)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onSwitchCurrentFx(TFx *)));
|
|
Shinya Kitaoka |
120a6e |
connect(node, SIGNAL(currentColumnChanged(int)), this,
|
|
Shinya Kitaoka |
120a6e |
SLOT(onCurrentColumnChanged(int)));
|
|
manongjohn |
b13816 |
connect(node, SIGNAL(fxNodeDoubleClicked()), this,
|
|
manongjohn |
b13816 |
SLOT(onFxNodeDoubleClicked()));
|
|
Shinya Kitaoka |
120a6e |
m_groupedTable[groupId] = node;
|
|
Shinya Kitaoka |
120a6e |
return node;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
FxSchematicGroupEditor *FxSchematicScene::addEditedGroupedFxSchematicNode(
|
|
Shinya Kitaoka |
120a6e |
int groupId, const QList<schematicnode *=""> &groupedFxs) {</schematicnode>
|
|
Shinya Kitaoka |
120a6e |
FxSchematicGroupEditor *editorGroup =
|
|
Shinya Kitaoka |
120a6e |
new FxSchematicGroupEditor(groupId, groupedFxs, this);
|
|
Shinya Kitaoka |
120a6e |
m_groupEditorTable[groupId] = editorGroup;
|
|
Shinya Kitaoka |
120a6e |
return editorGroup;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
FxSchematicMacroEditor *FxSchematicScene::addEditedMacroFxSchematicNode(
|
|
Shinya Kitaoka |
120a6e |
TMacroFx *macro, const QList<schematicnode *=""> &groupedFxs) {</schematicnode>
|
|
Shinya Kitaoka |
120a6e |
FxSchematicMacroEditor *editorMacro =
|
|
Shinya Kitaoka |
120a6e |
new FxSchematicMacroEditor(macro, groupedFxs, this);
|
|
Shinya Kitaoka |
120a6e |
m_macroEditorTable[macro] = editorMacro;
|
|
Shinya Kitaoka |
120a6e |
return editorMacro;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updatePosition(FxSchematicNode *node,
|
|
Shinya Kitaoka |
120a6e |
const TPointD &pos) {
|
|
Shinya Kitaoka |
120a6e |
node->setPos(QPointF(pos.x, pos.y));
|
|
Shinya Kitaoka |
120a6e |
node->getFx()->getAttributes()->setDagNodePos(pos);
|
|
Shinya Kitaoka |
120a6e |
QVector<schematicnode *=""> placedNodes = getPlacedNode(node);</schematicnode>
|
|
Shinya Kitaoka |
120a6e |
int step = m_gridDimension == eLarge ? 100 : 50;
|
|
Shinya Kitaoka |
120a6e |
TPointD offset(0, -step);
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < placedNodes.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *placedNode =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematicnode *="">(placedNodes[i]);</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
assert(placedNode);
|
|
Shinya Kitaoka |
120a6e |
TPointD newPos =
|
|
Shinya Kitaoka |
120a6e |
placedNode->getFx()->getAttributes()->getDagNodePos() + offset;
|
|
Shinya Kitaoka |
120a6e |
updatePosition(placedNode, newPos);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! create node depends on the fx type
|
|
shun-iwasawa |
b322e1 |
*/
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *FxSchematicScene::createFxSchematicNode(TFx *fx) {
|
|
Shinya Kitaoka |
120a6e |
if (TLevelColumnFx *lcFx = dynamic_cast<tlevelcolumnfx *="">(fx))</tlevelcolumnfx>
|
|
Shinya Kitaoka |
120a6e |
return new FxSchematicColumnNode(this, lcFx);
|
|
Shinya Kitaoka |
120a6e |
else if (TPaletteColumnFx *pfx = dynamic_cast<tpalettecolumnfx *="">(fx))</tpalettecolumnfx>
|
|
Shinya Kitaoka |
120a6e |
return new FxSchematicPaletteNode(this, pfx);
|
|
Shinya Kitaoka |
120a6e |
else if (TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx))</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
return new FxSchematicZeraryNode(this, zfx);
|
|
Shinya Kitaoka |
120a6e |
else if (TXsheetFx *xfx = dynamic_cast<txsheetfx *="">(fx))</txsheetfx>
|
|
Shinya Kitaoka |
120a6e |
return new FxSchematicXSheetNode(this, xfx);
|
|
Shinya Kitaoka |
120a6e |
else if (TOutputFx *ofx = dynamic_cast<toutputfx *="">(fx))</toutputfx>
|
|
Shinya Kitaoka |
120a6e |
return new FxSchematicOutputNode(this, ofx);
|
|
shun-iwasawa |
a8fd67 |
else if (fx && fx->getFxType().find("nothingFx") !=
|
|
shun-iwasawa |
a8fd67 |
std::string::npos) // pass-through node
|
|
shun-iwasawa |
a8fd67 |
return new FxSchematicPassThroughNode(this, fx);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
return new FxSchematicNormalFxNode(this, fx);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! place nodes of which positions are not specified manually
|
|
shun-iwasawa |
b322e1 |
*/
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::placeNode(FxSchematicNode *node) {
|
|
Shinya Kitaoka |
120a6e |
if (!node) return;
|
|
Shinya Kitaoka |
120a6e |
int step = m_gridDimension == eLarge ? 100 : 50;
|
|
Shinya Kitaoka |
120a6e |
FxDag *fxDag = m_xshHandle->getXsheet()->getFxDag();
|
|
Shinya Kitaoka |
120a6e |
QRectF nodeRect = node->boundingRect();
|
|
Shinya Kitaoka |
120a6e |
if (node->isA(eOutpuFx)) {
|
|
Shinya Kitaoka |
120a6e |
// I'm placing an output node
|
|
Shinya Kitaoka |
120a6e |
TFx *xsheetFx = fxDag->getXsheetFx();
|
|
Shinya Kitaoka |
120a6e |
TFxPort *outPort = xsheetFx->getOutputConnection(0);
|
|
Shinya Kitaoka |
120a6e |
TFx *connectedOutput = outPort ? outPort->getOwnerFx() : 0;
|
|
Shinya Kitaoka |
120a6e |
if (connectedOutput && connectedOutput == node->getFx()) {
|
|
Shinya Kitaoka |
120a6e |
// The output node is connected to the xsheet node
|
|
Shinya Kitaoka |
120a6e |
TPointD pos = xsheetFx->getAttributes()->getDagNodePos();
|
|
Shinya Kitaoka |
120a6e |
if (pos != TConst::nowhere)
|
|
Shinya Kitaoka |
120a6e |
nodeRect.translate(pos.x + 120, pos.y);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
nodeRect.translate(sceneRect().center());
|
|
Shinya Kitaoka |
120a6e |
while (!isAnEmptyZone(nodeRect)) nodeRect.translate(0, step);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
// The output node is not connected to the xsheet node
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = node->getFx();
|
|
Shinya Kitaoka |
120a6e |
TFxPort *port = fx->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
TFx *inputFx = port->getFx();
|
|
Shinya Kitaoka |
120a6e |
if (inputFx) {
|
|
Shinya Kitaoka |
120a6e |
// The output node is connected to another node
|
|
Shinya Kitaoka |
120a6e |
TPointD pos = inputFx->getAttributes()->getDagNodePos();
|
|
Shinya Kitaoka |
120a6e |
if (pos != TConst::nowhere)
|
|
Shinya Kitaoka |
120a6e |
nodeRect.translate(pos.x + 120, pos.y);
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
m_nodesToPlace[inputFx].append(node);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
// The output node is not connected
|
|
Shinya Kitaoka |
120a6e |
QPointF pos = sceneRect().center();
|
|
Shinya Kitaoka |
120a6e |
nodeRect.translate(pos);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
while (!isAnEmptyZone(nodeRect)) nodeRect.translate(0, step);
|
|
Shinya Kitaoka |
120a6e |
QPointF newPos = nodeRect.topLeft();
|
|
Shinya Kitaoka |
120a6e |
node->getFx()->getAttributes()->setDagNodePos(
|
|
Shinya Kitaoka |
120a6e |
TPointD(newPos.x(), newPos.y()));
|
|
Shinya Kitaoka |
120a6e |
node->setPos(newPos);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
} else if (node->isA(eXSheetFx)) {
|
|
Shinya Kitaoka |
120a6e |
// I'm placing the xsheet node
|
|
Shinya Kitaoka |
120a6e |
TFxSet *terminalFxs = fxDag->getTerminalFxs();
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
double maxX = m_firstPoint.x();
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < terminalFxs->getFxCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *terminalFx = terminalFxs->getFx(i);
|
|
Shinya Kitaoka |
120a6e |
if (terminalFx->getAttributes()->getDagNodePos() == TConst::nowhere)
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
maxX = std::max(maxX, terminalFx->getAttributes()->getDagNodePos().x);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TPointD oldPos = node->getFx()->getAttributes()->getDagNodePos();
|
|
Shinya Kitaoka |
120a6e |
QPointF pos;
|
|
Shinya Kitaoka |
120a6e |
if (oldPos == TConst::nowhere)
|
|
Shinya Kitaoka |
120a6e |
pos = QPointF(maxX + 120, m_firstPoint.y());
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
pos = QPointF(maxX + 120 > oldPos.x ? maxX + 120 : oldPos.x, oldPos.y);
|
|
Shinya Kitaoka |
120a6e |
node->getFx()->getAttributes()->setDagNodePos(TPointD(pos.x(), pos.y()));
|
|
Shinya Kitaoka |
120a6e |
node->setPos(pos);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
manongjohn |
f37f4a |
} else if (node->isA(eMacroFx)) {
|
|
manongjohn |
f37f4a |
double minX = TConst::nowhere.x, minY = TConst::nowhere.y, maxY;
|
|
manongjohn |
f37f4a |
QPointF pos;
|
|
manongjohn |
f37f4a |
TMacroFx *macroFx = dynamic_cast<tmacrofx *="">(node->getFx());</tmacrofx>
|
|
manongjohn |
f37f4a |
std::vector<tfxp> fxs = macroFx->getFxs();</tfxp>
|
|
manongjohn |
f37f4a |
int k;
|
|
manongjohn |
f37f4a |
for (k = 0; k < (int)fxs.size(); k++) {
|
|
manongjohn |
f37f4a |
TFx *fx = fxs[k].getPointer();
|
|
manongjohn |
f37f4a |
if (fx->getAttributes()->getDagNodePos() == TConst::nowhere) continue;
|
|
manongjohn |
f37f4a |
if (QPointF(minX, minY) ==
|
|
manongjohn |
f37f4a |
QPointF(TConst::nowhere.x, TConst::nowhere.y)) {
|
|
manongjohn |
f37f4a |
minX = fx->getAttributes()->getDagNodePos().x;
|
|
manongjohn |
f37f4a |
minY = maxY = fx->getAttributes()->getDagNodePos().y;
|
|
manongjohn |
f37f4a |
continue;
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
minX = std::min(fx->getAttributes()->getDagNodePos().x, minX);
|
|
manongjohn |
f37f4a |
minY = std::min(fx->getAttributes()->getDagNodePos().y, minY);
|
|
manongjohn |
f37f4a |
maxY = std::max(fx->getAttributes()->getDagNodePos().y, maxY);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
if (QPointF(minX, minY) == QPointF(TConst::nowhere.x, TConst::nowhere.y)) {
|
|
shun-iwasawa |
7e83f5 |
TFx *inputFx = node->getFx()->getInputPort(0)->getFx();
|
|
shun-iwasawa |
7e83f5 |
if (inputFx &&
|
|
shun-iwasawa |
7e83f5 |
inputFx->getAttributes()->getDagNodePos() != TConst::nowhere) {
|
|
shun-iwasawa |
7e83f5 |
TPointD dagPos =
|
|
shun-iwasawa |
7e83f5 |
inputFx->getAttributes()->getDagNodePos() + TPointD(150, 0);
|
|
shun-iwasawa |
7e83f5 |
pos = QPointF(dagPos.x, dagPos.y);
|
|
shun-iwasawa |
7e83f5 |
} else
|
|
shun-iwasawa |
7e83f5 |
pos = sceneRect().center();
|
|
manongjohn |
f37f4a |
nodeRect.moveTopLeft(pos);
|
|
manongjohn |
f37f4a |
while (!isAnEmptyZone(nodeRect)) nodeRect.translate(0, -step);
|
|
manongjohn |
f37f4a |
pos = nodeRect.topLeft();
|
|
manongjohn |
f37f4a |
} else {
|
|
manongjohn |
f37f4a |
pos.setX(minX);
|
|
manongjohn |
f37f4a |
pos.setY((maxY + minY) / 2);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
node->getFx()->getAttributes()->setDagNodePos(TPointD(pos.x(), pos.y()));
|
|
manongjohn |
f37f4a |
node->setPos(QPointF(pos));
|
|
manongjohn |
f37f4a |
if (m_nodesToPlace.contains(node->getFx())) {
|
|
manongjohn |
f37f4a |
QList<fxschematicnode *=""> nodes = m_nodesToPlace[node->getFx()];</fxschematicnode>
|
|
manongjohn |
f37f4a |
int i;
|
|
manongjohn |
f37f4a |
for (i = 0; i < nodes.size(); i++) placeNode(nodes[i]);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
return;
|
|
manongjohn |
f37f4a |
} else if (node->isA(eNormalFx) || node->isA(eNormalLayerBlendingFx) ||
|
|
manongjohn |
f37f4a |
node->isA(eNormalMatteFx) || node->isA(eNormalImageAdjustFx)) {
|
|
Shinya Kitaoka |
120a6e |
// I'm placing an effect or a macro
|
|
Shinya Kitaoka |
120a6e |
TFx *inputFx = node->getFx()->getInputPort(0)->getFx();
|
|
Shinya Kitaoka |
120a6e |
QPointF pos;
|
|
Shinya Kitaoka |
120a6e |
if (inputFx) {
|
|
Shinya Kitaoka |
120a6e |
if (inputFx->getAttributes()->getDagNodePos() != TConst::nowhere) {
|
|
Shinya Kitaoka |
120a6e |
TPointD dagPos =
|
|
Shinya Kitaoka |
120a6e |
inputFx->getAttributes()->getDagNodePos() + TPointD(150, 0);
|
|
Shinya Kitaoka |
120a6e |
pos = QPointF(dagPos.x, dagPos.y);
|
|
Shinya Kitaoka |
120a6e |
nodeRect.moveTopLeft(pos);
|
|
shun-iwasawa |
9d4ead |
|
|
shun-iwasawa |
9d4ead |
while (!isAnEmptyZone_withParentFx(nodeRect, inputFx))
|
|
shun-iwasawa |
9d4ead |
nodeRect.translate(0, -step);
|
|
Shinya Kitaoka |
120a6e |
pos = nodeRect.topLeft();
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
m_nodesToPlace[inputFx].append(node);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
pos = sceneRect().center();
|
|
Shinya Kitaoka |
120a6e |
nodeRect.moveTopLeft(pos);
|
|
Shinya Kitaoka |
120a6e |
while (!isAnEmptyZone(nodeRect)) nodeRect.translate(0, -step);
|
|
Shinya Kitaoka |
120a6e |
pos = nodeRect.topLeft();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
node->getFx()->getAttributes()->setDagNodePos(TPointD(pos.x(), pos.y()));
|
|
Shinya Kitaoka |
120a6e |
node->setPos(QPointF(pos));
|
|
Shinya Kitaoka |
120a6e |
if (m_nodesToPlace.contains(node->getFx())) {
|
|
Shinya Kitaoka |
120a6e |
QList<fxschematicnode *=""> nodes = m_nodesToPlace[node->getFx()];</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < nodes.size(); i++) placeNode(nodes[i]);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
} else if (node->isA(eZeraryFx) || node->isA(eColumnFx) ||
|
|
Shinya Kitaoka |
120a6e |
node->isA(eGroupedFx)) {
|
|
Shinya Kitaoka |
120a6e |
// I'm placing a column
|
|
Shinya Kitaoka |
120a6e |
nodeRect.translate(m_firstPoint);
|
|
Shinya Kitaoka |
120a6e |
nodeRect.translate(10, 10);
|
|
Shinya Kitaoka |
120a6e |
while (!isAnEmptyZone(nodeRect)) nodeRect.translate(0, -step);
|
|
Shinya Kitaoka |
120a6e |
QPointF newPos = nodeRect.topLeft();
|
|
Shinya Kitaoka |
120a6e |
node->getFx()->getAttributes()->setDagNodePos(
|
|
Shinya Kitaoka |
120a6e |
TPointD(newPos.x(), newPos.y()));
|
|
Shinya Kitaoka |
120a6e |
node->setPos(QPointF(newPos));
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updateLink() {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xshHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Iterate the fxs table
|
|
Shinya Kitaoka |
120a6e |
QMap<tfx *="" *,="" fxschematicnode="">::iterator it;</tfx>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_table.begin(); it != m_table.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = it.value();
|
|
Shinya Kitaoka |
120a6e |
if (!node) continue; // Should be asserted? Is it legal?
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = it.key();
|
|
Shinya Kitaoka |
120a6e |
TFx *inputPortsFx = fx;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (TZeraryColumnFx *fx2 = dynamic_cast<tzerarycolumnfx *="">(fx)) {</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
inputPortsFx = fx2->getZeraryFx();
|
|
Shinya Kitaoka |
120a6e |
if (!inputPortsFx)
|
|
Shinya Kitaoka |
120a6e |
return; // Should really never happen. Should be asserted...
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i != inputPortsFx->getInputPortCount(); ++i) {
|
|
Shinya Kitaoka |
120a6e |
TFxPort *port = inputPortsFx->getInputPort(i);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (TFx *linkedFx = port->getFx()) {
|
|
Shinya Kitaoka |
120a6e |
if (!linkedFx->getAttributes()->isGrouped() ||
|
|
Shinya Kitaoka |
120a6e |
linkedFx->getAttributes()->isGroupEditing()) {
|
|
Shinya Kitaoka |
120a6e |
// Not in a group / open group case
|
|
Shinya Kitaoka |
120a6e |
assert(m_table.contains(linkedFx));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_table.contains(linkedFx)) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *linkedNode = m_table[linkedFx];
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p0 = linkedNode->getOutputPort();
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 = node->getInputPort(i);
|
|
Shinya Kitaoka |
120a6e |
if (p0 && p1) p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
assert(
|
|
Shinya Kitaoka |
120a6e |
m_groupedTable.contains(linkedFx->getAttributes()->getGroupId()));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_groupedTable.contains(
|
|
Shinya Kitaoka |
120a6e |
linkedFx->getAttributes()->getGroupId())) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *linkedNode =
|
|
Shinya Kitaoka |
120a6e |
m_groupedTable[linkedFx->getAttributes()->getGroupId()];
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p0 = linkedNode->getOutputPort();
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 = node->getInputPort(i);
|
|
Shinya Kitaoka |
120a6e |
if (p0 && p1) p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (xsh->getFxDag()->getTerminalFxs()->containsFx(fx)) {
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p0 = node->getOutputPort();
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 =
|
|
Shinya Kitaoka |
120a6e |
m_table[xsh->getFxDag()->getXsheetFx()]->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" fxgroupnode="">::iterator it2;</int,>
|
|
Shinya Kitaoka |
120a6e |
for (it2 = m_groupedTable.begin(); it2 != m_groupedTable.end(); it2++) {
|
|
Shinya Kitaoka |
120a6e |
FxGroupNode *node = it2.value();
|
|
Shinya Kitaoka |
120a6e |
if (!node) continue;
|
|
Shinya Kitaoka |
120a6e |
int i, fxCount = node->getFxCount();
|
|
Shinya Kitaoka |
120a6e |
bool xsheetConnected = false;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < fxCount; i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = node->getFx(i);
|
|
Shinya Kitaoka |
120a6e |
if (xsh->getFxDag()->getTerminalFxs()->containsFx(fx) &&
|
|
Shinya Kitaoka |
120a6e |
!xsheetConnected) {
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p0 = node->getOutputPort();
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 =
|
|
Shinya Kitaoka |
120a6e |
m_table[xsh->getFxDag()->getXsheetFx()]->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
xsheetConnected = true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx);</tzerarycolumnfx>
|
|
shun-iwasawa |
b322e1 |
if (zfx) fx = zfx->getZeraryFx();
|
|
Shinya Kitaoka |
120a6e |
if (fx) {
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < fx->getInputPortCount(); j++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *linkedFx = fx->getInputPort(j)->getFx();
|
|
Shinya Kitaoka |
120a6e |
if (!linkedFx) continue;
|
|
Shinya Kitaoka |
120a6e |
if (!linkedFx->getAttributes()->isGrouped() ||
|
|
Shinya Kitaoka |
120a6e |
linkedFx->getAttributes()->isGroupEditing()) {
|
|
Shinya Kitaoka |
120a6e |
assert(m_table.contains(linkedFx));
|
|
Shinya Kitaoka |
120a6e |
if (m_table.contains(linkedFx)) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *linkedNode = m_table[linkedFx];
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p0 = linkedNode->getOutputPort();
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 = node->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
if (p0 && p1) p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
int linkedGroupId = linkedFx->getAttributes()->getGroupId();
|
|
Shinya Kitaoka |
120a6e |
assert(m_groupedTable.contains(linkedGroupId));
|
|
Shinya Kitaoka |
120a6e |
if (m_groupedTable.contains(linkedGroupId)) {
|
|
Shinya Kitaoka |
120a6e |
FxGroupNode *linkedNode = m_groupedTable[linkedGroupId];
|
|
Shinya Kitaoka |
120a6e |
if (linkedNode == node) continue;
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p0 = linkedNode->getOutputPort();
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 = node->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
if (p0 && p1 && !p0->isLinkedTo(p1)) p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// to solve an edit macro problem: create a dummy link
|
|
Shinya Kitaoka |
120a6e |
QMap<tmacrofx *="" *,="" fxschematicmacroeditor="">::iterator it3;</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
for (it3 = m_macroEditorTable.begin(); it3 != m_macroEditorTable.end();
|
|
Shinya Kitaoka |
120a6e |
it3++) {
|
|
Shinya Kitaoka |
120a6e |
TMacroFx *macro = it3.key();
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *root = m_table[macro->getRoot()];
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p0 = root->getOutputPort();
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < macro->getOutputConnectionCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFxPort *outConnection = macro->getOutputConnection(i);
|
|
Shinya Kitaoka |
120a6e |
TFx *outFx = outConnection->getOwnerFx();
|
|
Shinya Kitaoka |
120a6e |
TMacroFx *outMacroFx = dynamic_cast<tmacrofx *="">(outFx);</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
if (outMacroFx && outMacroFx->isEditing()) {
|
|
Shinya Kitaoka |
120a6e |
std::vector<tfxp> fxs = outMacroFx->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
int k;
|
|
Shinya Kitaoka |
120a6e |
for (k = 0; k < (int)fxs.size(); k++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = fxs[k].getPointer();
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < fx->getInputPortCount(); j++)
|
|
Shinya Kitaoka |
120a6e |
if (outConnection == fx->getInputPort(j)) {
|
|
Shinya Kitaoka |
120a6e |
outFx = fx;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (outFx != outMacroFx) break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < outFx->getInputPortCount(); j++)
|
|
Shinya Kitaoka |
120a6e |
if (outFx->getInputPort(j)->getFx() == macro) {
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 = m_table[outFx]->getInputPort(j);
|
|
Shinya Kitaoka |
120a6e |
p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (xsh->getFxDag()->getTerminalFxs()->containsFx(macro)) {
|
|
Shinya Kitaoka |
120a6e |
assert(root);
|
|
Shinya Kitaoka |
120a6e |
if (!root) continue;
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *p1 =
|
|
Shinya Kitaoka |
120a6e |
m_table[xsh->getFxDag()->getXsheetFx()]->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
p0->makeLink(p1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
updateDuplcatedNodesLink();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *cme) {
|
|
Shinya Kitaoka |
120a6e |
QPointF scenePos = cme->scenePos();
|
|
Shinya Kitaoka |
120a6e |
QList<qgraphicsitem *=""> itemList = items(scenePos);</qgraphicsitem>
|
|
Shinya Kitaoka |
120a6e |
if (!itemList.isEmpty()) {
|
|
Shinya Kitaoka |
120a6e |
SchematicScene::contextMenuEvent(cme);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QMenu menu(views()[0]);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (cme->modifiers() & Qt::ControlModifier) {
|
|
Shinya Kitaoka |
120a6e |
menu.addAction(m_addFxContextMenu.getAgainCommand(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 *addOutputFx =
|
|
Shinya Kitaoka |
120a6e |
CommandManager::instance()->getAction("MI_NewOutputFx");
|
|
shun_iwasawa |
4a5f42 |
QAction *copy = CommandManager::instance()->getAction("MI_Copy");
|
|
shun_iwasawa |
4a5f42 |
QAction *cut = CommandManager::instance()->getAction("MI_Cut");
|
|
shun_iwasawa |
4a5f42 |
QAction *paste = CommandManager::instance()->getAction("MI_Paste");
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_addFxContextMenu.setCurrentCursorScenePos(cme->scenePos());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
menu.addMenu(m_addFxContextMenu.getAddMenu());
|
|
Shinya Kitaoka |
120a6e |
if (addOutputFx) menu.addAction(addOutputFx);
|
|
manongjohn |
d6e3cc |
|
|
manongjohn |
d6e3cc |
// Close sub xsheet and move to parent sheet
|
|
manongjohn |
d6e3cc |
ToonzScene *scene = getXsheet()->getScene();
|
|
manongjohn |
d6e3cc |
ChildStack *childStack = scene->getChildStack();
|
|
manongjohn |
d6e3cc |
if (childStack && childStack->getAncestorCount() > 0) {
|
|
manongjohn |
d6e3cc |
menu.addSeparator();
|
|
manongjohn |
d6e3cc |
menu.addAction(CommandManager::instance()->getAction("MI_CloseChild"));
|
|
manongjohn |
d6e3cc |
}
|
|
manongjohn |
d6e3cc |
|
|
Shinya Kitaoka |
120a6e |
menu.addSeparator();
|
|
Shinya Kitaoka |
120a6e |
menu.addAction(copy);
|
|
Shinya Kitaoka |
120a6e |
menu.addAction(cut);
|
|
Shinya Kitaoka |
120a6e |
menu.addAction(paste);
|
|
Shinya Kitaoka |
120a6e |
m_selection->setPastePosition(TPointD(scenePos.x(), scenePos.y()));
|
|
Shinya Kitaoka |
120a6e |
menu.exec(cme->screenPos());
|
|
Shinya Kitaoka |
120a6e |
m_selection->setPastePosition(TConst::nowhere);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QPointF FxSchematicScene::nearestPoint(const QPointF &point) {
|
|
Shinya Kitaoka |
120a6e |
QRectF rect(0, 0, 0.1, 0.1);
|
|
Shinya Kitaoka |
120a6e |
rect.moveCenter(point);
|
|
Shinya Kitaoka |
120a6e |
QList<qgraphicsitem *=""> itemList = items(rect);</qgraphicsitem>
|
|
Shinya Kitaoka |
120a6e |
while (itemList.isEmpty()) {
|
|
Shinya Kitaoka |
120a6e |
rect.adjust(-0.1, -0.1, 0.1, 0.1);
|
|
Shinya Kitaoka |
120a6e |
itemList = items(rect);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
FIXME: QTransform() のデフォルトは Qt4.8 の itemAt() と比べて equivant
|
|
Shinya Kitaoka |
120a6e |
だろうか?
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
QGraphicsItem *item = itemAt(rect.bottomLeft(), QTransform());
|
|
Shinya Kitaoka |
120a6e |
if (item) return rect.bottomLeft();
|
|
Shinya Kitaoka |
120a6e |
item = itemAt(rect.bottomRight(), QTransform());
|
|
Shinya Kitaoka |
120a6e |
if (item) return rect.bottomRight();
|
|
Shinya Kitaoka |
120a6e |
item = itemAt(rect.topLeft(), QTransform());
|
|
Shinya Kitaoka |
120a6e |
if (item) return rect.topLeft();
|
|
Shinya Kitaoka |
120a6e |
item = itemAt(rect.topRight(), QTransform());
|
|
Shinya Kitaoka |
120a6e |
if (item) return rect.topRight();
|
|
Shinya Kitaoka |
120a6e |
return QPointF();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *FxSchematicScene::getFxNodeFromPosition(const QPointF &pos) {
|
|
Shinya Kitaoka |
120a6e |
QList<qgraphicsitem *=""> pickedItems = items(pos);</qgraphicsitem>
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < pickedItems.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *fxNode =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematicnode *="">(pickedItems.at(i));</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
if (fxNode) return fxNode;
|
|
Shinya Kitaoka |
120a6e |
FxSchematicPort *fxPort =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematicport *="">(pickedItems.at(i));</fxschematicport>
|
|
Shinya Kitaoka |
120a6e |
if (fxPort) return fxPort->getDock()->getNode();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updateDuplcatedNodesLink() {
|
|
Shinya Kitaoka |
120a6e |
QMap<tfx *="" *,="" fxschematicnode="">::iterator it;</tfx>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// fx2node contains only duplicated nodes
|
|
Shinya Kitaoka |
120a6e |
// and zerary duplicated node s
|
|
Shinya Kitaoka |
120a6e |
QMap<tfx *="" *,="" fxschematicnode=""> fx2node;</tfx>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_table.begin(); it != m_table.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = it.key();
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = it.value();
|
|
Shinya Kitaoka |
120a6e |
if (TZeraryColumnFx *zcfx = dynamic_cast<tzerarycolumnfx *="">(fx)) {</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
fx = zcfx->getZeraryFx();
|
|
Shinya Kitaoka |
120a6e |
if (!fx) return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
assert(fx2node.count(fx) == 0);
|
|
Shinya Kitaoka |
120a6e |
if (fx->getLinkedFx() == fx) continue;
|
|
Shinya Kitaoka |
120a6e |
fx2node[fx] = node;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// trovo i link
|
|
Shinya Kitaoka |
120a6e |
std::set<tfx *=""> visited;</tfx>
|
|
Shinya Kitaoka |
120a6e |
for (it = fx2node.begin(); it != fx2node.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = it.key();
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = it.value();
|
|
Shinya Kitaoka |
120a6e |
assert(fx->getLinkedFx() != fx);
|
|
Shinya Kitaoka |
120a6e |
if (visited.count(fx) > 0) continue;
|
|
Shinya Kitaoka |
120a6e |
visited.insert(fx);
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *lastNode = node;
|
|
Shinya Kitaoka |
120a6e |
assert(lastNode);
|
|
Shinya Kitaoka |
120a6e |
FxSchematicPort *lastPort = lastNode->getLinkPort();
|
|
Shinya Kitaoka |
120a6e |
assert(lastPort);
|
|
Shinya Kitaoka |
120a6e |
for (fx = fx->getLinkedFx(); fx != it.key(); fx = fx->getLinkedFx()) {
|
|
Shinya Kitaoka |
120a6e |
assert(visited.count(fx) == 0);
|
|
Shinya Kitaoka |
120a6e |
if (visited.count(fx) > 0) break;
|
|
Shinya Kitaoka |
120a6e |
visited.insert(fx);
|
|
Shinya Kitaoka |
120a6e |
QMap<tfx *="" *,="" fxschematicnode="">::iterator h;</tfx>
|
|
Shinya Kitaoka |
120a6e |
h = fx2node.find(fx);
|
|
Shinya Kitaoka |
120a6e |
if (h == fx2node.end()) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
assert(h != fx2node.end());
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = h.value();
|
|
Shinya Kitaoka |
120a6e |
assert(node);
|
|
Shinya Kitaoka |
120a6e |
FxSchematicPort *port = node->getLinkPort();
|
|
Shinya Kitaoka |
120a6e |
assert(port);
|
|
Shinya Kitaoka |
120a6e |
if (port && lastPort) port->makeLink(lastPort);
|
|
Shinya Kitaoka |
120a6e |
lastNode = node;
|
|
Shinya Kitaoka |
120a6e |
lastPort = port;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QGraphicsItem *FxSchematicScene::getCurrentNode() {
|
|
Shinya Kitaoka |
120a6e |
QList<qgraphicsitem *=""> allItems = items();</qgraphicsitem>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (auto const item : allItems) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = dynamic_cast<fxschematicnode *="">(item);</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
if (node && node->getFx() == m_fxHandle->getFx()) return node;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onSelectionSwitched(TSelection *oldSel,
|
|
Shinya Kitaoka |
120a6e |
TSelection *newSel) {
|
|
Shinya Kitaoka |
120a6e |
if (m_selection == oldSel && m_selection != newSel) clearSelection();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onSelectionChanged() {
|
|
Shinya Kitaoka |
120a6e |
m_selection->selectNone();
|
|
Shinya Kitaoka |
120a6e |
int i, size = m_highlightedLinks.size();
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < size; i++) {
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link = m_highlightedLinks[i];
|
|
Shinya Kitaoka |
120a6e |
link->setHighlighted(false);
|
|
Shinya Kitaoka |
120a6e |
link->update();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_highlightedLinks.clear();
|
|
Shinya Kitaoka |
120a6e |
QList<qgraphicsitem *=""> slcItems = selectedItems();</qgraphicsitem>
|
|
Shinya Kitaoka |
120a6e |
QList<qgraphicsitem *="">::iterator it;</qgraphicsitem>
|
|
Shinya Kitaoka |
120a6e |
for (it = slcItems.begin(); it != slcItems.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *node = dynamic_cast<fxschematicnode *="">(*it);</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
if (node) {
|
|
Shinya Kitaoka |
120a6e |
if (!node->isA(eGroupedFx)) {
|
|
Shinya Kitaoka |
120a6e |
if (node->isA(eXSheetFx)) continue;
|
|
Shinya Kitaoka |
120a6e |
m_selection->select(node->getFx());
|
|
Shinya Kitaoka |
120a6e |
if (node->isA(eColumnFx)) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicColumnNode *columnNode =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematiccolumnnode *="">(node);</fxschematiccolumnnode>
|
|
Shinya Kitaoka |
120a6e |
if (columnNode)
|
|
Shinya Kitaoka |
120a6e |
m_selection->select(columnNode->getColumnIndex());
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicPaletteNode *paletteNode =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematicpalettenode *="">(node);</fxschematicpalettenode>
|
|
Shinya Kitaoka |
120a6e |
if (paletteNode) m_selection->select(paletteNode->getColumnIndex());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
FxGroupNode *groupNode = dynamic_cast<fxgroupnode *="">(node);</fxgroupnode>
|
|
Shinya Kitaoka |
120a6e |
assert(groupNode);
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> fxs = groupNode->getGroupedFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < fxs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
m_selection->select(fxs[i].getPointer());
|
|
Shinya Kitaoka |
120a6e |
TLevelColumnFx *colFx =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<tlevelcolumnfx *="">(fxs[i].getPointer());</tlevelcolumnfx>
|
|
Shinya Kitaoka |
120a6e |
if (colFx) {
|
|
Shinya Kitaoka |
120a6e |
if (TXshLevelColumn *column = colFx->getColumn()) {
|
|
Shinya Kitaoka |
120a6e |
int colIndex = column->getIndex();
|
|
Shinya Kitaoka |
120a6e |
m_selection->select(colIndex);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
highlightLinks(node, true);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link = dynamic_cast<schematiclink *="">(*it);</schematiclink>
|
|
Shinya Kitaoka |
120a6e |
if (link) m_selection->select(link);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_selection->makeCurrent();
|
|
Shinya Kitaoka |
120a6e |
TSelectionHandle *selHandle = TSelectionHandle::getCurrent();
|
|
Shinya Kitaoka |
120a6e |
selHandle->notifySelectionChanged();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::reorderScene() {
|
|
Shinya Kitaoka |
120a6e |
int step = m_gridDimension == eLarge ? 100 : 50;
|
|
Shinya Kitaoka |
120a6e |
m_placedFxs.clear();
|
|
Shinya Kitaoka |
120a6e |
QPointF sceneCenter = sceneRect().center();
|
|
Shinya Kitaoka |
120a6e |
double minY = sceneCenter.y();
|
|
Shinya Kitaoka |
120a6e |
double maxX = sceneCenter.x();
|
|
Shinya Kitaoka |
120a6e |
double y = minY;
|
|
Shinya Kitaoka |
120a6e |
double x = maxX;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xshHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
int i = 0;
|
|
manongjohn |
f37f4a |
|
|
manongjohn |
f37f4a |
FxDag *fxDag = xsh->getFxDag();
|
|
manongjohn |
f37f4a |
TFxSet *fxSet = fxDag->getInternalFxs();
|
|
manongjohn |
f37f4a |
|
|
manongjohn |
f37f4a |
// Let's reset every position to nowhere first
|
|
manongjohn |
f37f4a |
fxDag->getXsheetFx()->getAttributes()->setDagNodePos(TConst::nowhere);
|
|
manongjohn |
f37f4a |
|
|
manongjohn |
f37f4a |
for (i = 0; i < fxDag->getOutputFxCount(); i++) {
|
|
manongjohn |
f37f4a |
TOutputFx *fx = fxDag->getOutputFx(i);
|
|
manongjohn |
f37f4a |
if (!fx) continue;
|
|
manongjohn |
f37f4a |
fx->getAttributes()->setDagNodePos(TConst::nowhere);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
|
|
manongjohn |
f37f4a |
for (i = 0; i < xsh->getColumnCount(); i++) {
|
|
manongjohn |
f37f4a |
TXshColumn *column = xsh->getColumn(i);
|
|
manongjohn |
f37f4a |
TFx *fx = column->getFx();
|
|
manongjohn |
f37f4a |
if (!fx) continue;
|
|
manongjohn |
f37f4a |
fx->getAttributes()->setDagNodePos(TConst::nowhere);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
|
|
manongjohn |
f37f4a |
for (i = 0; i < fxSet->getFxCount(); i++) {
|
|
manongjohn |
f37f4a |
TFx *fx = fxSet->getFx(i);
|
|
manongjohn |
f37f4a |
fx->getAttributes()->setDagNodePos(TConst::nowhere);
|
|
manongjohn |
f37f4a |
TMacroFx *macro = dynamic_cast<tmacrofx *="">(fx);</tmacrofx>
|
|
manongjohn |
f37f4a |
if (macro && macro->isEditing()) {
|
|
manongjohn |
f37f4a |
std::vector<tfxp> fxs = macro->getFxs();</tfxp>
|
|
manongjohn |
f37f4a |
int j;
|
|
manongjohn |
f37f4a |
for (j = 0; j < (int)fxs.size(); j++) {
|
|
manongjohn |
f37f4a |
fxs[j]->getAttributes()->setDagNodePos(TConst::nowhere);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
|
|
manongjohn |
f37f4a |
// Let's start placing them now
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < xsh->getColumnCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TXshColumn *column = xsh->getColumn(i);
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = column->getFx();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (column->isEmpty() || !fx) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx);</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
if (zfx && (zfx->getZeraryFx()->getInputPortCount() > 0)) {
|
|
Shinya Kitaoka |
120a6e |
TFxPort *port = zfx->getZeraryFx()->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
if (port && port->getFx()) continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (zfx && m_placedFxs.contains(zfx->getZeraryFx())) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
x = sceneCenter.x();
|
|
Shinya Kitaoka |
120a6e |
placeNodeAndParents(fx, x, maxX, minY);
|
|
Shinya Kitaoka |
120a6e |
y -= step;
|
|
Shinya Kitaoka |
120a6e |
minY = std::min(y, minY);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// remove retrolink
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < xsh->getColumnCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TXshColumn *column = xsh->getColumn(i);
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = column->getFx();
|
|
Shinya Kitaoka |
120a6e |
if (column->isEmpty() || !fx) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx);</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
if (zfx && m_placedFxs.contains(zfx->getZeraryFx())) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (zfx && (zfx->getZeraryFx()->getInputPortCount() > 0)) {
|
|
Shinya Kitaoka |
120a6e |
TFxPort *port = zfx->getZeraryFx()->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
if (port && port->getFx()) continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (int j = 0; j < fx->getOutputConnectionCount(); j++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *outFx = fx->getOutputConnection(j)->getOwnerFx();
|
|
Shinya Kitaoka |
120a6e |
removeRetroLinks(outFx, maxX);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double middleY = (sceneCenter.y() + minY + step) * 0.5;
|
|
Shinya Kitaoka |
120a6e |
placeNodeAndParents(xsh->getFxDag()->getXsheetFx(), maxX, maxX, middleY);
|
|
manongjohn |
f37f4a |
y -= step;
|
|
manongjohn |
f37f4a |
minY = std::min(y, minY);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < fxSet->getFxCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = fxSet->getFx(i);
|
|
Shinya Kitaoka |
120a6e |
if (m_placedFxs.contains(fx)) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
manongjohn |
f37f4a |
placeNodeAndParents(fx, (sceneCenter.x() + 120), maxX, minY);
|
|
manongjohn |
f37f4a |
y -= step;
|
|
manongjohn |
f37f4a |
minY = std::min(y, minY);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
updateScene();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::removeRetroLinks(TFx *fx, double &maxX) {
|
|
Shinya Kitaoka |
120a6e |
if (!fx) return;
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < fx->getInputPortCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *inFx = fx->getInputPort(i)->getFx();
|
|
Shinya Kitaoka |
120a6e |
if (!inFx) continue;
|
|
Shinya Kitaoka |
120a6e |
TPointD inFxPos = inFx->getAttributes()->getDagNodePos();
|
|
Shinya Kitaoka |
120a6e |
TPointD fxPos = fx->getAttributes()->getDagNodePos();
|
|
manongjohn |
f37f4a |
if (inFxPos != TConst::nowhere && fxPos != TConst::nowhere &&
|
|
manongjohn |
f37f4a |
fxPos.x <= inFxPos.x) {
|
|
Shinya Kitaoka |
120a6e |
while (fxPos.x <= inFxPos.x) fxPos.x += 150;
|
|
Shinya Kitaoka |
120a6e |
maxX = std::max(fxPos.x + 150, maxX);
|
|
Shinya Kitaoka |
120a6e |
fx->getAttributes()->setDagNodePos(fxPos);
|
|
Shinya Kitaoka |
120a6e |
for (int j = 0; j < fx->getOutputConnectionCount(); j++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *outFx = fx->getOutputConnection(j)->getOwnerFx();
|
|
Shinya Kitaoka |
120a6e |
removeRetroLinks(outFx, maxX);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::placeNodeAndParents(TFx *fx, double x, double &maxX,
|
|
Shinya Kitaoka |
120a6e |
double &minY) {
|
|
Shinya Kitaoka |
120a6e |
int step = m_gridDimension == eLarge ? 100 : 50;
|
|
Shinya Kitaoka |
120a6e |
if (!fx) return;
|
|
Shinya Kitaoka |
120a6e |
m_placedFxs.append(fx);
|
|
Shinya Kitaoka |
120a6e |
if (fx->getFxType() == "STD_particlesFx" ||
|
|
Shinya Kitaoka |
120a6e |
fx->getFxType() == "STD_Iwa_ParticlesFx") {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xshHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
int i = 0;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < xsh->getColumnCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *columnFx = xsh->getColumn(i)->getFx();
|
|
Shinya Kitaoka |
120a6e |
TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(columnFx);</tzerarycolumnfx>
|
|
Shinya Kitaoka |
120a6e |
if (zfx && zfx->getZeraryFx() == fx) {
|
|
Shinya Kitaoka |
120a6e |
fx = zfx;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
manongjohn |
f37f4a |
double y = minY;
|
|
manongjohn |
f37f4a |
TMacroFx *macro = dynamic_cast<tmacrofx *="">(fx);</tmacrofx>
|
|
manongjohn |
f37f4a |
if (macro) {
|
|
manongjohn |
f37f4a |
int tmpY = y;
|
|
manongjohn |
f37f4a |
std::vector<tfxp> fxs = macro->getFxs();</tfxp>
|
|
manongjohn |
f37f4a |
for (int j = 0; j < (int)fxs.size(); j++) {
|
|
manongjohn |
f37f4a |
TFx *macroFx = fxs[j].getPointer();
|
|
manongjohn |
f37f4a |
if (macroFx && !m_placedFxs.contains(macroFx)) {
|
|
manongjohn |
f37f4a |
placeNodeAndParents(macroFx, x, maxX, minY);
|
|
manongjohn |
f37f4a |
y -= step;
|
|
manongjohn |
f37f4a |
minY = std::min(y, minY);
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
}
|
|
manongjohn |
f37f4a |
tmpY = (minY + tmpY + step) * 0.5;
|
|
manongjohn |
f37f4a |
fx->getAttributes()->setDagNodePos(TPointD(x, tmpY));
|
|
manongjohn |
f37f4a |
} else
|
|
manongjohn |
f37f4a |
fx->getAttributes()->setDagNodePos(TPointD(x, y));
|
|
Shinya Kitaoka |
120a6e |
if (fx->getOutputConnectionCount() == 0) minY -= step;
|
|
Shinya Kitaoka |
120a6e |
x += 120;
|
|
Shinya Kitaoka |
120a6e |
maxX = std::max(maxX, x);
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < fx->getOutputConnectionCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *outputFx = fx->getOutputConnection(i)->getOwnerFx();
|
|
Shinya Kitaoka |
120a6e |
// controllo se e' una porta sorgente
|
|
Shinya Kitaoka |
120a6e |
TFxPort *port = outputFx->getInputPort(0);
|
|
Shinya Kitaoka |
120a6e |
if (port && port->getFx() != fx) continue;
|
|
Shinya Kitaoka |
120a6e |
if (!m_placedFxs.contains(outputFx) ||
|
|
Shinya Kitaoka |
120a6e |
outputFx->getAttributes()->getDagNodePos().x < x) {
|
|
Shinya Kitaoka |
120a6e |
placeNodeAndParents(outputFx, x, maxX, minY);
|
|
Shinya Kitaoka |
120a6e |
y -= step;
|
|
Shinya Kitaoka |
120a6e |
minY = std::min(y, minY);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onDisconnectFromXSheet() {
|
|
shun-iwasawa |
443318 |
std::list<tfxp, std::allocator<tfxp="">> list(m_selection->getFxs().begin(),</tfxp,>
|
|
shun-iwasawa |
443318 |
m_selection->getFxs().end());
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::disconnectNodesFromXsheet(list, m_xshHandle);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onConnectToXSheet() {
|
|
shun-iwasawa |
443318 |
std::list<tfxp, std::allocator<tfxp="">> list(m_selection->getFxs().begin(),</tfxp,>
|
|
shun-iwasawa |
443318 |
m_selection->getFxs().end());
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::connectNodesToXsheet(list, m_xshHandle);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onDeleteFx() {
|
|
shun-iwasawa |
443318 |
std::list<tfxp, std::allocator<tfxp="">> fxList(m_selection->getFxs().begin(),</tfxp,>
|
|
shun-iwasawa |
443318 |
m_selection->getFxs().end());
|
|
shun-iwasawa |
443318 |
std::list<tfxcommand::link> linkList(m_selection->getLinks().begin(),</tfxcommand::link>
|
|
shun-iwasawa |
443318 |
m_selection->getLinks().end());
|
|
shun-iwasawa |
443318 |
std::list<int> columnIndexList(m_selection->getColumnIndexes().begin(),</int>
|
|
shun-iwasawa |
443318 |
m_selection->getColumnIndexes().end());
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::deleteSelection(fxList, linkList, columnIndexList, m_xshHandle,
|
|
Shinya Kitaoka |
120a6e |
m_fxHandle);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onDuplicateFx() {
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> fxs = m_selection->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
if (fxs.empty()) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->beginBlock();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int i, size = fxs.size();
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i != size; ++i)
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::duplicateFx(fxs[i].getPointer(), m_xshHandle, m_fxHandle);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->endBlock();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onUnlinkFx() {
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> fxs = m_selection->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
if (fxs.empty()) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->beginBlock();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int i, size = fxs.size();
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i != size; ++i)
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::unlinkFx(fxs[i].getPointer(), m_fxHandle, m_xshHandle);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->endBlock();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onMacroFx() {
|
|
shun-iwasawa |
443318 |
TFxCommand::makeMacroFx(std::vector<tfxp>(m_selection->getFxs().begin(),</tfxp>
|
|
shun-iwasawa |
443318 |
m_selection->getFxs().end()),
|
|
Shinya Kitaoka |
120a6e |
m_app);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onExplodeMacroFx() {
|
|
Shinya Kitaoka |
120a6e |
if (TMacroFx *macroFx = dynamic_cast<tmacrofx *="">(m_fxHandle->getFx()))</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::explodeMacroFx(macroFx, m_app);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onOpenMacroFx() {
|
|
Shinya Kitaoka |
120a6e |
if (TMacroFx *macroFx = dynamic_cast<tmacrofx *="">(m_fxHandle->getFx())) {</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
macroFx->editMacro(true);
|
|
Shinya Kitaoka |
120a6e |
updateScene();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onSavePresetFx() {
|
|
Shinya Kitaoka |
120a6e |
CommandManager::instance()->getAction("MI_SavePreset")->trigger();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onActivateOutput() {
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::makeOutputFxCurrent(m_fxHandle->getFx(), m_xshHandle);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onPreview() { emit showPreview(m_fxHandle->getFx()); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onCacheFx() { setEnableCache(true); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onUncacheFx() { setEnableCache(false); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::setEnableCache(bool toggle) {
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> selectedFxs = m_selection->getFxs();</tfxp>
|
|
Rozhuk Ivan |
823a31 |
for (int i = 0; i < selectedFxs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = selectedFxs[i].getPointer();
|
|
Shinya Kitaoka |
120a6e |
TZeraryColumnFx *zcfx = dynamic_cast<tzerarycolumnfx *="">(fx);</tzerarycolumnfx>
|
|
shun-iwasawa |
b322e1 |
if (zcfx) fx = zcfx->getZeraryFx();
|
|
shun-iwasawa |
b322e1 |
TFxAttributes *attr = fx->getAttributes();
|
|
Rozhuk Ivan |
823a31 |
if (!attr->isGrouped() || attr->isGroupEditing()) {
|
|
Rozhuk Ivan |
823a31 |
if (toggle) {
|
|
Shinya Kitaoka |
120a6e |
TPassiveCacheManager::instance()->enableCache(fx);
|
|
Rozhuk Ivan |
823a31 |
} else {
|
|
Shinya Kitaoka |
120a6e |
TPassiveCacheManager::instance()->disableCache(fx);
|
|
Rozhuk Ivan |
823a31 |
}
|
|
Rozhuk Ivan |
823a31 |
} else {
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" fxgroupnode="">::iterator it;</int,>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_groupedTable.begin(); it != m_groupedTable.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
FxGroupNode *group = it.value();
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> roots = group->getRootFxs();</tfxp>
|
|
Rozhuk Ivan |
823a31 |
for (int j = 0; j < roots.size(); j++) {
|
|
Rozhuk Ivan |
823a31 |
if (fx == roots[j].getPointer()) {
|
|
Rozhuk Ivan |
823a31 |
if (toggle) {
|
|
Shinya Kitaoka |
120a6e |
TPassiveCacheManager::instance()->enableCache(fx);
|
|
Rozhuk Ivan |
823a31 |
} else {
|
|
Shinya Kitaoka |
120a6e |
TPassiveCacheManager::instance()->disableCache(fx);
|
|
shun-iwasawa |
b322e1 |
}
|
|
shun-iwasawa |
b322e1 |
}
|
|
shun-iwasawa |
b322e1 |
}
|
|
Shinya Kitaoka |
120a6e |
group->update();
|
|
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 FxSchematicScene::onCollapse(const QList<tfxp> &fxs) {</tfxp>
|
|
Shinya Kitaoka |
120a6e |
emit doCollapse(fxs);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TXsheet *FxSchematicScene::getXsheet() { return m_xshHandle->getXsheet(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onXsheetChanged() { m_xshHandle->notifyXsheetChanged(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onSceneChanged() {
|
|
Shinya Kitaoka |
120a6e |
m_app->getCurrentScene()->notifySceneChanged();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onSwitchCurrentFx(TFx *fx) {
|
|
Shinya Kitaoka |
120a6e |
if (m_fxHandle->getFx() == fx) return;
|
|
Shinya Kitaoka |
120a6e |
if (fx) {
|
|
Shinya Kitaoka |
120a6e |
// Forbid update of the swatch upon column switch. This could generate
|
|
Shinya Kitaoka |
120a6e |
// a further useless render...
|
|
Shinya Kitaoka |
120a6e |
SwatchViewer::suspendRendering(true, false);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int columnIndex = fx->getReferenceColumnIndex();
|
|
Shinya Kitaoka |
120a6e |
if (columnIndex >= 0) {
|
|
Shinya Kitaoka |
120a6e |
m_columnHandle->setColumnIndex(columnIndex);
|
|
Shinya Kitaoka |
120a6e |
m_app->getCurrentObject()->setObjectId(
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId::ColumnId(columnIndex));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
SwatchViewer::suspendRendering(false);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_fxHandle->setFx(fx, false); // Setting the fx updates the swatch
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
emit editObject();
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
m_fxHandle->setFx(0, false);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onFxNodeDoubleClicked() {
|
|
Shinya Kitaoka |
120a6e |
// emitting fxSettingsShouldBeSwitched
|
|
Shinya Kitaoka |
120a6e |
m_fxHandle->onFxNodeDoubleClicked();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onCurrentFxSwitched() {
|
|
Shinya Kitaoka |
120a6e |
if (m_currentFxNode) m_currentFxNode->setIsCurrentFxLinked(false, 0);
|
|
Shinya Kitaoka |
120a6e |
if (m_table.contains(m_fxHandle->getFx())) {
|
|
Shinya Kitaoka |
120a6e |
m_currentFxNode = m_table[m_fxHandle->getFx()];
|
|
Shinya Kitaoka |
120a6e |
m_currentFxNode->setIsCurrentFxLinked(true, 0);
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
m_currentFxNode = 0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onCurrentColumnChanged(int index) {
|
|
Shinya Kitaoka |
120a6e |
m_app->getCurrentColumn()->setColumnIndex(index);
|
|
Shinya Kitaoka |
120a6e |
m_app->getCurrentObject()->setObjectId(TStageObjectId::ColumnId(index));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
d6e3cc |
void FxSchematicScene::onIconifyNodesToggled(bool iconified) {
|
|
manongjohn |
d6e3cc |
m_isNormalIconView = !iconified;
|
|
manongjohn |
d6e3cc |
IconifyFxSchematicNodes = (iconified) ? 1 : 0;
|
|
manongjohn |
d6e3cc |
updateScene();
|
|
manongjohn |
d6e3cc |
}
|
|
manongjohn |
d6e3cc |
|
|
manongjohn |
d6e3cc |
//------------------------------------------------------------------
|
|
manongjohn |
d6e3cc |
|
|
Shinya Kitaoka |
120a6e |
TFx *FxSchematicScene::getCurrentFx() { return m_fxHandle->getFx(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::mousePressEvent(QGraphicsSceneMouseEvent *me) {
|
|
Shinya Kitaoka |
120a6e |
QList<qgraphicsitem *=""> items = selectedItems();</qgraphicsitem>
|
|
shun-iwasawa |
443318 |
QGraphicsItem *item = itemAt(me->scenePos(), QTransform());
|
|
shun-iwasawa |
443318 |
FxSchematicPort *port = dynamic_cast<fxschematicport *="">(item);</fxschematicport>
|
|
shun-iwasawa |
443318 |
FxSchematicLink *link = dynamic_cast<fxschematiclink *="">(item);</fxschematiclink>
|
|
Shinya Kitaoka |
120a6e |
SchematicScene::mousePressEvent(me);
|
|
Shinya Kitaoka |
120a6e |
onSelectionChanged();
|
|
shun-iwasawa |
443318 |
if (me->button() == Qt::MiddleButton) {
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < items.size(); i++) items[i]->setSelected(true);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
m_selection may not be updated here, so I use QGraphicsScene::selectedItems()
|
|
Shinya Kitaoka |
120a6e |
instead of m_selection->isEmpty() to check whether any node is selected or
|
|
Shinya Kitaoka |
120a6e |
not.
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
if (selectedItems().isEmpty()) {
|
|
shun-iwasawa |
443318 |
if (me->button() != Qt::MiddleButton && !item) m_fxHandle->setFx(0, false);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_isConnected = false;
|
|
Shinya Kitaoka |
120a6e |
if (!canDisconnectSelection(m_selection)) return;
|
|
Shinya Kitaoka |
120a6e |
m_selectionOldPos.clear();
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> selectedFxs = m_selection->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < selectedFxs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFxP selectedFx = selectedFxs[i];
|
|
Shinya Kitaoka |
120a6e |
TPointD pos = selectedFx->getAttributes()->getDagNodePos();
|
|
Shinya Kitaoka |
120a6e |
m_selectionOldPos.append(QPair<tfxp, tpointd="">(selectedFx, pos));</tfxp,>
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
FxsData fxsData;
|
|
Shinya Kitaoka |
120a6e |
fxsData.setFxs(m_selection->getFxs(), m_selection->getLinks(),
|
|
Shinya Kitaoka |
120a6e |
m_selection->getColumnIndexes(), m_xshHandle->getXsheet());
|
|
shun-iwasawa |
8e8baa |
// m_isConnected indicates that the all selected nodes are connected
|
|
Shinya Kitaoka |
120a6e |
if (fxsData.isConnected() && me->button() == Qt::LeftButton && !port && !link)
|
|
Shinya Kitaoka |
120a6e |
m_isConnected = true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::mouseMoveEvent(QGraphicsSceneMouseEvent *me) {
|
|
Shinya Kitaoka |
120a6e |
SchematicScene::mouseMoveEvent(me);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_lastPos = me->scenePos();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool leftButton = (QApplication::mouseButtons() == Qt::LeftButton);
|
|
Shinya Kitaoka |
120a6e |
bool altButton = (QApplication::keyboardModifiers() == Qt::AltModifier);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (leftButton && m_isConnected && altButton) {
|
|
Shinya Kitaoka |
120a6e |
m_linkUnlinkSimulation = true;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
simulateDisconnectSelection(true);
|
|
Shinya Kitaoka |
120a6e |
m_connectionLinks.showBridgeLinks();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<schematiclink *="">(itemAt(m_lastPos, QTransform()));</schematiclink>
|
|
Shinya Kitaoka |
120a6e |
if (link && (link->getEndPort() && link->getStartPort())) {
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::Link fxLink = m_selection->getBoundingFxs(link);
|
|
Shinya Kitaoka |
120a6e |
if (fxLink == TFxCommand::Link()) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFx *inputFx = fxLink.m_inputFx.getPointer();
|
|
Shinya Kitaoka |
120a6e |
TFx *outputFx = fxLink.m_outputFx.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFxSet *internalFxs = getXsheet()->getFxDag()->getInternalFxs();
|
|
Shinya Kitaoka |
120a6e |
if (!internalFxs->containsFx(inputFx) &&
|
|
Shinya Kitaoka |
120a6e |
!dynamic_cast<tcolumnfx *="">(inputFx) &&</tcolumnfx>
|
|
Shinya Kitaoka |
120a6e |
!dynamic_cast<txsheetfx *="">(inputFx) &&</txsheetfx>
|
|
Shinya Kitaoka |
120a6e |
!dynamic_cast<toutputfx *="">(inputFx))</toutputfx>
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
if (!internalFxs->containsFx(outputFx) &&
|
|
Shinya Kitaoka |
120a6e |
!dynamic_cast<tcolumnfx *="">(outputFx) &&</tcolumnfx>
|
|
Shinya Kitaoka |
120a6e |
!dynamic_cast<txsheetfx *="">(outputFx) &&</txsheetfx>
|
|
Shinya Kitaoka |
120a6e |
!dynamic_cast<toutputfx *="">(outputFx))</toutputfx>
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_connectionLinks.hideBridgeLinks();
|
|
Shinya Kitaoka |
120a6e |
simulateInsertSelection(link, altButton && !!link);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *me) {
|
|
Shinya Kitaoka |
120a6e |
SchematicScene::mouseReleaseEvent(me);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_linkUnlinkSimulation = false;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if ((m_disconnectionLinks.size() == 0) && (m_connectionLinks.size() == 0))
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->beginBlock();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool altButton = QApplication::keyboardModifiers() == Qt::AltModifier;
|
|
Shinya Kitaoka |
120a6e |
if (altButton && m_isConnected) {
|
|
Shinya Kitaoka |
120a6e |
if (m_connectionLinks.size() > 0) {
|
|
Shinya Kitaoka |
120a6e |
const QList<schematiclink *=""> &bridgeLinks =</schematiclink>
|
|
Shinya Kitaoka |
120a6e |
m_connectionLinks.getBridgeLinks();
|
|
Shinya Kitaoka |
120a6e |
assert(bridgeLinks.size() <= 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link = bridgeLinks[0];
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (link) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *outputNode =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematicnode *="">(link->getEndPort()->getNode());</fxschematicnode>
|
|
Shinya Kitaoka |
120a6e |
FxSchematicNode *inputNode =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<fxschematicnode *="">(link->getStartPort()->getNode());</fxschematicnode>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (inputNode && outputNode) {
|
|
Shinya Kitaoka |
120a6e |
SchematicPort *port = link->getStartPort();
|
|
Shinya Kitaoka |
120a6e |
if (port->getType() == 200 || port->getType() == 204)
|
|
Shinya Kitaoka |
120a6e |
port = link->getOtherPort(port);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < outputNode->getInputPortCount(); i++)
|
|
Shinya Kitaoka |
120a6e |
if (port == outputNode->getInputPort(i)) break;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFxCommand::Link fxLink;
|
|
shun-iwasawa |
b322e1 |
fxLink.m_outputFx = outputNode->getFx();
|
|
shun-iwasawa |
b322e1 |
fxLink.m_inputFx = inputNode->getFx();
|
|
Shinya Kitaoka |
120a6e |
if (!outputNode->isA(eXSheetFx)) fxLink.m_index = i;
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
443318 |
TFxCommand::connectFxs(fxLink,
|
|
shun-iwasawa |
443318 |
std::list<tfxp>(m_selection->getFxs().begin(),</tfxp>
|
|
shun-iwasawa |
443318 |
m_selection->getFxs().end()),
|
|
Shinya Kitaoka |
120a6e |
m_xshHandle, m_selectionOldPos);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else if (m_disconnectionLinks.size() > 0) {
|
|
shun-iwasawa |
443318 |
TFxCommand::disconnectFxs(std::list<tfxp>(m_selection->getFxs().begin(),</tfxp>
|
|
shun-iwasawa |
443318 |
m_selection->getFxs().end()),
|
|
shun-iwasawa |
443318 |
m_xshHandle, m_selectionOldPos);
|
|
Shinya Kitaoka |
120a6e |
m_selectionOldPos.clear();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->endBlock();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_isConnected = false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool FxSchematicScene::event(QEvent *e) {
|
|
Shinya Kitaoka |
120a6e |
bool ret = SchematicScene::event(e);
|
|
Shinya Kitaoka |
120a6e |
bool altPressed = QApplication::keyboardModifiers() == Qt::AltModifier;
|
|
shun-iwasawa |
8e8baa |
if (m_altPressed != altPressed) {
|
|
shun-iwasawa |
8e8baa |
// When Alt key is pressed, put the link lines on top of other items
|
|
shun-iwasawa |
8e8baa |
// in order to enable to pick them up with itemAt() function.
|
|
shun-iwasawa |
8e8baa |
double z = (altPressed) ? 5.0 : 0.0;
|
|
shun-iwasawa |
8e8baa |
QList<qgraphicsitem *=""> sceneItems = items();</qgraphicsitem>
|
|
shun-iwasawa |
8e8baa |
for (int i = 0; i < sceneItems.size(); i++) {
|
|
shun-iwasawa |
8e8baa |
SchematicLink *link = dynamic_cast<schematiclink *="">(sceneItems.at(i));</schematiclink>
|
|
shun-iwasawa |
8e8baa |
if (link) link->setZValue(z);
|
|
shun-iwasawa |
8e8baa |
}
|
|
shun-iwasawa |
8e8baa |
|
|
shun-iwasawa |
8e8baa |
if (m_linkUnlinkSimulation) onAltModifierChanged(altPressed);
|
|
shun-iwasawa |
8e8baa |
m_altPressed = altPressed;
|
|
shun-iwasawa |
8e8baa |
}
|
|
Shinya Kitaoka |
120a6e |
return ret;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onInsertPaste() {
|
|
Shinya Kitaoka |
120a6e |
if (!m_selection->insertPasteSelection())
|
|
Shinya Kitaoka |
120a6e |
DVGui::error(
|
|
Shinya Kitaoka |
120a6e |
tr("Cannot Paste Insert a selection of unconnected FX nodes.\nSelect "
|
|
Shinya Kitaoka |
120a6e |
"FX nodes and related links before copying or cutting the selection "
|
|
Shinya Kitaoka |
120a6e |
"you want to paste."));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onAddPaste() {
|
|
Shinya Kitaoka |
120a6e |
if (!m_selection->addPasteSelection())
|
|
Shinya Kitaoka |
120a6e |
DVGui::error(
|
|
Shinya Kitaoka |
120a6e |
tr("Cannot Paste Add a selection of unconnected FX nodes.\nSelect FX "
|
|
Shinya Kitaoka |
120a6e |
"nodes and related links before copying or cutting the selection "
|
|
Shinya Kitaoka |
120a6e |
"you want to paste."));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onReplacePaste() {
|
|
Shinya Kitaoka |
120a6e |
if (!m_selection->replacePasteSelection())
|
|
Shinya Kitaoka |
120a6e |
DVGui::error(
|
|
Shinya Kitaoka |
120a6e |
tr("Cannot Paste Replace a selection of unconnected FX nodes.\nSelect "
|
|
Shinya Kitaoka |
120a6e |
"FX nodes and related links before copying or cutting the selection "
|
|
Shinya Kitaoka |
120a6e |
"you want to paste."));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onAltModifierChanged(bool altPressed) {
|
|
Shinya Kitaoka |
120a6e |
if (altPressed) {
|
|
Shinya Kitaoka |
120a6e |
if (m_disconnectionLinks.size() == 0 && m_linkUnlinkSimulation)
|
|
Shinya Kitaoka |
120a6e |
simulateDisconnectSelection(altPressed);
|
|
Shinya Kitaoka |
120a6e |
if (m_connectionLinks.size() == 0 && m_linkUnlinkSimulation) {
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<schematiclink *="">(itemAt(m_lastPos, QTransform()));</schematiclink>
|
|
Shinya Kitaoka |
120a6e |
if (link && (!link->getEndPort() || !link->getStartPort())) return;
|
|
Shinya Kitaoka |
120a6e |
simulateInsertSelection(link, altPressed && !!link);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (m_disconnectionLinks.size() > 0 && m_linkUnlinkSimulation)
|
|
Shinya Kitaoka |
120a6e |
simulateDisconnectSelection(altPressed);
|
|
Shinya Kitaoka |
120a6e |
if (m_connectionLinks.size() > 0 && m_linkUnlinkSimulation) {
|
|
Shinya Kitaoka |
120a6e |
m_connectionLinks.showBridgeLinks();
|
|
shun-iwasawa |
8e8baa |
simulateInsertSelection(0, false);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::onEditGroup() {
|
|
Shinya Kitaoka |
120a6e |
if (m_selection->isEmpty()) return;
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> fxs = m_selection->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < fxs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
if (fxs[i]->getAttributes()->isGrouped() &&
|
|
Shinya Kitaoka |
120a6e |
!fxs[i]->getAttributes()->isGroupEditing()) {
|
|
Shinya Kitaoka |
120a6e |
fxs[i]->getAttributes()->editGroup();
|
|
Shinya Kitaoka |
120a6e |
TMacroFx *macro = dynamic_cast<tmacrofx *="">(fxs[i].getPointer());</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
if (macro) {
|
|
Shinya Kitaoka |
120a6e |
std::vector<tfxp> macroFxs = macro->getFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < (int)macroFxs.size(); j++)
|
|
Shinya Kitaoka |
120a6e |
macroFxs[j]->getAttributes()->editGroup();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
updateScene();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
a8fd67 |
void FxSchematicScene::highlightLinks(FxSchematicNode *node, bool value,
|
|
shun-iwasawa |
a8fd67 |
SearchDirection direction) {
|
|
shun-iwasawa |
a8fd67 |
int i;
|
|
shun-iwasawa |
a8fd67 |
if (direction == Both || direction == Input) {
|
|
shun-iwasawa |
a8fd67 |
int portCount = node->getInputPortCount();
|
|
shun-iwasawa |
a8fd67 |
// SchematicLink* ghostLink = m_supportLinks.getDisconnectionLink(eGhost);
|
|
shun-iwasawa |
a8fd67 |
for (i = 0; i < portCount; i++) {
|
|
shun-iwasawa |
a8fd67 |
FxSchematicPort *port = node->getInputPort(i);
|
|
shun-iwasawa |
a8fd67 |
int j, linkCount = port->getLinkCount();
|
|
shun-iwasawa |
a8fd67 |
for (j = 0; j < linkCount; j++) {
|
|
shun-iwasawa |
a8fd67 |
SchematicLink *link = port->getLink(j);
|
|
shun-iwasawa |
a8fd67 |
if (!link) continue;
|
|
shun-iwasawa |
a8fd67 |
if (m_disconnectionLinks.isABridgeLink(link)) continue;
|
|
shun-iwasawa |
a8fd67 |
link->setHighlighted(value);
|
|
shun-iwasawa |
a8fd67 |
link->update();
|
|
shun-iwasawa |
a8fd67 |
m_highlightedLinks.push_back(link);
|
|
shun-iwasawa |
a8fd67 |
|
|
shun-iwasawa |
a8fd67 |
if (FxSchematicPassThroughNode *ptNode =
|
|
shun-iwasawa |
a8fd67 |
dynamic_cast<fxschematicpassthroughnode *="">(</fxschematicpassthroughnode>
|
|
shun-iwasawa |
a8fd67 |
link->getOtherNode(node)))
|
|
shun-iwasawa |
a8fd67 |
highlightLinks(ptNode, value, Input);
|
|
shun-iwasawa |
a8fd67 |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
a8fd67 |
if (direction == Both || direction == Output) {
|
|
shun-iwasawa |
a8fd67 |
FxSchematicPort *port = node->getOutputPort();
|
|
shun-iwasawa |
a8fd67 |
if (port) {
|
|
shun-iwasawa |
a8fd67 |
int linkCount = port->getLinkCount();
|
|
shun-iwasawa |
a8fd67 |
for (i = 0; i < linkCount; i++) {
|
|
shun-iwasawa |
a8fd67 |
SchematicLink *link = port->getLink(i);
|
|
shun-iwasawa |
a8fd67 |
if (!link) continue;
|
|
shun-iwasawa |
a8fd67 |
if (m_disconnectionLinks.isABridgeLink(link)) continue;
|
|
shun-iwasawa |
a8fd67 |
link->setHighlighted(value);
|
|
shun-iwasawa |
a8fd67 |
link->update();
|
|
shun-iwasawa |
a8fd67 |
m_highlightedLinks.push_back(link);
|
|
shun-iwasawa |
a8fd67 |
|
|
shun-iwasawa |
a8fd67 |
if (FxSchematicPassThroughNode *ptNode =
|
|
shun-iwasawa |
a8fd67 |
dynamic_cast<fxschematicpassthroughnode *="">(</fxschematicpassthroughnode>
|
|
shun-iwasawa |
a8fd67 |
link->getOtherNode(node)))
|
|
shun-iwasawa |
a8fd67 |
highlightLinks(ptNode, value, Output);
|
|
shun-iwasawa |
a8fd67 |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
a8fd67 |
|
|
shun-iwasawa |
a8fd67 |
if (direction != Both) return;
|
|
shun-iwasawa |
a8fd67 |
|
|
shun-iwasawa |
a8fd67 |
FxSchematicPort *port = node->getLinkPort();
|
|
Shinya Kitaoka |
120a6e |
if (port) {
|
|
Shinya Kitaoka |
120a6e |
SchematicLink *link = port->getLink(0);
|
|
Shinya Kitaoka |
120a6e |
if (link && !m_disconnectionLinks.isABridgeLink(link)) {
|
|
Shinya Kitaoka |
120a6e |
link->setHighlighted(value);
|
|
Shinya Kitaoka |
120a6e |
link->update();
|
|
Shinya Kitaoka |
120a6e |
m_highlightedLinks.push_back(link);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::simulateDisconnectSelection(bool disconnect) {
|
|
shun-iwasawa |
8e8baa |
if (disconnect) {
|
|
shun-iwasawa |
8e8baa |
if (m_selection->isEmpty()) return;
|
|
shun-iwasawa |
8e8baa |
QList<tfxp> selectedFxs = m_selection->getFxs();</tfxp>
|
|
shun-iwasawa |
8e8baa |
if (selectedFxs.isEmpty()) return;
|
|
shun-iwasawa |
8e8baa |
QMap<tfx *,="" bool=""> visitedFxs;</tfx>
|
|
shun-iwasawa |
8e8baa |
int i;
|
|
shun-iwasawa |
b322e1 |
for (i = 0; i < selectedFxs.size(); i++)
|
|
shun-iwasawa |
8e8baa |
visitedFxs[selectedFxs[i].getPointer()] = false;
|
|
shun-iwasawa |
8e8baa |
|
|
shun-iwasawa |
8e8baa |
TFx *inputFx = 0, *outputFx = 0;
|
|
shun-iwasawa |
8e8baa |
findBoundariesFxs(inputFx, outputFx, visitedFxs);
|
|
shun-iwasawa |
8e8baa |
FxSchematicNode *inputNode = m_table[inputFx];
|
|
shun-iwasawa |
8e8baa |
FxSchematicNode *outputNode = m_table[outputFx];
|
|
shun-iwasawa |
8e8baa |
assert(inputNode && outputNode);
|
|
shun-iwasawa |
8e8baa |
|
|
shun-iwasawa |
8e8baa |
FxSchematicPort *inputPort = 0, *outputPort = 0;
|
|
shun-iwasawa |
8e8baa |
SchematicPort *otherInputPort = 0;
|
|
shun-iwasawa |
8e8baa |
QList<schematicport *=""> otherOutputPorts;</schematicport>
|
|
shun-iwasawa |
8e8baa |
if (inputNode->getInputPortCount() > 0) {
|
|
shun-iwasawa |
8e8baa |
inputPort = inputNode->getInputPort(0);
|
|
shun-iwasawa |
8e8baa |
if (inputPort) {
|
|
shun-iwasawa |
8e8baa |
SchematicLink *inputLink = inputPort->getLink(0);
|
|
shun-iwasawa |
8e8baa |
if (inputLink && !m_connectionLinks.isAnInputLink(inputLink)) {
|
|
shun-iwasawa |
8e8baa |
if (!m_disconnectionLinks.isAnInputLink(inputLink))
|
|
shun-iwasawa |
8e8baa |
m_disconnectionLinks.addInputLink(inputLink);
|
|
shun-iwasawa |
8e8baa |
otherInputPort = inputLink->getOtherPort(inputPort);
|
|
shun-iwasawa |
8e8baa |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
8e8baa |
outputPort = outputNode->getOutputPort();
|
|
shun-iwasawa |
8e8baa |
if (outputPort) {
|
|
shun-iwasawa |
8e8baa |
for (i = 0; i < outputPort->getLinkCount(); i++) {
|
|
shun-iwasawa |
8e8baa |
SchematicLink *outputLink = outputPort->getLink(i);
|
|
shun-iwasawa |
8e8baa |
if (outputLink && !m_connectionLinks.isAnOutputLink(outputLink)) {
|
|
shun-iwasawa |
8e8baa |
if (!m_disconnectionLinks.isAnOutputLink(outputLink))
|
|
shun-iwasawa |
8e8baa |
m_disconnectionLinks.addOutputLink(outputLink);
|
|
shun-iwasawa |
8e8baa |
otherOutputPorts.push_back(outputLink->getOtherPort(outputPort));
|
|
shun-iwasawa |
8e8baa |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_disconnectionLinks.hideInputLinks();
|
|
Shinya Kitaoka |
120a6e |
m_disconnectionLinks.hideOutputLinks();
|
|
shun-iwasawa |
8e8baa |
|
|
shun-iwasawa |
8e8baa |
if (otherInputPort) {
|
|
shun-iwasawa |
8e8baa |
for (i = 0; i < otherOutputPorts.size(); i++)
|
|
shun-iwasawa |
8e8baa |
m_disconnectionLinks.addBridgeLink(
|
|
shun-iwasawa |
8e8baa |
otherOutputPorts[i]->makeLink(otherInputPort));
|
|
shun-iwasawa |
8e8baa |
}
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
m_disconnectionLinks.showInputLinks();
|
|
Shinya Kitaoka |
120a6e |
m_disconnectionLinks.showOutputLinks();
|
|
Shinya Kitaoka |
120a6e |
m_disconnectionLinks.removeInputLinks();
|
|
Shinya Kitaoka |
120a6e |
m_disconnectionLinks.removeOutputLinks();
|
|
shun-iwasawa |
8e8baa |
m_disconnectionLinks.removeBridgeLinks(true);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::simulateInsertSelection(SchematicLink *link,
|
|
Shinya Kitaoka |
120a6e |
bool connect) {
|
|
shun-iwasawa |
b322e1 |
// first, remove all connected links
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.showBridgeLinks();
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.hideInputLinks();
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.hideOutputLinks();
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.removeBridgeLinks();
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.removeInputLinks(true);
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.removeOutputLinks(true);
|
|
shun-iwasawa |
b322e1 |
if (!link || !connect) return;
|
|
shun-iwasawa |
b322e1 |
|
|
shun-iwasawa |
b322e1 |
if (m_disconnectionLinks.isABridgeLink(link) || m_selection->isEmpty())
|
|
shun-iwasawa |
b322e1 |
return;
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.addBridgeLink(link);
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.hideBridgeLinks();
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
b322e1 |
SchematicPort *inputPort = 0, *outputPort = 0;
|
|
shun-iwasawa |
b322e1 |
if (link) {
|
|
shun-iwasawa |
b322e1 |
if (link->getStartPort()->getType() == eFxInputPort) {
|
|
shun-iwasawa |
b322e1 |
inputPort = link->getStartPort();
|
|
shun-iwasawa |
b322e1 |
outputPort = link->getEndPort();
|
|
shun-iwasawa |
b322e1 |
} else {
|
|
shun-iwasawa |
b322e1 |
inputPort = link->getEndPort();
|
|
shun-iwasawa |
b322e1 |
outputPort = link->getStartPort();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
b322e1 |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
b322e1 |
QMap<tfx *,="" bool=""> visitedFxs;</tfx>
|
|
shun-iwasawa |
b322e1 |
QList<tfxp> selectedFxs = m_selection->getFxs();</tfxp>
|
|
shun-iwasawa |
b322e1 |
if (selectedFxs.isEmpty()) return;
|
|
shun-iwasawa |
b322e1 |
int i;
|
|
shun-iwasawa |
b322e1 |
for (i = 0; i < selectedFxs.size(); i++)
|
|
shun-iwasawa |
b322e1 |
visitedFxs[selectedFxs[i].getPointer()] = false;
|
|
shun-iwasawa |
b322e1 |
|
|
shun-iwasawa |
b322e1 |
TFx *inputFx = 0, *outputFx = 0;
|
|
shun-iwasawa |
b322e1 |
findBoundariesFxs(inputFx, outputFx, visitedFxs);
|
|
shun-iwasawa |
b322e1 |
FxSchematicNode *inputNode = m_table[inputFx];
|
|
shun-iwasawa |
b322e1 |
FxSchematicNode *outputNode = m_table[outputFx];
|
|
shun-iwasawa |
b322e1 |
assert(inputNode && outputNode);
|
|
shun-iwasawa |
b322e1 |
|
|
shun-iwasawa |
b322e1 |
if (inputNode->getInputPortCount() > 0) {
|
|
shun-iwasawa |
b322e1 |
SchematicPort *inputNodePort = inputNode->getInputPort(0);
|
|
shun-iwasawa |
b322e1 |
if (inputNodePort && outputPort)
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.addInputLink(inputNodePort->makeLink(outputPort));
|
|
shun-iwasawa |
b322e1 |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
b322e1 |
SchematicPort *outputNodePort = outputNode->getOutputPort();
|
|
shun-iwasawa |
b322e1 |
if (outputNodePort && inputPort)
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.addOutputLink(inputPort->makeLink(outputNodePort));
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.showInputLinks();
|
|
shun-iwasawa |
b322e1 |
m_connectionLinks.showOutputLinks();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
shun-iwasawa |
b322e1 |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*! in order to select nods after pasting the copied fx nodes from FxSelection
|
|
shun-iwasawa |
b322e1 |
*/
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::selectNodes(QList<tfxp> &fxs) {</tfxp>
|
|
Shinya Kitaoka |
120a6e |
clearSelection();
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < (int)fxs.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TFx *tempFx = fxs[i].getPointer();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QMap<tfx *="" *,="" fxschematicnode="">::iterator it;</tfx>
|
|
Shinya Kitaoka |
120a6e |
it = m_table.find(tempFx);
|
|
Shinya Kitaoka |
120a6e |
if (it == m_table.end()) continue;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
it.value()->setSelected(true);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
update();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updateNestedGroupEditors(FxSchematicNode *node,
|
|
Shinya Kitaoka |
120a6e |
const QPointF &newPos) {
|
|
Shinya Kitaoka |
120a6e |
if (!node) return;
|
|
Shinya Kitaoka |
120a6e |
QStack<int> groupIdStack = node->getFx()->getAttributes()->getGroupIdStack();</int>
|
|
Shinya Kitaoka |
120a6e |
int i;
|
|
Shinya Kitaoka |
120a6e |
QRectF rect;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < groupIdStack.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
if (m_groupEditorTable.contains(groupIdStack[i])) {
|
|
Shinya Kitaoka |
120a6e |
QRectF app = m_groupEditorTable[groupIdStack[i]]->sceneBoundingRect();
|
|
Shinya Kitaoka |
120a6e |
if (rect.isEmpty())
|
|
Shinya Kitaoka |
120a6e |
rect = app;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
rect = rect.united(app);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
QMap<tmacrofx *="" *,="" fxschematicmacroeditor="">::iterator it;</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_macroEditorTable.begin(); it != m_macroEditorTable.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
if (it.value()->contains(node)) {
|
|
Shinya Kitaoka |
120a6e |
QRectF app = it.value()->sceneBoundingRect();
|
|
Shinya Kitaoka |
120a6e |
if (rect.isEmpty())
|
|
Shinya Kitaoka |
120a6e |
rect = app;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
rect = rect.united(app);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
node->setPos(newPos);
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < groupIdStack.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
if (!m_groupEditorTable.contains(groupIdStack[i])) continue;
|
|
Shinya Kitaoka |
120a6e |
rect =
|
|
Shinya Kitaoka |
120a6e |
rect.united(m_groupEditorTable[groupIdStack[i]]->sceneBoundingRect());
|
|
Shinya Kitaoka |
120a6e |
QRectF app = m_groupEditorTable[groupIdStack[i]]->boundingSceneRect();
|
|
Shinya Kitaoka |
120a6e |
if (m_groupEditorTable[groupIdStack[i]]->scenePos() != app.topLeft())
|
|
Shinya Kitaoka |
120a6e |
m_groupEditorTable[groupIdStack[i]]->setPos(app.topLeft());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
for (it = m_macroEditorTable.begin(); it != m_macroEditorTable.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
FxSchematicMacroEditor *editor = it.value();
|
|
Shinya Kitaoka |
120a6e |
if (editor->contains(node)) {
|
|
Shinya Kitaoka |
120a6e |
QRectF app = editor->sceneBoundingRect();
|
|
shun-iwasawa |
443318 |
rect = rect.united(app);
|
|
shun-iwasawa |
443318 |
app = editor->boundingSceneRect();
|
|
Shinya Kitaoka |
120a6e |
if (editor->scenePos() != app.topLeft()) editor->setPos(app.topLeft());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
update(rect);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::closeInnerMacroEditor(int groupId) {
|
|
Shinya Kitaoka |
120a6e |
assert(m_groupEditorTable.contains(groupId));
|
|
Shinya Kitaoka |
120a6e |
QMap<tmacrofx *="" *,="" fxschematicmacroeditor="">::iterator it;</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_macroEditorTable.begin(); it != m_macroEditorTable.end(); it++) {
|
|
Shinya Kitaoka |
120a6e |
TMacroFx *macro = it.key();
|
|
Shinya Kitaoka |
120a6e |
assert(macro);
|
|
Shinya Kitaoka |
120a6e |
if (macro->getAttributes()->isContainedInGroup(groupId)) {
|
|
Shinya Kitaoka |
120a6e |
macro->editMacro(false);
|
|
Shinya Kitaoka |
120a6e |
macro->getAttributes()->closeEditingGroup(groupId);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::resizeNodes(bool maximizedNode) {
|
|
manongjohn |
adae7d |
resizingNodes = true;
|
|
manongjohn |
adae7d |
|
|
Shinya Kitaoka |
120a6e |
// resize nodes
|
|
Shinya Kitaoka |
120a6e |
m_gridDimension = maximizedNode ? eLarge : eSmall;
|
|
Shinya Kitaoka |
120a6e |
m_xshHandle->getXsheet()->getFxDag()->setDagGridDimension(m_gridDimension);
|
|
Shinya Kitaoka |
120a6e |
QMap<tfx *="" *,="" fxschematicnode="">::iterator it1;</tfx>
|
|
Shinya Kitaoka |
120a6e |
for (it1 = m_table.begin(); it1 != m_table.end(); it1++) {
|
|
Shinya Kitaoka |
120a6e |
if (!it1.value()) continue;
|
|
Shinya Kitaoka |
120a6e |
it1.value()->resize(maximizedNode);
|
|
Shinya Kitaoka |
120a6e |
TFx *fx = it1.value()->getFx();
|
|
Shinya Kitaoka |
120a6e |
updatePositionOnResize(fx, maximizedNode);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
QMap<int, *="" fxgroupnode="">::iterator it2;</int,>
|
|
Shinya Kitaoka |
120a6e |
for (it2 = m_groupedTable.begin(); it2 != m_groupedTable.end(); it2++) {
|
|
Shinya Kitaoka |
120a6e |
if (!it2.value()) continue;
|
|
Shinya Kitaoka |
120a6e |
it2.value()->resize(maximizedNode);
|
|
Shinya Kitaoka |
120a6e |
QList<tfxp> groupedFxs = it2.value()->getGroupedFxs();</tfxp>
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < groupedFxs.size(); i++)
|
|
Shinya Kitaoka |
120a6e |
updatePositionOnResize(groupedFxs[i].getPointer(), maximizedNode);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
QMap<tmacrofx *="" *,="" fxschematicmacroeditor="">::iterator it3;</tmacrofx>
|
|
Shinya Kitaoka |
120a6e |
for (it3 = m_macroEditorTable.begin(); it3 != m_macroEditorTable.end();
|
|
Shinya Kitaoka |
120a6e |
it3++) {
|
|
Shinya Kitaoka |
120a6e |
if (!it3.value()) continue;
|
|
Shinya Kitaoka |
120a6e |
it3.value()->resizeNodes(maximizedNode);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
updateScene();
|
|
manongjohn |
adae7d |
|
|
manongjohn |
adae7d |
resizingNodes = false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void FxSchematicScene::updatePositionOnResize(TFx *fx, bool maximizedNode) {
|
|
Shinya Kitaoka |
120a6e |
TPointD oldPos = fx->getAttributes()->getDagNodePos();
|
|
manongjohn |
f37f4a |
if (oldPos == TConst::nowhere) return;
|
|
Shinya Kitaoka |
120a6e |
double oldPosY = oldPos.y - 25000;
|
|
Shinya Kitaoka |
120a6e |
double newPosY = maximizedNode ? oldPosY * 2 : oldPosY * 0.5;
|
|
Shinya Kitaoka |
120a6e |
fx->getAttributes()->setDagNodePos(TPointD(oldPos.x, newPosY + 25000));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
manongjohn |
adae7d |
|
|
manongjohn |
adae7d |
//------------------------------------------------------------------
|
|
manongjohn |
adae7d |
|
|
manongjohn |
adae7d |
void FxSchematicScene::onNodeChangedSize() {
|
|
manongjohn |
adae7d |
if (resizingNodes) return;
|
|
manongjohn |
adae7d |
updateScene();
|
|
manongjohn |
adae7d |
}
|
|
shun-iwasawa |
9d4ead |
|
|
shun-iwasawa |
9d4ead |
//------------------------------------------------------------------
|
|
shun-iwasawa |
9d4ead |
|
|
shun-iwasawa |
9d4ead |
bool FxSchematicScene::isAnEmptyZone_withParentFx(const QRectF &rect,
|
|
shun-iwasawa |
9d4ead |
const TFx *parent) {
|
|
shun-iwasawa |
9d4ead |
QList<qgraphicsitem *=""> allItems = items();</qgraphicsitem>
|
|
shun-iwasawa |
9d4ead |
for (auto const level : allItems) {
|
|
shun-iwasawa |
9d4ead |
SchematicNode *node = dynamic_cast<schematicnode *="">(level);</schematicnode>
|
|
shun-iwasawa |
9d4ead |
if (!node) continue;
|
|
shun-iwasawa |
9d4ead |
FxSchematicNode *fxNode = dynamic_cast<fxschematicnode *="">(node);</fxschematicnode>
|
|
shun-iwasawa |
9d4ead |
if (fxNode && fxNode->isA(eXSheetFx)) continue;
|
|
shun-iwasawa |
9d4ead |
// check only the fxs sharing the same parent
|
|
shun-iwasawa |
9d4ead |
if (!fxNode) continue;
|
|
shun-iwasawa |
ae72bf |
TFx *fx = fxNode->getFx();
|
|
shun-iwasawa |
ae72bf |
if (TZeraryColumnFx *zfx = dynamic_cast<tzerarycolumnfx *="">(fx))</tzerarycolumnfx>
|
|
shun-iwasawa |
ae72bf |
fx = zfx->getZeraryFx();
|
|
shun-iwasawa |
ae72bf |
if (!fx || fx == parent) continue;
|
|
shun-iwasawa |
ae72bf |
for (int p = 0; p < fx->getInputPortCount(); p++) {
|
|
shun-iwasawa |
ae72bf |
if (parent == fx->getInputPort(p)->getFx()) {
|
|
shun-iwasawa |
9d4ead |
if (node->boundingRect().translated(node->scenePos()).intersects(rect))
|
|
shun-iwasawa |
9d4ead |
return false;
|
|
shun-iwasawa |
9d4ead |
else
|
|
shun-iwasawa |
9d4ead |
break;
|
|
shun-iwasawa |
9d4ead |
}
|
|
shun-iwasawa |
9d4ead |
}
|
|
shun-iwasawa |
9d4ead |
}
|
|
shun-iwasawa |
9d4ead |
return true;
|
|
shun-iwasawa |
57ba4e |
}
|
|
shun-iwasawa |
57ba4e |
|
|
shun-iwasawa |
57ba4e |
//------------------------------------------------------------------
|
|
shun-iwasawa |
57ba4e |
// update snap targets on click node
|
|
shun-iwasawa |
57ba4e |
void FxSchematicScene::updateSnapTarget(QGraphicsItem *item) {
|
|
shun-iwasawa |
57ba4e |
clearSnapTargets();
|
|
shun-iwasawa |
57ba4e |
FxSchematicNode *node = dynamic_cast<fxschematicnode *="">(item);</fxschematicnode>
|
|
shun-iwasawa |
57ba4e |
if (!node) return;
|
|
shun-iwasawa |
57ba4e |
|
|
shun-iwasawa |
57ba4e |
// find input connections
|
|
shun-iwasawa |
57ba4e |
int portCount = node->getInputPortCount();
|
|
shun-iwasawa |
57ba4e |
for (int i = 0; i < portCount; i++) {
|
|
shun-iwasawa |
57ba4e |
FxSchematicPort *port = node->getInputPort(i);
|
|
shun-iwasawa |
57ba4e |
int j, linkCount = port->getLinkCount();
|
|
shun-iwasawa |
57ba4e |
for (j = 0; j < linkCount; j++) {
|
|
shun-iwasawa |
57ba4e |
SchematicLink *link = port->getLink(j);
|
|
shun-iwasawa |
57ba4e |
if (!link) continue;
|
|
shun-iwasawa |
57ba4e |
if (m_disconnectionLinks.isABridgeLink(link)) continue;
|
|
shun-iwasawa |
57ba4e |
SchematicNode *otherNode = link->getOtherNode(node);
|
|
shun-iwasawa |
57ba4e |
if (otherNode && !otherNode->isSelected()) {
|
|
shun-iwasawa |
57ba4e |
QPointF targetPos =
|
|
shun-iwasawa |
57ba4e |
otherNode->scenePos() + QPointF(otherNode->boundingRect().width() +
|
|
shun-iwasawa |
57ba4e |
SchematicScene::snapHSpacing,
|
|
shun-iwasawa |
57ba4e |
0);
|
|
shun-iwasawa |
57ba4e |
|
|
shun-iwasawa |
57ba4e |
addSnapTarget(targetPos, node->boundingRect(),
|
|
shun-iwasawa |
57ba4e |
link->getOtherPort(port)->getLinkEndPoint(),
|
|
shun-iwasawa |
57ba4e |
port->getLinkEndPoint() - node->scenePos());
|
|
shun-iwasawa |
57ba4e |
}
|
|
shun-iwasawa |
57ba4e |
}
|
|
shun-iwasawa |
57ba4e |
}
|
|
shun-iwasawa |
57ba4e |
|
|
shun-iwasawa |
57ba4e |
// find output connections
|
|
shun-iwasawa |
57ba4e |
FxSchematicPort *port = node->getOutputPort();
|
|
shun-iwasawa |
57ba4e |
if (port) {
|
|
shun-iwasawa |
57ba4e |
int linkCount = port->getLinkCount();
|
|
shun-iwasawa |
57ba4e |
for (int i = 0; i < linkCount; i++) {
|
|
shun-iwasawa |
57ba4e |
SchematicLink *link = port->getLink(i);
|
|
shun-iwasawa |
57ba4e |
if (!link) continue;
|
|
shun-iwasawa |
57ba4e |
if (m_disconnectionLinks.isABridgeLink(link)) continue;
|
|
shun-iwasawa |
57ba4e |
SchematicNode *otherNode = link->getOtherNode(node);
|
|
shun-iwasawa |
57ba4e |
if (otherNode && !otherNode->isSelected()) {
|
|
shun-iwasawa |
57ba4e |
QPointF targetPos =
|
|
shun-iwasawa |
57ba4e |
otherNode->scenePos() -
|
|
shun-iwasawa |
57ba4e |
QPointF(node->boundingRect().width() + SchematicScene::snapHSpacing,
|
|
shun-iwasawa |
57ba4e |
0);
|
|
shun-iwasawa |
57ba4e |
addSnapTarget(targetPos, node->boundingRect(),
|
|
shun-iwasawa |
57ba4e |
link->getOtherPort(port)->getLinkEndPoint(),
|
|
shun-iwasawa |
57ba4e |
port->getLinkEndPoint() - node->scenePos());
|
|
shun-iwasawa |
57ba4e |
}
|
|
shun-iwasawa |
57ba4e |
}
|
|
shun-iwasawa |
57ba4e |
}
|
|
shun-iwasawa |
9d4ead |
}
|