@@ -7,42 +7,62 @@ use freya_common::{
77 ParagraphElements ,
88} ;
99use freya_native_core:: {
10- dioxus:: DioxusNativeCoreMutationWriter ,
11- prelude:: NodeImmutable ,
10+ prelude:: {
11+ DioxusState ,
12+ NodeImmutable ,
13+ } ,
1214 tree:: TreeRef ,
1315 NodeId ,
1416} ;
1517use freya_node_state:: {
1618 CursorState ,
17- CustomAttributeValues ,
1819 LayerState ,
1920} ;
21+ use rustc_hash:: FxHashMap ;
2022use torin:: torin:: Torin ;
2123
22- use crate :: prelude:: DioxusDOMAdapter ;
24+ use crate :: prelude:: {
25+ DioxusDOM ,
26+ DioxusDOMAdapter ,
27+ DioxusDOMAdapterCache ,
28+ } ;
29+
30+ macro_rules! create_mutation_writer {
31+ ( $self: ident) => {
32+ $self
33+ . dioxus_integration_state
34+ . create_mutation_writer( & mut $self. rdom)
35+ } ;
36+ }
2337
2438pub struct MutationsWriter < ' a > {
25- pub native_writer : DioxusNativeCoreMutationWriter < ' a , CustomAttributeValues > ,
39+ pub dioxus_integration_state : & ' a mut DioxusState ,
2640 pub layout : & ' a mut Torin < NodeId > ,
2741 pub layers : & ' a Layers ,
2842 pub paragraphs : & ' a ParagraphElements ,
43+ pub dioxus_dom_adapter_cache : & ' a mut FxHashMap < NodeId , bool > ,
2944 pub scale_factor : f32 ,
45+ pub rdom : & ' a mut DioxusDOM ,
3046}
3147
3248impl < ' a > MutationsWriter < ' a > {
3349 pub fn remove ( & mut self , id : ElementId ) {
34- let node_id = self . native_writer . state . element_to_node_id ( id) ;
35- let mut dom_adapter =
36- DioxusDOMAdapter :: new_with_cache ( self . native_writer . rdom , self . scale_factor ) ;
50+ let node_id = self . dioxus_integration_state . element_to_node_id ( id) ;
51+
52+ let mut dom_adapter = DioxusDOMAdapter :: new_with_cache (
53+ self . rdom ,
54+ self . scale_factor ,
55+ DioxusDOMAdapterCache :: Controlled ( self . dioxus_dom_adapter_cache ) ,
56+ ) ;
3757
3858 // Remove from layout
3959 self . layout . remove ( node_id, & mut dom_adapter, true ) ;
4060
4161 // Remove from layers and paragraph elements
4262 let mut stack = vec ! [ node_id] ;
43- let tree = self . native_writer . rdom . tree_ref ( ) ;
63+ let tree = self . rdom . tree_ref ( ) ;
4464 while let Some ( node_id) = stack. pop ( ) {
45- if let Some ( node) = self . native_writer . rdom . get ( node_id) {
65+ if let Some ( node) = self . rdom . get ( node_id) {
4666 if !node. node_type ( ) . is_visible_element ( ) {
4767 continue ;
4868 }
@@ -75,51 +95,63 @@ impl<'a> MutationsWriter<'a> {
7595
7696impl < ' a > WriteMutations for MutationsWriter < ' a > {
7797 fn register_template ( & mut self , template : dioxus_core:: prelude:: Template ) {
78- self . native_writer . register_template ( template) ;
98+ let mut native_writer = create_mutation_writer ! ( self ) ;
99+ native_writer. register_template ( template) ;
79100 }
80101
81102 fn append_children ( & mut self , id : dioxus_core:: ElementId , m : usize ) {
82- self . native_writer . append_children ( id, m) ;
103+ let mut native_writer = create_mutation_writer ! ( self ) ;
104+ native_writer. append_children ( id, m) ;
83105 }
84106
85107 fn assign_node_id ( & mut self , path : & ' static [ u8 ] , id : dioxus_core:: ElementId ) {
86- self . native_writer . assign_node_id ( path, id) ;
108+ let mut native_writer = create_mutation_writer ! ( self ) ;
109+ native_writer. assign_node_id ( path, id) ;
87110 }
88111
89112 fn create_placeholder ( & mut self , id : dioxus_core:: ElementId ) {
90- self . native_writer . create_placeholder ( id) ;
113+ let mut native_writer = create_mutation_writer ! ( self ) ;
114+ native_writer. create_placeholder ( id) ;
91115 }
92116
93117 fn create_text_node ( & mut self , value : & str , id : dioxus_core:: ElementId ) {
94- self . native_writer . create_text_node ( value, id) ;
118+ let mut native_writer = create_mutation_writer ! ( self ) ;
119+ native_writer. create_text_node ( value, id) ;
95120 }
96121
97122 fn hydrate_text_node ( & mut self , path : & ' static [ u8 ] , value : & str , id : dioxus_core:: ElementId ) {
98- self . native_writer . hydrate_text_node ( path, value, id) ;
123+ let mut native_writer = create_mutation_writer ! ( self ) ;
124+ native_writer. hydrate_text_node ( path, value, id) ;
99125 }
100126
101127 fn load_template ( & mut self , name : & ' static str , index : usize , id : dioxus_core:: ElementId ) {
102- self . native_writer . load_template ( name, index, id) ;
128+ let mut native_writer = create_mutation_writer ! ( self ) ;
129+ native_writer. load_template ( name, index, id) ;
103130 }
104131
105132 fn replace_node_with ( & mut self , id : dioxus_core:: ElementId , m : usize ) {
106133 if m > 0 {
107134 self . remove ( id) ;
108135 }
109136
110- self . native_writer . replace_node_with ( id, m) ;
137+ let mut native_writer = create_mutation_writer ! ( self ) ;
138+
139+ native_writer. replace_node_with ( id, m) ;
111140 }
112141
113142 fn replace_placeholder_with_nodes ( & mut self , path : & ' static [ u8 ] , m : usize ) {
114- self . native_writer . replace_placeholder_with_nodes ( path, m) ;
143+ let mut native_writer = create_mutation_writer ! ( self ) ;
144+ native_writer. replace_placeholder_with_nodes ( path, m) ;
115145 }
116146
117147 fn insert_nodes_after ( & mut self , id : dioxus_core:: ElementId , m : usize ) {
118- self . native_writer . insert_nodes_after ( id, m) ;
148+ let mut native_writer = create_mutation_writer ! ( self ) ;
149+ native_writer. insert_nodes_after ( id, m) ;
119150 }
120151
121152 fn insert_nodes_before ( & mut self , id : dioxus_core:: ElementId , m : usize ) {
122- self . native_writer . insert_nodes_before ( id, m) ;
153+ let mut native_writer = create_mutation_writer ! ( self ) ;
154+ native_writer. insert_nodes_before ( id, m) ;
123155 }
124156
125157 fn set_attribute (
@@ -129,29 +161,33 @@ impl<'a> WriteMutations for MutationsWriter<'a> {
129161 value : & dioxus_core:: AttributeValue ,
130162 id : dioxus_core:: ElementId ,
131163 ) {
132- self . native_writer . set_attribute ( name, ns, value, id) ;
164+ let mut native_writer = create_mutation_writer ! ( self ) ;
165+ native_writer. set_attribute ( name, ns, value, id) ;
133166 }
134167
135168 fn set_node_text ( & mut self , value : & str , id : dioxus_core:: ElementId ) {
136- self . layout
137- . invalidate ( self . native_writer . state . element_to_node_id ( id) ) ;
138- self . native_writer . set_node_text ( value, id) ;
169+ let mut native_writer = create_mutation_writer ! ( self ) ;
170+ native_writer. set_node_text ( value, id) ;
139171 }
140172
141173 fn create_event_listener ( & mut self , name : & ' static str , id : dioxus_core:: ElementId ) {
142- self . native_writer . create_event_listener ( name, id) ;
174+ let mut native_writer = create_mutation_writer ! ( self ) ;
175+ native_writer. create_event_listener ( name, id) ;
143176 }
144177
145178 fn remove_event_listener ( & mut self , name : & ' static str , id : dioxus_core:: ElementId ) {
146- self . native_writer . remove_event_listener ( name, id) ;
179+ let mut native_writer = create_mutation_writer ! ( self ) ;
180+ native_writer. remove_event_listener ( name, id) ;
147181 }
148182
149183 fn remove_node ( & mut self , id : dioxus_core:: ElementId ) {
150184 self . remove ( id) ;
151- self . native_writer . remove_node ( id) ;
185+ let mut native_writer = create_mutation_writer ! ( self ) ;
186+ native_writer. remove_node ( id) ;
152187 }
153188
154189 fn push_root ( & mut self , id : dioxus_core:: ElementId ) {
155- self . native_writer . push_root ( id) ;
190+ let mut native_writer = create_mutation_writer ! ( self ) ;
191+ native_writer. push_root ( id) ;
156192 }
157193}
0 commit comments