void GraphGadget::removeConnectionGadgets( const Gaffer::GraphComponent *plugParent ) { /// \todo I think this could be faster if we could iterate over just the nodules rather than all the plugs. Perhaps /// we could make it easy to recurse over all the Nodules of a NodeGadget if we had a RecursiveChildIterator for GraphComponents? for( Gaffer::PlugIterator pIt( plugParent->children().begin(), plugParent->children().end() ); pIt!=pIt.end(); pIt++ ) { if( (*pIt)->direction() == Gaffer::Plug::In ) { // remove input connection gadgets { removeConnectionGadget( pIt->get() ); } } else { // make output connection gadgets dangle for( Gaffer::Plug::OutputContainer::const_iterator oIt( (*pIt)->outputs().begin() ); oIt!= (*pIt)->outputs().end(); oIt++ ) { ConnectionGadget *connection = findConnectionGadget( *oIt ); if( connection ) { connection->setNodules( 0, connection->dstNodule() ); } } } if( (*pIt)->isInstanceOf( Gaffer::CompoundPlug::staticTypeId() ) ) { removeConnectionGadgets( pIt->get() ); } } }
void GraphGadget::addConnectionGadgets( Gaffer::GraphComponent *plugParent ) { /// \todo I think this could be faster if we could iterate over just the nodules rather than all the plugs. Perhaps /// we could make it easy to recurse over all the Nodules of a NodeGadget if we had a RecursiveChildIterator for GraphComponents? Gaffer::Node *node = plugParent->isInstanceOf( Gaffer::Node::staticTypeId() ) ? static_cast<Gaffer::Node *>( plugParent ) : plugParent->ancestor<Gaffer::Node>(); NodeGadget *nodeGadget = findNodeGadget( node ); if( !nodeGadget ) { return; } for( Gaffer::PlugIterator pIt( plugParent->children().begin(), plugParent->children().end() ); pIt!=pIt.end(); pIt++ ) { if( (*pIt)->direction() == Gaffer::Plug::In ) { // add connections for input plugs if( !findConnectionGadget( pIt->get() ) ) { addConnectionGadget( pIt->get() ); } } else { // reconnect any old output connections which may have been dangling Nodule *srcNodule = nodeGadget->nodule( *pIt ); if( srcNodule ) { for( Gaffer::Plug::OutputContainer::const_iterator oIt( (*pIt)->outputs().begin() ); oIt!= (*pIt)->outputs().end(); oIt++ ) { ConnectionGadget *connection = findConnectionGadget( *oIt ); if( connection && !connection->srcNodule() ) { assert( connection->dstNodule()->plug()->getInput<Gaffer::Plug>() == *pIt ); connection->setNodules( srcNodule, connection->dstNodule() ); } } } } if( (*pIt)->isInstanceOf( Gaffer::CompoundPlug::staticTypeId() ) ) { addConnectionGadgets( pIt->get() ); } } }
static NodulePtr dstNodule( ConnectionGadget &c ) { return c.dstNodule(); }