StandardNodeGadget::StandardNodeGadget( Gaffer::NodePtr node, LinearContainer::Orientation orientation ) : NodeGadget( node ), m_nodeEnabled( true ), m_labelsVisibleOnHover( true ), m_dragDestinationProxy( 0 ) { LinearContainer::Orientation oppositeOrientation = orientation == LinearContainer::X ? LinearContainer::Y : LinearContainer::X; LinearContainerPtr mainContainer = new LinearContainer( "mainContainer", oppositeOrientation, LinearContainer::Centre, g_spacing, orientation == LinearContainer::X ? LinearContainer::Increasing : LinearContainer::Decreasing ); const float noduleSpacing = orientation == LinearContainer::X ? 2.0f : 0.2f; LinearContainer::Direction noduleDirection = orientation == LinearContainer::X ? LinearContainer::Increasing : LinearContainer::Decreasing; LinearContainerPtr inputNoduleContainer = new LinearContainer( "inputNoduleContainer", orientation, LinearContainer::Centre, noduleSpacing, noduleDirection ); LinearContainerPtr outputNoduleContainer = new LinearContainer( "outputNoduleContainer", orientation, LinearContainer::Centre, noduleSpacing, noduleDirection ); mainContainer->addChild( outputNoduleContainer ); IndividualContainerPtr contentsContainer = new IndividualContainer(); contentsContainer->setName( "contentsContainer" ); contentsContainer->setPadding( Box3f( V3f( -g_borderWidth ), V3f( g_borderWidth ) ) ); mainContainer->addChild( contentsContainer ); mainContainer->addChild( inputNoduleContainer ); setChild( mainContainer ); setContents( new NameGadget( node ) ); Gaffer::ScriptNodePtr script = node->scriptNode(); if( script ) { script->selection()->memberAddedSignal().connect( boost::bind( &StandardNodeGadget::selectionChanged, this, ::_1, ::_2 ) ); script->selection()->memberRemovedSignal().connect( boost::bind( &StandardNodeGadget::selectionChanged, this, ::_1, ::_2 ) ); } node->childAddedSignal().connect( boost::bind( &StandardNodeGadget::childAdded, this, ::_1, ::_2 ) ); node->childRemovedSignal().connect( boost::bind( &StandardNodeGadget::childRemoved, this, ::_1, ::_2 ) ); for( Gaffer::PlugIterator it( node ); it!=it.end(); it++ ) { addNodule( *it ); } if( DependencyNode *dependencyNode = IECore::runTimeCast<DependencyNode>( node ) ) { const Gaffer::BoolPlug *enabledPlug = dependencyNode->enabledPlug(); if( enabledPlug ) { m_nodeEnabled = enabledPlug->getValue(); 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 ) ); inputNoduleContainer->enterSignal().connect( boost::bind( &StandardNodeGadget::enter, this, ::_1 ) ); inputNoduleContainer->leaveSignal().connect( boost::bind( &StandardNodeGadget::leave, this, ::_1 ) ); outputNoduleContainer->enterSignal().connect( boost::bind( &StandardNodeGadget::enter, this, ::_1 ) ); outputNoduleContainer->leaveSignal().connect( boost::bind( &StandardNodeGadget::leave, this, ::_1 ) ); }
StandardNodeGadget::StandardNodeGadget( Gaffer::NodePtr node ) : NodeGadget( node ), m_nodeEnabled( true ), m_labelsVisibleOnHover( true ), m_dragDestinationProxy( 0 ), m_userColor( 0 ) { // build our ui structure //////////////////////////////////////////////////////// float horizontalNoduleSpacing = 2.0f; float verticalNoduleSpacing = 0.2f; float minWidth = 10.0f; if( IECore::ConstFloatDataPtr d = Metadata::nodeValue<IECore::FloatData>( node.get(), g_horizontalNoduleSpacingKey ) ) { horizontalNoduleSpacing = d->readable(); } if( IECore::ConstFloatDataPtr d = Metadata::nodeValue<IECore::FloatData>( node.get(), g_verticalNoduleSpacingKey ) ) { verticalNoduleSpacing = d->readable(); } if( IECore::ConstFloatDataPtr d = Metadata::nodeValue<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, LinearContainer::Centre, horizontalNoduleSpacing ); topNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 0, 1, 0 ) ) ) ); topNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 0, 1, 0 ) ) ) ); LinearContainerPtr bottomNoduleContainer = new LinearContainer( "bottomNoduleContainer", LinearContainer::X, LinearContainer::Centre, horizontalNoduleSpacing ); bottomNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 0, 1, 0 ) ) ) ); bottomNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 0, 1, 0 ) ) ) ); LinearContainerPtr leftNoduleContainer = new LinearContainer( "leftNoduleContainer", LinearContainer::Y, LinearContainer::Centre, verticalNoduleSpacing, LinearContainer::Decreasing ); leftNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0, 0 ) ) ) ); leftNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0, 0 ) ) ) ); LinearContainerPtr rightNoduleContainer = new LinearContainer( "rightNoduleContainer", LinearContainer::Y, LinearContainer::Centre, verticalNoduleSpacing, LinearContainer::Decreasing ); rightNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0, 0 ) ) ) ); rightNoduleContainer->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( 1, 0, 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 ); IndividualContainerPtr contentsContainer = new IndividualContainer(); contentsContainer->setName( "contentsContainer" ); contentsColumn->addChild( new SpacerGadget( Box3f( V3f( 0 ), V3f( minWidth, 0, 0 ) ) ) ); contentsColumn->addChild( contentsContainer ); 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->childAddedSignal().connect( boost::bind( &StandardNodeGadget::childAdded, this, ::_1, ::_2 ) ); node->childRemovedSignal().connect( boost::bind( &StandardNodeGadget::childRemoved, this, ::_1, ::_2 ) ); 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++ ) { LinearContainer *c = noduleContainer( (Edge)e ); c->enterSignal().connect( boost::bind( &StandardNodeGadget::enter, this, ::_1 ) ); c->leaveSignal().connect( boost::bind( &StandardNodeGadget::leave, this, ::_1 ) ); } Metadata::plugValueChangedSignal().connect( boost::bind( &StandardNodeGadget::plugMetadataChanged, this, ::_1, ::_2, ::_3, ::_4 ) ); Metadata::nodeValueChangedSignal().connect( boost::bind( &StandardNodeGadget::nodeMetadataChanged, this, ::_1, ::_2, ::_3 ) ); // do our first update //////////////////////////////////////////////////////// updateNoduleLayout(); updateUserColor(); updatePadding(); updateNodeEnabled(); }