@@ -492,7 +492,8 @@ def add_node(
492492
493493 node_id = self .rx_graph .add_node (attrs )
494494 self ._time_to_nodes .setdefault (attrs ["t" ], []).append (node_id )
495- self .node_added .emit_fast (node_id )
495+ if is_signal_on (self .node_added ):
496+ self .node_added .emit (node_id , attrs )
496497 return node_id
497498
498499 def bulk_add_nodes (self , nodes : list [dict [str , Any ]], indices : list [int ] | None = None ) -> list [int ]:
@@ -523,8 +524,8 @@ def bulk_add_nodes(self, nodes: list[dict[str, Any]], indices: list[int] | None
523524
524525 # checking if it has connections to reduce overhead
525526 if is_signal_on (self .node_added ):
526- for node_id in node_indices :
527- self .node_added .emit_fast (node_id )
527+ for node_id , node_attrs in zip ( node_indices , nodes , strict = True ) :
528+ self .node_added .emit (node_id , node_attrs )
528529
529530 return node_indices
530531
@@ -548,7 +549,9 @@ def remove_node(self, node_id: int) -> None:
548549 if node_id not in self .rx_graph .node_indices ():
549550 raise ValueError (f"Node { node_id } does not exist in the graph." )
550551
551- self .node_removed .emit_fast (node_id )
552+ old_attrs = None
553+ if is_signal_on (self .node_removed ):
554+ old_attrs = dict (self .rx_graph [node_id ])
552555
553556 # Get the time value before removing the node
554557 t = self .rx_graph [node_id ]["t" ]
@@ -566,6 +569,9 @@ def remove_node(self, node_id: int) -> None:
566569 if self ._overlaps is not None :
567570 self ._overlaps = [overlap for overlap in self ._overlaps if node_id != overlap [0 ] and node_id != overlap [1 ]]
568571
572+ if is_signal_on (self .node_removed ):
573+ self .node_removed .emit (node_id , old_attrs )
574+
569575 def add_edge (
570576 self ,
571577 source_id : int ,
@@ -1217,6 +1223,9 @@ def update_node_attrs(
12171223 if node_ids is None :
12181224 node_ids = self .node_ids ()
12191225
1226+ if is_signal_on (self .node_updated ):
1227+ old_attrs_by_id = {node_id : dict (self ._graph [node_id ]) for node_id in node_ids }
1228+
12201229 for key , value in attrs .items ():
12211230 if key not in self .node_attr_keys ():
12221231 raise ValueError (f"Node attribute key '{ key } ' not found in graph. Expected '{ self .node_attr_keys ()} '" )
@@ -1231,6 +1240,10 @@ def update_node_attrs(
12311240 for node_id , v in zip (node_ids , value , strict = False ):
12321241 self ._graph [node_id ][key ] = v
12331242
1243+ if is_signal_on (self .node_updated ):
1244+ for node_id in node_ids :
1245+ self .node_updated .emit (node_id , old_attrs_by_id [node_id ], dict (self ._graph [node_id ]))
1246+
12341247 def update_edge_attrs (
12351248 self ,
12361249 * ,
@@ -1616,7 +1629,8 @@ def add_node(
16161629 self ._next_external_id = max (self ._next_external_id , index + 1 )
16171630 # Add mapping using mixin
16181631 self ._add_id_mapping (node_id , index )
1619- self .node_added .emit_fast (index )
1632+ if is_signal_on (self .node_added ):
1633+ self .node_added .emit (index , attrs )
16201634 return index
16211635
16221636 def bulk_add_nodes (
@@ -1662,8 +1676,8 @@ def bulk_add_nodes(
16621676 self ._add_id_mappings (list (zip (graph_ids , indices , strict = True )))
16631677
16641678 if is_signal_on (self .node_added ):
1665- for index in indices :
1666- self .node_added .emit_fast (index )
1679+ for index , node_attrs in zip ( indices , nodes , strict = True ) :
1680+ self .node_added .emit (index , node_attrs )
16671681
16681682 return indices
16691683
@@ -1941,8 +1955,25 @@ def update_node_attrs(
19411955 node_ids : Sequence[int] | None
19421956 The node ids to update.
19431957 """
1944- node_ids = self ._get_local_ids () if node_ids is None else self ._map_to_local (node_ids )
1945- super ().update_node_attrs (attrs = attrs , node_ids = node_ids )
1958+ external_node_ids = self .node_ids () if node_ids is None else node_ids
1959+ local_node_ids = self ._map_to_local (external_node_ids )
1960+
1961+ if is_signal_on (self .node_updated ):
1962+ old_attrs_by_id = {
1963+ external_node_id : dict (self ._graph [local_node_id ])
1964+ for external_node_id , local_node_id in zip (external_node_ids , local_node_ids , strict = True )
1965+ }
1966+
1967+ with self .node_updated .blocked ():
1968+ super ().update_node_attrs (attrs = attrs , node_ids = local_node_ids )
1969+
1970+ if is_signal_on (self .node_updated ) and old_attrs_by_id is not None :
1971+ for external_node_id , local_node_id in zip (external_node_ids , local_node_ids , strict = True ):
1972+ self .node_updated .emit (
1973+ external_node_id ,
1974+ old_attrs_by_id [external_node_id ],
1975+ dict (self ._graph [local_node_id ]),
1976+ )
19461977
19471978 def remove_node (self , node_id : int ) -> None :
19481979 """
@@ -1963,11 +1994,15 @@ def remove_node(self, node_id: int) -> None:
19631994
19641995 local_node_id = self ._map_to_local (node_id )
19651996
1966- self .node_removed .emit_fast (node_id )
1997+ if is_signal_on (self .node_removed ):
1998+ old_attrs = dict (self ._graph [local_node_id ])
1999+
19672000 with self .node_removed .blocked ():
19682001 super ().remove_node (local_node_id )
19692002
19702003 self ._remove_id_mapping (external_id = node_id )
2004+ if is_signal_on (self .node_removed ):
2005+ self .node_removed .emit (node_id , old_attrs )
19712006
19722007 def filter (
19732008 self ,
0 commit comments