11//! XML
22
3+ use std:: ops:: RangeInclusive ;
4+
35use bladvak:: eframe:: egui:: { self , CollapsingHeader } ;
46use roxmltree:: { Document , Node } ;
57
@@ -21,25 +23,28 @@ impl XmlData {
2123}
2224
2325/// Show XML tree
24- pub fn xml_tree_ui ( ui : & mut egui:: Ui , xml : Option < & XmlData > ) {
26+ pub fn xml_tree_ui ( ui : & mut egui:: Ui , xml : Option < & XmlData > ) -> Option < RangeInclusive < usize > > {
2527 let Some ( xml) = xml else {
2628 ui. label ( "Failed to parse xml" ) ;
27- return ;
29+ return None ;
2830 } ;
31+ let mut return_range = None ;
2932 match Document :: parse ( & xml. inner ) {
3033 Ok ( doc) => {
3134 let root = doc. root_element ( ) ;
32- draw_node ( ui, root, 0 ) ;
35+ return_range = draw_node ( ui, root, 0 ) ;
3336 }
3437 Err ( err) => {
3538 ui. colored_label ( egui:: Color32 :: RED , err. to_string ( ) ) ;
3639 }
3740 }
41+ return_range
3842}
3943
4044/// Draw node
41- fn draw_node ( ui : & mut egui:: Ui , node : Node < ' _ , ' _ > , idx : usize ) {
45+ fn draw_node ( ui : & mut egui:: Ui , node : Node < ' _ , ' _ > , idx : usize ) -> Option < RangeInclusive < usize > > {
4246 let mut count = idx;
47+ let mut return_range = None ;
4348 match node. node_type ( ) {
4449 roxmltree:: NodeType :: Element => {
4550 let label = format_element_label ( node) ;
@@ -48,6 +53,13 @@ fn draw_node(ui: &mut egui::Ui, node: Node<'_, '_>, idx: usize) {
4853 . id_salt ( format ! ( "{label}-{idx}-{count}" ) )
4954 . default_open ( false )
5055 . show ( ui, |ui| {
56+ let range = node. range ( ) ;
57+ if ui
58+ . button ( format ! ( "Position {}-{}" , range. start, range. end - 1 ) )
59+ . clicked ( )
60+ {
61+ return_range = Some ( range. start ..=range. end - 1 ) ;
62+ }
5163 // Attributes
5264 for attr in node. attributes ( ) {
5365 ui. label ( format ! ( "@{}=\" {}\" " , attr. name( ) , attr. value( ) ) ) ;
@@ -56,7 +68,9 @@ fn draw_node(ui: &mut egui::Ui, node: Node<'_, '_>, idx: usize) {
5668 // Children
5769 for child in node. children ( ) {
5870 count += 1 ;
59- draw_node ( ui, child, count) ;
71+ if let Some ( range) = draw_node ( ui, child, count) {
72+ return_range = Some ( range) ;
73+ }
6074 }
6175 } ) ;
6276 }
@@ -74,6 +88,7 @@ fn draw_node(ui: &mut egui::Ui, node: Node<'_, '_>, idx: usize) {
7488
7589 _ => { }
7690 }
91+ return_range
7792}
7893
7994/// Format element label
0 commit comments