void GraphGadget::setRoot( Gaffer::NodePtr root, Gaffer::SetPtr filter ) { if( root == m_root && filter == m_filter ) { return; } bool rootChanged = false; Gaffer::NodePtr previousRoot = m_root; if( root != m_root ) { rootChanged = true; m_root = root; m_rootChildAddedConnection = m_root->childAddedSignal().connect( boost::bind( &GraphGadget::rootChildAdded, this, ::_1, ::_2 ) ); m_rootChildRemovedConnection = m_root->childRemovedSignal().connect( boost::bind( &GraphGadget::rootChildRemoved, this, ::_1, ::_2 ) ); } Gaffer::ScriptNodePtr scriptNode = runTimeCast<Gaffer::ScriptNode>( m_root ); if( !scriptNode ) { scriptNode = m_root->scriptNode(); } if( scriptNode != m_scriptNode ) { m_scriptNode = scriptNode; if( m_scriptNode ) { m_selectionMemberAddedConnection = m_scriptNode->selection()->memberAddedSignal().connect( boost::bind( &GraphGadget::selectionMemberAdded, this, ::_1, ::_2 ) ); m_selectionMemberRemovedConnection = m_scriptNode->selection()->memberRemovedSignal().connect( boost::bind( &GraphGadget::selectionMemberRemoved, this, ::_1, ::_2 ) ); } else { m_selectionMemberAddedConnection.disconnect(); m_selectionMemberAddedConnection.disconnect(); } } if( filter != m_filter ) { setFilter( filter ); // setFilter() will call updateGraph() for us. } else { updateGraph(); } if( rootChanged ) { m_rootChangedSignal( this, previousRoot.get() ); } }
StandardNodeGadget::StandardNodeGadget( Gaffer::NodePtr node ) : NodeGadget( node ), m_nodeEnabled( true ), m_labelsVisibleOnHover( true ), m_dragDestination( nullptr ), m_userColor( 0 ), m_oval( false ) { // build our ui structure //////////////////////////////////////////////////////// float minWidth = 10.0f; if( IECore::ConstFloatDataPtr d = Metadata::value<IECore::FloatData>( node.get(), g_minWidthKey ) ) { minWidth = d->readable(); } // four containers for nodules - one each for the top, bottom, left and right. // these contain spacers at either end to prevent nodules being placed in // the corners of the node gadget, and also to guarantee a minimim width for the // vertical containers and a minimum height for the horizontal ones. LinearContainerPtr topNoduleContainer = new LinearContainer( "topNoduleContainer", LinearContainer::X ); topNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 2, 1, 0 ) ) ) ); topNoduleContainer->addChild( new NoduleLayout( node, "top" ) ); topNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 2, 1, 0 ) ) ) ); LinearContainerPtr bottomNoduleContainer = new LinearContainer( "bottomNoduleContainer", LinearContainer::X ); bottomNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 2, 1, 0 ) ) ) ); bottomNoduleContainer->addChild( new NoduleLayout( node, "bottom" ) ); bottomNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 2, 1, 0 ) ) ) ); LinearContainerPtr leftNoduleContainer = new LinearContainer( "leftNoduleContainer", LinearContainer::Y, LinearContainer::Centre, 0.0f, LinearContainer::Decreasing ); leftNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0.2, 0 ) ) ) ); leftNoduleContainer->addChild( new NoduleLayout( node, "left" ) ); leftNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0.2, 0 ) ) ) ); LinearContainerPtr rightNoduleContainer = new LinearContainer( "rightNoduleContainer", LinearContainer::Y, LinearContainer::Centre, 0.0f, LinearContainer::Decreasing ); rightNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0.2, 0 ) ) ) ); rightNoduleContainer->addChild( new NoduleLayout( node, "right" ) ); rightNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0.2, 0 ) ) ) ); // column - this is our outermost structuring container LinearContainerPtr column = new LinearContainer( "column", LinearContainer::Y, LinearContainer::Centre, 0.0f, LinearContainer::Decreasing ); column->addChild( topNoduleContainer ); LinearContainerPtr row = new LinearContainer( "row", LinearContainer::X, LinearContainer::Centre, 0.0f ); column->addChild( row ); // central row - this holds our main contents, with the // nodule containers surrounding it. row->addChild( leftNoduleContainer ); LinearContainerPtr contentsColumn = new LinearContainer( "contentsColumn", LinearContainer::Y, LinearContainer::Centre, 0.0f, LinearContainer::Decreasing ); row->addChild( contentsColumn ); LinearContainerPtr contentsRow = new LinearContainer( "paddingRow", LinearContainer::X, LinearContainer::Centre, 0.5f ); IndividualContainerPtr iconContainer = new IndividualContainer(); iconContainer->setName( "iconContainer" ); contentsRow->addChild( iconContainer ); IndividualContainerPtr contentsContainer = new IndividualContainer(); contentsContainer->setName( "contentsContainer" ); contentsRow->addChild( contentsContainer ); contentsColumn->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( minWidth, 0, 0 ) ) ) ); contentsColumn->addChild( contentsRow ); contentsColumn->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( minWidth, 0, 0 ) ) ) ); row->addChild( rightNoduleContainer ); column->addChild( bottomNoduleContainer ); addChild( column ); setContents( new NameGadget( node ) ); // connect to the signals we need in order to operate //////////////////////////////////////////////////////// node->errorSignal().connect( boost::bind( &StandardNodeGadget::error, this, ::_1, ::_2, ::_3 ) ); node->plugDirtiedSignal().connect( boost::bind( &StandardNodeGadget::plugDirtied, this, ::_1 ) ); dragEnterSignal().connect( boost::bind( &StandardNodeGadget::dragEnter, this, ::_1, ::_2 ) ); dragMoveSignal().connect( boost::bind( &StandardNodeGadget::dragMove, this, ::_1, ::_2 ) ); dragLeaveSignal().connect( boost::bind( &StandardNodeGadget::dragLeave, this, ::_1, ::_2 ) ); dropSignal().connect( boost::bind( &StandardNodeGadget::drop, this, ::_1, ::_2 ) ); for( int e = FirstEdge; e <= LastEdge; e++ ) { NoduleLayout *l = noduleLayout( (Edge)e ); l->enterSignal().connect( boost::bind( &StandardNodeGadget::enter, this, ::_1 ) ); l->leaveSignal().connect( boost::bind( &StandardNodeGadget::leave, this, ::_1 ) ); } Metadata::nodeValueChangedSignal().connect( boost::bind( &StandardNodeGadget::nodeMetadataChanged, this, ::_1, ::_2, ::_3 ) ); // do our first update //////////////////////////////////////////////////////// updateUserColor(); updatePadding(); updateNodeEnabled(); updateIcon(); updateShape(); }
NodeGadgetPtr NodeGadget::create( Gaffer::NodePtr node ) { IECore::ConstStringDataPtr nodeGadgetType = Gaffer::Metadata::value<IECore::StringData>( node.get(), "nodeGadget:type" ); if( nodeGadgetType ) { if( nodeGadgetType->readable() == "" ) { return nullptr; } const TypeCreatorMap &m = typeCreators(); TypeCreatorMap::const_iterator it = m.find( nodeGadgetType->readable() ); if( it != m.end() ) { return it->second( node ); } else { IECore::msg( IECore::Msg::Warning, "NodeGadget::create", boost::format( "Nonexistent type \"%s\" requested for node \"%s\"" ) % nodeGadgetType->readable() % node->fullName() ); } } const NodeCreatorMap &cr = nodeCreators(); IECore::TypeId typeId = node->typeId(); while( typeId != IECore::InvalidTypeId ) { const NodeCreatorMap::const_iterator it = cr.find( typeId ); if( it != cr.end() ) { return it->second( node ); } typeId = IECore::RunTimeTyped::baseTypeId( typeId ); } return nullptr; }
NodeGadget::NodeGadget( Gaffer::NodePtr node ) : m_node( node.get() ) { }