Skip to content

Commit 888f860

Browse files
committed
add xml range
1 parent 28aab1b commit 888f860

File tree

4 files changed

+47
-17
lines changed

4 files changed

+47
-17
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"]
2121
# bladvak = { path = "../bladvak" }
2222
bladvak = "1.2.7"
2323
file-format = "0.28.0"
24-
roxmltree = "0.21.1"
24+
roxmltree = { version = "0.21.1", features = ["positions"] }
2525
serde = { version = "1", features = ["derive"] }
2626

2727
[profile.release]

src/selection.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,15 @@ impl BladvakPanel for PanelSelection {
5252
fn ui(&self, app: &mut WombatApp, ui: &mut egui::Ui, error_manager: &mut ErrorManager) {
5353
if let Some((select1, select2)) = app.selection.range.as_mut() {
5454
let mut mark_stale = false;
55-
ui.label("Selection");
55+
ui.horizontal(|ui| {
56+
ui.label("Selection");
57+
let color_to_edit = if ui.ctx().theme() == Theme::Light {
58+
&mut app.selection.color.0
59+
} else {
60+
&mut app.selection.color.1
61+
};
62+
ui.color_edit_button_srgba(color_to_edit);
63+
});
5664
ui.horizontal(|ui| {
5765
ui.add(egui::DragValue::new(select1).range(0..=*select2));
5866
let max = app.binary_file.len() - 1;
@@ -70,13 +78,23 @@ impl BladvakPanel for PanelSelection {
7078
ui.label(format!("{nb_selected} bytes selected"));
7179
let range = *select1..=*select2;
7280

81+
if nb_selected == 4
82+
&& let Some(slice) = app.binary_file.get(range.clone())
83+
&& let Ok(bytes) = <[u8; 4]>::try_from(slice)
84+
{
85+
let range_u32 = u32::from_le_bytes(bytes);
86+
87+
if let Some(charac) = std::char::from_u32(range_u32) {
88+
ui.label(format!("Unicode le {charac}"));
89+
}
90+
let range_u32 = u32::from_be_bytes(bytes);
91+
92+
if let Some(charac) = std::char::from_u32(range_u32) {
93+
ui.label(format!("Unicode be {charac}"));
94+
}
95+
}
96+
7397
ui.collapsing("More", |ui| {
74-
let color_to_edit = if ui.ctx().theme() == Theme::Light {
75-
&mut app.selection.color.0
76-
} else {
77-
&mut app.selection.color.1
78-
};
79-
ui.color_edit_button_srgba(color_to_edit);
8098
if ui.button("Delete selection").clicked() {
8199
app.binary_file.drain(range.clone());
82100
*select2 = select1.checked_sub(1).unwrap_or(0);

src/windows/detection/mod.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ impl DetectionCache {
2929
fn show(&self, ui: &mut egui::Ui, file_info: &FileInfoData) -> Option<RangeInclusive<usize>> {
3030
match self {
3131
DetectionCache::Png(data) => show_png_chunks(ui, data.as_ref()),
32-
DetectionCache::Xml(xml_str) => {
33-
xml_tree_ui(ui, xml_str.as_ref());
34-
None
35-
}
32+
DetectionCache::Xml(xml_str) => xml_tree_ui(ui, xml_str.as_ref()),
3633
DetectionCache::Empty => {
3734
ui.label(format!("Kind: {:?}", file_info.kind));
3835
ui.label("No data");

src/windows/detection/xml.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! XML
22
3+
use std::ops::RangeInclusive;
4+
35
use bladvak::eframe::egui::{self, CollapsingHeader};
46
use 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

Comments
 (0)