12 #ifndef __UN_NodeUtils_h__
13 #define __UN_NodeUtils_h__
20 namespace UN_NodeUtils
24 isValid(
const UN_GraphData *graph_data, UN_NodeID node_id )
26 return graph_data && graph_data->
isValid( node_id );
31 deleteNode(
UN_GraphData *graph_data, UN_NodeID node_id )
33 if( isValid( graph_data, node_id ))
48 name(
const UN_GraphData *graph_data, UN_NodeID node_id )
57 setTypeName(
UN_GraphData *graph_data, UN_NodeID node_id,
67 typeName(
const UN_GraphData *graph_data, UN_NodeID node_id )
77 categoryName(
const UN_GraphData *graph_data, UN_NodeID node_id )
90 setSignature(
UN_GraphData *graph_data, UN_NodeID node_id,
99 signatureName(
const UN_GraphData *graph_data, UN_NodeID node_id )
108 setComment(
UN_GraphData *graph_data, UN_NodeID node_id,
117 comment(
const UN_GraphData *graph_data, UN_NodeID node_id )
126 setPosition(
UN_GraphData *graph_data, UN_NodeID node_id,
135 position(
const UN_GraphData *graph_data, UN_NodeID node_id )
153 color(
const UN_GraphData *graph_data, UN_NodeID node_id )
180 stealTags(
UN_GraphData *graph_data, UN_NodeID node_id )
190 template <
typename OP>
192 updateTags(
UN_GraphData *graph_data, UN_NodeID node_id,
const OP &
op )
200 tags(
const UN_GraphData *graph_data, UN_NodeID node_id )
209 setMetadata(
UN_GraphData *graph_data, UN_NodeID node_id,
218 setMetadata(
UN_GraphData *graph_data, UN_NodeID node_id,
227 stealMetadata(
UN_GraphData *graph_data, UN_NodeID node_id )
237 template <
typename OP>
239 updateMetadata(
UN_GraphData *graph_data, UN_NodeID node_id,
const OP &op )
254 node_id, key, std::move(
value) );
259 metadata(
const UN_GraphData *graph_data, UN_NodeID node_id )
273 UN_UNDEFINED_PARM_TYPE_NAME.asRef());
276 static inline const UN_ParmIDList &
277 parms(
const UN_GraphData *graph_data, UN_NodeID node_id )
279 static UN_ParmIDList theEmpty;
280 return graph_data ? graph_data->
parms( node_id ) : theEmpty;
292 parmRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
294 const UN_ParmIDList &parm_ids = parms( graph_data, node_id );
301 static inline UN_ParmID
302 findParm(
const UN_GraphData *graph_data, UN_NodeID node_id,
306 ? graph_data->
parm( node_id, parm_name )
327 UN_UNDEFINED_PORT_TYPE_NAME.asRef(),
334 static inline UN_PortID
335 createInputPort(
UN_GraphData *graph_data, UN_NodeID node_id,
338 UN_UNDEFINED_PORT_TYPE_NAME.asRef(),
343 port_name, port_type_name, port_label,
index );
349 static inline UN_PortID
350 createOutputPort(
UN_GraphData *graph_data, UN_NodeID node_id,
353 UN_UNDEFINED_PORT_TYPE_NAME.asRef(),
358 port_name, port_type_name, port_label,
index );
363 static inline UN_PortID
364 findPort(
const UN_GraphData *graph_data, UN_NodeID node_id,
368 ? graph_data->
port( node_id, port_kind, port_name )
373 static inline UN_PortID
374 findInputPort(
const UN_GraphData *graph_data, UN_NodeID node_id,
381 static inline UN_PortID
382 findOutputPort(
const UN_GraphData *graph_data, UN_NodeID node_id,
391 static inline UN_PortID
392 findOrCreatePort(
UN_GraphData *graph_data, UN_NodeID node_id,
396 UN_UNDEFINED_PORT_TYPE_NAME.asRef(),
399 auto port = findPort( graph_data, node_id, port_kind, port_name );
402 port_kind, port_name, port_type_name, port_label );
408 static inline UN_PortID
409 findOrCreateInputPort(
UN_GraphData *graph_data, UN_NodeID node_id,
412 UN_UNDEFINED_PORT_TYPE_NAME.asRef(),
415 return findOrCreatePort( graph_data, node_id,
421 static inline UN_PortID
422 findOrCreateOutputPort(
UN_GraphData *graph_data, UN_NodeID node_id,
425 UN_UNDEFINED_PORT_TYPE_NAME.asRef(),
428 return findOrCreatePort( graph_data, node_id,
434 static inline const UN_PortIDList &
435 ports(
const UN_GraphData *graph_data, UN_NodeID node_id,
438 static UN_PortIDList theEmpty;
439 return graph_data ? graph_data->
ports( node_id, port_kind ) : theEmpty;
443 static inline const UN_PortIDList &
444 inputPorts(
const UN_GraphData *graph_data, UN_NodeID node_id )
450 static inline const UN_PortIDList &
451 outputPorts(
const UN_GraphData *graph_data, UN_NodeID node_id )
466 portRange(
const UN_GraphData *graph_data, UN_NodeID node_id,
469 const UN_PortIDList &port_ids = ports( graph_data, node_id, port_kind );
477 inputPortRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
484 outputPortRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
501 portReverseRange(
const UN_GraphData *graph_data, UN_NodeID node_id,
504 const UN_PortIDList &port_ids = ports( graph_data, node_id, port_kind );
513 inputPortReverseRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
521 outputPortReverseRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
534 inputPortNames(
const UN_GraphData *graph_data, UN_NodeID node_id )
541 outputPortNames(
const UN_GraphData *graph_data, UN_NodeID node_id )
554 inputPortTypeNames(
const UN_GraphData *graph_data, UN_NodeID node_id )
561 outputPortTypeNames(
const UN_GraphData *graph_data, UN_NodeID node_id )
588 isSubnet(
const UN_GraphData *graph_data, UN_NodeID node_id )
590 return graph_data && graph_data->
isSubnet( node_id );
601 static inline UN_NodeID
602 findChildNode(
const UN_GraphData *graph_data, UN_NodeID parent_id,
624 static inline UN_NodeID
625 findNode(
const UN_GraphData *graph_data, UN_NodeID parent_id,
629 ? graph_data->
findNode( parent_id, node_path )
640 static inline const UN_NodeIDList &
641 childNodes(
const UN_GraphData *graph_data, UN_NodeID parent_id )
643 static UN_NodeIDList theEmpty;
644 return graph_data ? graph_data->
childNodes( parent_id ) : theEmpty;
656 childNodeRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
658 const UN_NodeIDList &child_ids = childNodes( graph_data, node_id );
682 : myGraphData( graph_data )
684 pushChildren( node_id );
689 : myGraphData( graph_data )
697 return myNodeIDs.size() == other.myNodeIDs.size()
698 && myGraphData == other.myGraphData;
710 UN_NodeID node_id = popChild();
711 pushChildren( node_id );
719 return !myNodeIDs.isEmpty() ? myNodeIDs.last() : UN_NodeID();
731 void pushChildren( UN_NodeID parent_id )
736 myNodeIDs.concat( myGraphData->
childNodes( parent_id ));
744 if( !myNodeIDs.isEmpty() )
746 data_id = myNodeIDs.last();
747 myNodeIDs.removeLast();
759 UN_NodeIDList myNodeIDs;
768 descendantNodeRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
786 static inline const UN_WireIDList
787 inputSrcWires(
const UN_GraphData *graph_data, UN_NodeID node_id )
798 static inline const UN_WireIDList
799 outputSrcWires(
const UN_GraphData *graph_data, UN_NodeID node_id )
818 static inline const UN_WireIDList
819 inputDstWires(
const UN_GraphData *graph_data, UN_NodeID node_id )
827 static inline const UN_WireIDList
828 outputDstWires(
const UN_GraphData *graph_data, UN_NodeID node_id )
837 static inline const UN_WireIDList &
838 childWires(
const UN_GraphData *graph_data, UN_NodeID parent_id )
840 static UN_WireIDList theEmpty;
841 return graph_data ? graph_data->
childWires( parent_id ) : theEmpty;
851 childWireRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
853 const UN_WireIDList &child_ids = childWires( graph_data, node_id );
872 : myGraphData( graph_data )
874 myNodeIDs.append( node_id );
880 : myGraphData( graph_data )
896 return myWireIDs.size() == other.myWireIDs.size()
897 && myGraphData == other.myGraphData;
909 return !myWireIDs.isEmpty() ? myWireIDs.last() : UN_WireID();
922 if( !myWireIDs.isEmpty() )
923 myWireIDs.removeLast();
926 while( myWireIDs.isEmpty() && !myNodeIDs.isEmpty() )
928 auto next_node_id = myNodeIDs.last();
929 myNodeIDs.removeLast();
933 myNodeIDs.concat( myGraphData->
childNodes( next_node_id ));
934 myWireIDs.concat( myGraphData->
childWires( next_node_id ));
945 UN_WireIDList myWireIDs;
948 UN_NodeIDList myNodeIDs;
959 descendantWireRange(
const UN_GraphData *graph_data, UN_NodeID node_id )
975 static inline UN_StickyNoteID
976 findChildStickyNote(
const UN_GraphData *graph_data, UN_NodeID parent_id,
991 static inline const UN_StickyNoteIDList &
992 childStickyNotes(
const UN_GraphData *graph_data, UN_NodeID parent_id )
994 static UN_StickyNoteIDList theEmpty;
void setMetadata(UN_NodeID node_id, const UN_MetadataHolder &metadata)
Sets node's new metadata via copy-assignment.
void updateMetadata(UN_NodeID node_id, const OP &op)
UN_WireIDList::const_iterator ChildWireIterator
A range for traversing the wires contained directly inside a node.
const UT_StringHolder & signatureName(UN_NodeID node_id) const
Returns the node's signature.
const UT_Vector2D & position(UN_NodeID node_id) const
Returns the node's location in the graph editor.
static const auto theDefPos
void setNodeSignature(UN_NodeID node_id, const UT_StringRef &signature_name)
Sets the signature for the given node.
UN_API UN_OptionsPtr asOptions(const UN_GraphData *graph_data, UN_NodeID node_id)
DescendantNodeIterator(const UN_GraphData *graph_data, UN_NodeID node_id)
Constructor for the start iterator of the given node ancestral tree.
UN_API void deleteChildStickyNote(UN_GraphData *graph_data, UN_NodeID parent_id, const UT_StringRef &child_sticky_note_name)
bool operator!=(const DescendantWireIterator &other) const
Comparison operators.
const UT_StringHolder & categoryName(UN_NodeID node_id) const
GLsizei const GLfloat * value
const UN_GraphData * graph() const
Returns the underlying graph in which the current node exists.
void setPosition(UN_NodeID node_id, const UT_Vector2D &position)
Sets the node's location in the graph editor.
UN_MetadataHolder stealMetadata(UN_NodeID node_id)
Returns node's metadata moved from the data buffer entry.
static const UN_MetadataHolder theDefMetadata
static const auto theDefColor
UN_ParmID parm(UN_NodeID node, const UT_StringRef &parm_name) const
Returns the parameter of a given name on a given node.
UT_IteratorRange< ChildWireIterator > ChildWireRange
std::optional< T > UT_Optional
UN_NodeID operator*() const
Returns the ID of the current node.
UN_API UT_Array< UT_StringHolder > childNodeNames(const UN_GraphData *graph_data, UN_NodeID node_id)
Returns the names of the children nodes of the given parent node.
UN_API void setFromOptions(UN_GraphData *graph_data, UN_NodeID node_id, const UN_Options &node_opts)
Load and set the node based on the given options.
const UN_WireIDList & childWires(UN_NodeID parent) const
Returns a list of wires directly inside the given node (subnet).
UT_IteratorRange< DescendantNodeIterator > DescendantNodeRange
A range for traversing the descendant nodes of a given ancestor node.
UT_IteratorRange< DescendantWireIterator > DescendantWireRange
UN_API bool isAnyOutputPortConnectedToDst(const UN_GraphData *graph_data, UN_NodeID node_id)
bool isValid(UN_NodeID node) const
bool operator==(const DescendantWireIterator &other) const
Comparison operators.
UN_API UN_PortID createPort(UN_GraphData *graph_data, UN_NodeID node_id, UN_PortKind port_kind, const UT_StringRef &port_name, const UT_StringRef &port_type_name=UN_UNDEFINED_PORT_TYPE_NAME.asRef(), const UT_StringRef &port_label=UT_StringRef(), const UT_Optional< exint > &index=std::nullopt)
UN_ParmIDList::const_iterator ParmIterator
UN_NodeData & nodeData()
Returns the container of data for the nodes in the graph.
DescendantNodeIterator(const UN_GraphData *graph_data)
Constructor for the end iterator.
UN_API UT_StringHolder path(const UN_GraphData *graph_data, UN_NodeID node_id)
Returns the node path.
UN_API UN_NodeID createChildNode(UN_GraphData *graph_data, UN_NodeID parent_id, const UT_StringRef &child_name=UT_StringRef(), const UT_StringRef &child_type=UT_StringRef(), const UT_StringRef &child_category=UT_StringRef())
Creates and returns a new node that is a child of this node.
static const UT_StringHolder theDefComment
static const UT_StringHolder theEmptyString
constexpr std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size(){return subtype_count< typename std::tuple_element< I, T >::type >::value+tuple_type_size< T, I+1 >);}template< typename T > struct type_count< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size< T, 0 >)};};template< typename T > struct subtype_count{static constexpr int value{is_mutable_container< T >::value?expected_max_vector_size:type_count< T >::value};};template< typename T, typename Enable=void > struct type_count_min{static const int value{0};};template< typename T >struct type_count_min< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_tuple_like< T >::value &&!is_wrapper< T >::value &&!is_complex< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{type_count< T >::value};};template< typename T > struct type_count_min< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr int value{1};};template< typename T >struct type_count_min< T, typename std::enable_if< is_wrapper< T >::value &&!is_complex< T >::value &&!is_tuple_like< T >::value >::type >{static constexpr int value{subtype_count_min< typename T::value_type >::value};};template< typename T, std::size_t I >constexpr typename std::enable_if< I==type_count_base< T >::value, int >::type tuple_type_size_min(){return 0;}template< typename T, std::size_t I > constexpr typename std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size_min(){return subtype_count_min< typename std::tuple_element< I, T >::type >::value+tuple_type_size_min< T, I+1 >);}template< typename T > struct type_count_min< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size_min< T, 0 >)};};template< typename T > struct subtype_count_min{static constexpr int value{is_mutable_container< T >::value?((type_count< T >::value< expected_max_vector_size)?type_count< T >::value:0):type_count_min< T >::value};};template< typename T, typename Enable=void > struct expected_count{static const int value{0};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_wrapper< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{1};};template< typename T > struct expected_count< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr int value{expected_max_vector_size};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&is_wrapper< T >::value >::type >{static constexpr int value{expected_count< typename T::value_type >::value};};enum class object_category:int{char_value=1, integral_value=2, unsigned_integral=4, enumeration=6, boolean_value=8, floating_point=10, number_constructible=12, double_constructible=14, integer_constructible=16, string_assignable=23, string_constructible=24, other=45, wrapper_value=50, complex_number=60, tuple_value=70, container_value=80,};template< typename T, typename Enable=void > struct classify_object{static constexpr object_category value{object_category::other};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&!std::is_same< T, char >::value &&std::is_signed< T >::value &&!is_bool< T >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::integral_value};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&std::is_unsigned< T >::value &&!std::is_same< T, char >::value &&!is_bool< T >::value >::type >{static constexpr object_category value{object_category::unsigned_integral};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_same< T, char >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::char_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_bool< T >::value >::type >{static constexpr object_category value{object_category::boolean_value};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_floating_point< T >::value >::type >{static constexpr object_category value{object_category::floating_point};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&std::is_assignable< T &, std::string >::value >::type >{static constexpr object_category value{object_category::string_assignable};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&(type_count< T >::value==1)&&std::is_constructible< T, std::string >::value >::type >{static constexpr object_category value{object_category::string_constructible};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::enumeration};};template< typename T > struct classify_object< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr object_category value{object_category::complex_number};};template< typename T > struct uncommon_type{using type=typename std::conditional<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&!std::is_constructible< T, std::string >::value &&!is_complex< T >::value &&!is_mutable_container< T >::value &&!std::is_enum< T >::value, std::true_type, std::false_type >::type;static constexpr bool value=type::value;};template< typename T >struct classify_object< T, typename std::enable_if<(!is_mutable_container< T >::value &&is_wrapper< T >::value &&!is_tuple_like< T >::value &&uncommon_type< T >::value)>::type >{static constexpr object_category value{object_category::wrapper_value};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::number_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&!is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::integer_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::double_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< is_tuple_like< T >::value &&((type_count< T >::value >=2 &&!is_wrapper< T >::value)||(uncommon_type< T >::value &&!is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value)||(uncommon_type< T >::value &&type_count< T >::value >=2))>::type >{static constexpr object_category value{object_category::tuple_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr object_category value{object_category::container_value};};template< typename T, enable_if_t< classify_object< T >::value==object_category::char_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"CHAR";}template< typename T, enable_if_t< classify_object< T >::value==object_category::integral_value||classify_object< T >::value==object_category::integer_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"INT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::unsigned_integral, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"UINT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::floating_point||classify_object< T >::value==object_category::number_constructible||classify_object< T >::value==object_category::double_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"FLOAT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::enumeration, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"ENUM";}template< typename T, enable_if_t< classify_object< T >::value==object_category::boolean_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"BOOLEAN";}template< typename T, enable_if_t< classify_object< T >::value==object_category::complex_number, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"COMPLEX";}template< typename T, enable_if_t< classify_object< T >::value >=object_category::string_assignable &&classify_object< T >::value<=object_category::other, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"TEXT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::container_value||classify_object< T >::value==object_category::wrapper_value, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value==1, detail::enabler >=detail::dummy >inline std::string type_name(){return type_name< typename std::decay< typename std::tuple_element< 0, T >::type >::type >);}template< typename T, std::size_t I >inline typename std::enable_if< I==type_count_base< T >::value, std::string >::type tuple_name(){return std::string{};}template< typename T, std::size_t I >inline typename std::enable_if<(I< type_count_base< T >::value), std::string >::type tuple_name(){auto str=std::string{type_name< typename std::decay< typename std::tuple_element< I, T >::type >::type >)}+ ','+tuple_name< T, I+1 >);if(str.back()== ',') str.pop_back();return str;}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler > > std::string type_name()
Recursively generate the tuple type name.
UN_API UT_Array< UT_StringHolder > parmTypeNames(const UN_GraphData *graph_data, UN_NodeID node_id)
Returns the type names of the node parameters.
DescendantWireIterator(const UN_GraphData *graph_data, UN_NodeID node_id)
Constructor for the start and end iterator for node's wires.
void setTypeName(UN_NodeID node_id, const UT_StringRef &type_name)
Sets the node's type that determines its functional behavour.
UNI_PortKind
Specifies the port kind, ie, wheter it is an input or an output port.
UT_IteratorRange< PortReverseIterator > PortReverseRange
void setNodeName(UN_NodeID node_id, const UT_StringRef &name)
Sets the name of the given node.
UN_API UT_Array< UT_StringHolder > parmNames(const UN_GraphData *graph_data, UN_NodeID node_id)
Returns the names of the node parameters.
UN_API UT_Array< UT_StringHolder > portTypeNames(const UN_GraphData *graph_data, UN_NodeID node_id, UN_PortKind port_kind)
Returns the type names of the node ports of a given kind.
GLuint const GLchar * name
UN_PortID port(UN_NodeID node, UN_PortKind kind, const UT_StringRef &port_name) const
Returns the port of a given kind on a given node.
UN_StickyNoteID findChildStickyNote(UN_NodeID parent, const UT_StringRef &child_name) const
Returns a node ID of a child in a given subnet given its name.
const UN_PortIDList & ports(UN_NodeID node, UN_PortKind kind) const
Returns the ports of the given kind for the given node.
UT_OptionsHolder UN_MetadataHolder
void updateTags(UN_NodeID node_id, const OP &op)
UN_NodeID findNode(UN_NodeID current_node, const UT_StringRef &node_path) const
UT_StringArray stealTags(UN_NodeID node_id)
Returns node tags moved from the data buffer entry.
UT_IteratorRange< PortIterator > PortRange
UN_NodeID findChildNode(UN_NodeID parent, const UT_StringRef &child_name) const
Returns a node ID of a child in a given subnet given its name.
DescendantWireIterator(const UN_GraphData *graph_data)
Constructor for the end iterator.
const UN_StickyNoteIDList & childStickyNotes(UN_NodeID parent) const
Returns a list of direct children of the given node (subnet).
bool isSubnet(UN_NodeID node) const
Returns true if the given node is a subnet (ie, can have children).
const UN_NodeIDList & childNodes(UN_NodeID parent) const
Returns a list of direct children of the given node (subnet).
A map of string to various well defined value types.
const UT_StringHolder & name(UN_NodeID node_id) const
Returns the name that identifies the node among its siblings.
std::input_iterator_tag iterator_category
std::ptrdiff_t difference_type
UN_API bool isAnyInputPortConnectedToSrc(const UN_GraphData *graph_data, UN_NodeID node_id)
UT_IteratorRange< ParmIterator > ParmRange
DescendantWireIterator & operator++()
Increment operator.
UN_WireID operator*() const
Returns the ID of the current wire.
UN_API void deleteChildNode(UN_GraphData *graph_data, UN_NodeID parent_id, const UT_StringRef &child_name)
Deletes the child node from the graph (removing it from this network).
const UN_MetadataHolder & metadata(UN_NodeID node_id) const
Returns nodes's metadata.
UT_IteratorRange< ChildNodeIterator > ChildNodeRange
UN_API UT_StringHolder findValidUniqueChildNodeName(const UN_GraphData *graph_data, UN_NodeID node_id, const UT_StringRef &child_name=UT_StringRef())
const UN_ParmIDList & parms(UN_NodeID node) const
Returns the parameters of the given node.
void setColor(UN_NodeID node_id, const UT_Color &color)
Sets the node's color in the graph editor.
UN_PortIDList::const_reverse_iterator PortReverseIterator
std::input_iterator_tag iterator_category
UN_API UN_StickyNoteID createChildStickyNote(UN_GraphData *graph_data, UN_NodeID parent_id, const UT_StringRef &sticky_note_name=UT_StringRef(), const UT_StringRef &sticky_note_text=UT_StringRef())
Creates and returns a new sticky note that is a child of this node.
UN_NodeIDList::const_iterator ChildNodeIterator
An iterator and a range for iterating over child node IDs.
void deleteNode(UN_NodeID node)
Deletes the node given its index.
const UT_StringHolder & typeName(UN_NodeID node_id) const
Returns the name of node's type that determines its functional behavour.
void setComment(UN_NodeID node_id, const UT_StringRef &comment)
Sets the node's comment.
UN_PortIDList::const_iterator PortIterator
An iterator and a range for iterating over node port IDs.
std::ptrdiff_t difference_type
UN_API UN_WireIDList srcWires(const UN_GraphData *graph_data, UN_NodeID node_id, UN_PortKind port_kind)
DescendantNodeIterator & operator++()
Increment operator.
static const UT_StringArray theDefTags
const UT_Color & color(UN_NodeID node_id) const
Returns the node's color in the graph editor.
const UT_StringArray & tags(UN_NodeID node_id) const
Returns node tags.
const UT_StringHolder & comment(UN_NodeID node_id) const
Returns the node's comment.
An iterator for traversing the wires deep inside the given node.
const UN_GraphData * graph() const
Returns the underlying graph in which the current node exists.
UN_API UN_WireIDList dstWires(const UN_GraphData *graph_data, UN_NodeID node_id, UN_PortKind port_kind)
bool operator==(const DescendantNodeIterator &other) const
Comparison operators.
UT_UniquePtr< UT_OptionEntry > UT_OptionEntryPtr
UN_API UT_Array< UT_StringHolder > portNames(const UN_GraphData *graph_data, UN_NodeID node_id, UN_PortKind port_kind)
Returns the names of the node ports of a given kind.
void setTags(UN_NodeID node_id, const UT_StringArray &tags)
Sets new tags on a node via copy-assignment.
UT_UniquePtr< UN_Options > UN_OptionsPtr
UN_API UN_ParmID createParm(UN_GraphData *graph_data, UN_NodeID node_id, const UT_StringRef &parm_name, const UT_StringRef &parm_type_name=UN_UNDEFINED_PARM_TYPE_NAME.asRef())
bool operator!=(const DescendantNodeIterator &other) const
Comparison operators.
static const UT_StringHolder theDefSignatureName