1
- use std:: collections:: { HashMap , HashSet } ;
1
+ use std:: collections:: HashSet ;
2
2
3
3
use egui:: {
4
4
collapsing_header:: { paint_default_icon, CollapsingState } ,
@@ -41,30 +41,32 @@ impl<'a, T: ToJsonTreeValue> JsonTreeNode<'a, T> {
41
41
) -> JsonTreeResponse {
42
42
let persistent_id = ui. id ( ) ;
43
43
let tree_id = self . id ;
44
- let make_persistent_id = |path_segments : & Vec < JsonPointerSegment > | {
45
- persistent_id. with ( tree_id. with ( path_segments) )
46
- } ;
44
+ let make_persistent_id =
45
+ |path_segments : & [ JsonPointerSegment ] | persistent_id. with ( tree_id. with ( path_segments) ) ;
47
46
48
47
let style = config. style . unwrap_or_default ( ) ;
49
48
let default_expand = config. default_expand . unwrap_or_default ( ) ;
50
49
51
- let mut path_id_map = HashMap :: new ( ) ;
50
+ let mut reset_path_ids = HashSet :: new ( ) ;
52
51
53
52
let ( default_expand, search_term) = match default_expand {
54
53
DefaultExpand :: All => ( InnerExpand :: All , None ) ,
55
54
DefaultExpand :: None => ( InnerExpand :: None , None ) ,
56
55
DefaultExpand :: ToLevel ( l) => ( InnerExpand :: ToLevel ( l) , None ) ,
57
56
DefaultExpand :: SearchResults ( search_str) => {
58
- // If searching, the entire path_id_map must be populated.
59
- populate_path_id_map ( self . value , & mut path_id_map, & make_persistent_id) ;
60
57
let search_term = SearchTerm :: parse ( search_str) ;
61
- let paths = search_term
58
+ let search_match_path_ids = search_term
62
59
. as_ref ( )
63
60
. map ( |search_term| {
64
- search_term. find_matching_paths_in ( self . value , style. abbreviate_root )
61
+ search_term. find_matching_paths_in (
62
+ self . value ,
63
+ style. abbreviate_root ,
64
+ & make_persistent_id,
65
+ & mut reset_path_ids,
66
+ )
65
67
} )
66
68
. unwrap_or_default ( ) ;
67
- ( InnerExpand :: Paths ( paths ) , search_term)
69
+ ( InnerExpand :: Paths ( search_match_path_ids ) , search_term)
68
70
}
69
71
} ;
70
72
@@ -85,25 +87,25 @@ impl<'a, T: ToJsonTreeValue> JsonTreeNode<'a, T> {
85
87
self . show_impl (
86
88
ui,
87
89
& mut vec ! [ ] ,
88
- & mut path_id_map ,
90
+ & mut reset_path_ids ,
89
91
& make_persistent_id,
90
92
& node_config,
91
93
& mut renderer,
92
94
) ;
93
95
} ) ;
94
96
95
97
JsonTreeResponse {
96
- collapsing_state_ids : path_id_map . into_values ( ) . collect ( ) ,
98
+ collapsing_state_ids : reset_path_ids ,
97
99
}
98
100
}
99
101
100
102
fn show_impl < ' b > (
101
103
self ,
102
104
ui : & mut Ui ,
103
105
path_segments : & ' b mut Vec < JsonPointerSegment < ' a > > ,
104
- path_id_map : & ' b mut PathIdMap < ' a > ,
105
- make_persistent_id : & ' b dyn Fn ( & Vec < JsonPointerSegment > ) -> Id ,
106
- config : & ' b JsonTreeNodeConfig < ' a > ,
106
+ reset_path_ids : & ' b mut HashSet < Id > ,
107
+ make_persistent_id : & ' b dyn Fn ( & [ JsonPointerSegment ] ) -> Id ,
108
+ config : & ' b JsonTreeNodeConfig ,
107
109
renderer : & ' b mut JsonTreeRenderer < ' a , T > ,
108
110
) {
109
111
match self . value . to_json_tree_value ( ) {
@@ -155,7 +157,7 @@ impl<'a, T: ToJsonTreeValue> JsonTreeNode<'a, T> {
155
157
show_expandable (
156
158
ui,
157
159
path_segments,
158
- path_id_map ,
160
+ reset_path_ids ,
159
161
expandable,
160
162
& make_persistent_id,
161
163
config,
@@ -169,10 +171,10 @@ impl<'a, T: ToJsonTreeValue> JsonTreeNode<'a, T> {
169
171
fn show_expandable < ' a , ' b , T : ToJsonTreeValue > (
170
172
ui : & mut Ui ,
171
173
path_segments : & ' b mut Vec < JsonPointerSegment < ' a > > ,
172
- path_id_map : & ' b mut PathIdMap < ' a > ,
174
+ reset_path_ids : & ' b mut HashSet < Id > ,
173
175
expandable : Expandable < ' a , T > ,
174
- make_persistent_id : & ' b dyn Fn ( & Vec < JsonPointerSegment > ) -> Id ,
175
- config : & ' b JsonTreeNodeConfig < ' a > ,
176
+ make_persistent_id : & ' b dyn Fn ( & [ JsonPointerSegment ] ) -> Id ,
177
+ config : & ' b JsonTreeNodeConfig ,
176
178
renderer : & ' b mut JsonTreeRenderer < ' a , T > ,
177
179
) {
178
180
let JsonTreeNodeConfig {
@@ -186,18 +188,17 @@ fn show_expandable<'a, 'b, T: ToJsonTreeValue>(
186
188
ExpandableType :: Object => & OBJECT_DELIMITERS ,
187
189
} ;
188
190
191
+ let path_id = make_persistent_id ( path_segments) ;
192
+ reset_path_ids. insert ( path_id) ;
193
+
189
194
let default_open = match & default_expand {
190
195
InnerExpand :: All => true ,
191
196
InnerExpand :: None => false ,
192
197
InnerExpand :: ToLevel ( num_levels_open) => ( path_segments. len ( ) as u8 ) <= * num_levels_open,
193
- InnerExpand :: Paths ( paths ) => paths . contains ( path_segments ) ,
198
+ InnerExpand :: Paths ( search_match_path_ids ) => search_match_path_ids . contains ( & path_id ) ,
194
199
} ;
195
200
196
- let id_source = * path_id_map
197
- . entry ( path_segments. to_vec ( ) )
198
- . or_insert_with ( || make_persistent_id ( path_segments) ) ;
199
-
200
- let mut state = CollapsingState :: load_with_default_open ( ui. ctx ( ) , id_source, default_open) ;
201
+ let mut state = CollapsingState :: load_with_default_open ( ui. ctx ( ) , path_id, default_open) ;
201
202
let is_expanded = state. is_open ( ) ;
202
203
203
204
let header_res = ui. horizontal_wrapped ( |ui| {
@@ -402,7 +403,7 @@ fn show_expandable<'a, 'b, T: ToJsonTreeValue>(
402
403
nested_tree. show_impl (
403
404
ui,
404
405
path_segments,
405
- path_id_map ,
406
+ reset_path_ids ,
406
407
make_persistent_id,
407
408
config,
408
409
renderer,
@@ -420,7 +421,7 @@ fn show_expandable<'a, 'b, T: ToJsonTreeValue>(
420
421
ui. spacing_mut ( ) . indent /= 2.0 ;
421
422
}
422
423
423
- ui. indent ( id_source , add_nested_tree) ;
424
+ ui. indent ( path_id , add_nested_tree) ;
424
425
} ) ;
425
426
}
426
427
@@ -447,18 +448,18 @@ fn show_expandable<'a, 'b, T: ToJsonTreeValue>(
447
448
}
448
449
}
449
450
450
- struct JsonTreeNodeConfig < ' a > {
451
- default_expand : InnerExpand < ' a > ,
451
+ struct JsonTreeNodeConfig {
452
+ default_expand : InnerExpand ,
452
453
style : JsonTreeStyle ,
453
454
search_term : Option < SearchTerm > ,
454
455
}
455
456
456
457
#[ derive( Debug , Clone ) ]
457
- enum InnerExpand < ' a > {
458
+ enum InnerExpand {
458
459
All ,
459
460
None ,
460
461
ToLevel ( u8 ) ,
461
- Paths ( HashSet < Vec < JsonPointerSegment < ' a > > > ) ,
462
+ Paths ( HashSet < Id > ) ,
462
463
}
463
464
464
465
struct Expandable < ' a , T : ToJsonTreeValue > {
@@ -468,30 +469,3 @@ struct Expandable<'a, T: ToJsonTreeValue> {
468
469
expandable_type : ExpandableType ,
469
470
parent : Option < JsonPointerSegment < ' a > > ,
470
471
}
471
-
472
- type PathIdMap < ' a > = HashMap < Vec < JsonPointerSegment < ' a > > , Id > ;
473
-
474
- fn populate_path_id_map < ' a , ' b , T : ToJsonTreeValue > (
475
- value : & ' a T ,
476
- path_id_map : & ' b mut PathIdMap < ' a > ,
477
- make_persistent_id : & ' b dyn Fn ( & Vec < JsonPointerSegment < ' a > > ) -> Id ,
478
- ) {
479
- populate_path_id_map_impl ( value, & mut vec ! [ ] , path_id_map, make_persistent_id) ;
480
- }
481
-
482
- fn populate_path_id_map_impl < ' a , ' b , T : ToJsonTreeValue > (
483
- value : & ' a T ,
484
- path_segments : & ' b mut Vec < JsonPointerSegment < ' a > > ,
485
- path_id_map : & ' b mut PathIdMap < ' a > ,
486
- make_persistent_id : & ' b dyn Fn ( & Vec < JsonPointerSegment < ' a > > ) -> Id ,
487
- ) {
488
- if let JsonTreeValue :: Expandable ( entries, _) = value. to_json_tree_value ( ) {
489
- for ( property, val) in entries {
490
- let id = make_persistent_id ( path_segments) ;
491
- path_id_map. insert ( path_segments. clone ( ) , id) ;
492
- path_segments. push ( property) ;
493
- populate_path_id_map_impl ( val, path_segments, path_id_map, make_persistent_id) ;
494
- path_segments. pop ( ) ;
495
- }
496
- }
497
- }
0 commit comments