Changes for egui/object upgrades

This commit is contained in:
Luke Street 2023-01-21 01:11:40 -05:00
parent 4b58f69461
commit a8c2514377
5 changed files with 285 additions and 256 deletions

View File

@ -250,7 +250,7 @@ fn relocations_by_section(
}; };
// println!("Reloc: {:?}, symbol: {:?}", reloc, symbol); // println!("Reloc: {:?}, symbol: {:?}", reloc, symbol);
let target = match symbol.kind() { let target = match symbol.kind() {
SymbolKind::Text | SymbolKind::Data | SymbolKind::Unknown => { SymbolKind::Text | SymbolKind::Data | SymbolKind::Label | SymbolKind::Unknown => {
to_obj_symbol(obj_file, &symbol, reloc.addend()) to_obj_symbol(obj_file, &symbol, reloc.addend())
} }
SymbolKind::Section => { SymbolKind::Section => {
@ -305,7 +305,7 @@ fn line_info(obj_file: &File<'_>) -> Result<Option<BTreeMap<u32, u32>>> {
let address_delta = reader.read_u32::<BigEndian>()?; let address_delta = reader.read_u32::<BigEndian>()?;
map.insert(base_address + address_delta, line_number); map.insert(base_address + address_delta, line_number);
} }
println!("Line info: {:#X?}", map); println!("Line info: {map:#X?}");
return Ok(Some(map)); return Ok(Some(map));
} }
Ok(None) Ok(None)

View File

@ -1,7 +1,7 @@
use std::{cmp::min, default::Default, mem::take}; use std::{cmp::min, default::Default, mem::take};
use egui::{text::LayoutJob, Color32, Label, Sense}; use egui::{text::LayoutJob, Align, Color32, Label, Layout, Sense, Vec2};
use egui_extras::{Size, StripBuilder, TableBuilder}; use egui_extras::{Column, TableBuilder};
use time::format_description; use time::format_description;
use crate::{ use crate::{
@ -166,88 +166,89 @@ pub fn data_diff_ui(ui: &mut egui::Ui, view_state: &mut ViewState) -> bool {
let (Some(result), Some(selected_symbol)) = (&view_state.build, &view_state.selected_symbol) else { let (Some(result), Some(selected_symbol)) = (&view_state.build, &view_state.selected_symbol) else {
return rebuild; return rebuild;
}; };
StripBuilder::new(ui)
.size(Size::exact(20.0)) // Header
.size(Size::exact(40.0)) let available_width = ui.available_width();
.size(Size::remainder()) let column_width = available_width / 2.0;
.vertical(|mut strip| { ui.allocate_ui_with_layout(
strip.strip(|builder| { Vec2 { x: available_width, y: 100.0 },
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| { Layout::left_to_right(Align::Min),
strip.cell(|ui| { |ui| {
ui.horizontal(|ui| { // Left column
if ui.button("Back").clicked() { ui.allocate_ui_with_layout(
view_state.current_view = View::SymbolDiff; Vec2 { x: column_width, y: 100.0 },
} Layout::top_down(Align::Min),
}); |ui| {
ui.set_width(column_width);
if ui.button("Back").clicked() {
view_state.current_view = View::SymbolDiff;
}
ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap = Some(false);
ui.colored_label(Color32::WHITE, &selected_symbol.symbol_name);
ui.label("Diff target:");
}); });
strip.cell(|ui| { },
ui.horizontal(|ui| { );
if ui.button("Build").clicked() {
rebuild = true; // Right column
} ui.allocate_ui_with_layout(
ui.scope(|ui| { Vec2 { x: column_width, y: 100.0 },
ui.style_mut().override_text_style = Layout::top_down(Align::Min),
Some(egui::TextStyle::Monospace); |ui| {
ui.style_mut().wrap = Some(false); ui.set_width(column_width);
if view_state.jobs.iter().any(|job| job.job_type == Job::ObjDiff) {
ui.label("Building..."); ui.horizontal(|ui| {
} else { if ui.button("Build").clicked() {
ui.label("Last built:"); rebuild = true;
let format = }
format_description::parse("[hour]:[minute]:[second]")
.unwrap();
ui.label(
result
.time
.to_offset(view_state.utc_offset)
.format(&format)
.unwrap(),
);
}
});
});
});
});
});
strip.strip(|builder| {
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| {
strip.cell(|ui| {
ui.scope(|ui| { ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace); ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap = Some(false); ui.style_mut().wrap = Some(false);
ui.colored_label(Color32::WHITE, &selected_symbol.symbol_name); if view_state.jobs.iter().any(|job| job.job_type == Job::ObjDiff) {
ui.label("Diff target:"); ui.label("Building...");
ui.separator(); } else {
ui.label("Last built:");
let format =
format_description::parse("[hour]:[minute]:[second]").unwrap();
ui.label(
result
.time
.to_offset(view_state.utc_offset)
.format(&format)
.unwrap(),
);
}
}); });
}); });
strip.cell(|ui| {
ui.scope(|ui| { ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace); ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap = Some(false); ui.style_mut().wrap = Some(false);
ui.label(""); ui.label("");
ui.label("Diff base:"); ui.label("Diff base:");
ui.separator();
});
}); });
}); },
}); );
strip.cell(|ui| { },
if let (Some(left_obj), Some(right_obj)) = (&result.first_obj, &result.second_obj) { );
let table = TableBuilder::new(ui) ui.separator();
.striped(false)
.cell_layout(egui::Layout::left_to_right(egui::Align::Min)) // Table
.column(Size::relative(0.5)) if let (Some(left_obj), Some(right_obj)) = (&result.first_obj, &result.second_obj) {
.column(Size::relative(0.5)) let available_height = ui.available_height();
.resizable(false); let table = TableBuilder::new(ui)
data_table_ui( .striped(false)
table, .cell_layout(Layout::left_to_right(Align::Min))
left_obj, .columns(Column::exact(column_width).clip(true), 2)
right_obj, .resizable(false)
selected_symbol, .auto_shrink([false, false])
&view_state.view_config, .min_scrolled_height(available_height);
); data_table_ui(table, left_obj, right_obj, selected_symbol, &view_state.view_config);
} }
});
});
rebuild rebuild
} }

View File

@ -1,8 +1,9 @@
use std::default::Default; use std::default::Default;
use cwdemangle::demangle; use cwdemangle::demangle;
use egui::{text::LayoutJob, Color32, FontId, Label, Sense}; use eframe::emath::Align;
use egui_extras::{Size, StripBuilder, TableBuilder}; use egui::{text::LayoutJob, Color32, FontId, Label, Layout, Sense, Vec2};
use egui_extras::{Column, TableBuilder};
use ppc750cl::Argument; use ppc750cl::Argument;
use time::format_description; use time::format_description;
@ -332,102 +333,109 @@ pub fn function_diff_ui(ui: &mut egui::Ui, view_state: &mut ViewState) -> bool {
let (Some(result), Some(selected_symbol)) = (&view_state.build, &view_state.selected_symbol) else { let (Some(result), Some(selected_symbol)) = (&view_state.build, &view_state.selected_symbol) else {
return rebuild; return rebuild;
}; };
StripBuilder::new(ui)
.size(Size::exact(20.0)) // Header
.size(Size::exact(40.0)) let available_width = ui.available_width();
.size(Size::remainder()) let column_width = available_width / 2.0;
.vertical(|mut strip| { ui.allocate_ui_with_layout(
strip.strip(|builder| { Vec2 { x: available_width, y: 100.0 },
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| { Layout::left_to_right(Align::Min),
strip.cell(|ui| { |ui| {
ui.horizontal(|ui| { // Left column
if ui.button("Back").clicked() { ui.allocate_ui_with_layout(
view_state.current_view = View::SymbolDiff; Vec2 { x: column_width, y: 100.0 },
} Layout::top_down(Align::Min),
}); |ui| {
}); ui.set_width(column_width);
strip.cell(|ui| {
ui.horizontal(|ui| { if ui.button("Back").clicked() {
if ui.button("Build").clicked() { view_state.current_view = View::SymbolDiff;
rebuild = true; }
}
ui.scope(|ui| {
ui.style_mut().override_text_style =
Some(egui::TextStyle::Monospace);
ui.style_mut().wrap = Some(false);
if view_state.jobs.iter().any(|job| job.job_type == Job::ObjDiff) {
ui.label("Building...");
} else {
ui.label("Last built:");
let format =
format_description::parse("[hour]:[minute]:[second]")
.unwrap();
ui.label(
result
.time
.to_offset(view_state.utc_offset)
.format(&format)
.unwrap(),
);
}
});
});
});
});
});
strip.strip(|builder| {
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| {
let demangled = demangle(&selected_symbol.symbol_name, &Default::default()); let demangled = demangle(&selected_symbol.symbol_name, &Default::default());
strip.cell(|ui| { let name = demangled.as_deref().unwrap_or(&selected_symbol.symbol_name);
ui.scope(|ui| { let mut job = LayoutJob::simple(
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace); name.to_string(),
ui.style_mut().wrap = Some(false); view_state.view_config.code_font.clone(),
ui.colored_label( Color32::WHITE,
Color32::WHITE, column_width,
demangled.as_ref().unwrap_or(&selected_symbol.symbol_name), );
); job.wrap.break_anywhere = true;
ui.label("Diff target:"); job.wrap.max_rows = 1;
ui.separator(); ui.label(job);
});
ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.label("Diff target:");
}); });
strip.cell(|ui| { },
);
// Right column
ui.allocate_ui_with_layout(
Vec2 { x: column_width, y: 100.0 },
Layout::top_down(Align::Min),
|ui| {
ui.set_width(column_width);
ui.horizontal(|ui| {
if ui.button("Build").clicked() {
rebuild = true;
}
ui.scope(|ui| { ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace); ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap = Some(false); ui.style_mut().wrap = Some(false);
if let Some(match_percent) = result if view_state.jobs.iter().any(|job| job.job_type == Job::ObjDiff) {
.second_obj ui.label("Building...");
.as_ref() } else {
.and_then(|obj| find_symbol(obj, selected_symbol)) ui.label("Last built:");
.and_then(|symbol| symbol.match_percent) let format =
{ format_description::parse("[hour]:[minute]:[second]").unwrap();
ui.colored_label( ui.label(
match_color_for_symbol(match_percent), result
&format!("{match_percent:.0}%"), .time
.to_offset(view_state.utc_offset)
.format(&format)
.unwrap(),
); );
} }
ui.label("Diff base:");
ui.separator();
}); });
}); });
});
}); ui.scope(|ui| {
strip.cell(|ui| { ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
if let (Some(left_obj), Some(right_obj)) = (&result.first_obj, &result.second_obj) { if let Some(match_percent) = result
let table = TableBuilder::new(ui) .second_obj
.striped(false) .as_ref()
.cell_layout(egui::Layout::left_to_right(egui::Align::Min)) .and_then(|obj| find_symbol(obj, selected_symbol))
.column(Size::relative(0.5)) .and_then(|symbol| symbol.match_percent)
.column(Size::relative(0.5)) {
.resizable(false); ui.colored_label(
asm_table_ui( match_color_for_symbol(match_percent),
table, &format!("{match_percent:.0}%"),
left_obj, );
right_obj, } else {
selected_symbol, ui.label("");
&view_state.view_config, }
); ui.label("Diff base:");
} });
}); },
}); );
},
);
ui.separator();
// Table
if let (Some(left_obj), Some(right_obj)) = (&result.first_obj, &result.second_obj) {
let available_height = ui.available_height();
let table = TableBuilder::new(ui)
.striped(false)
.cell_layout(Layout::left_to_right(Align::Min))
.columns(Column::exact(column_width).clip(true), 2)
.resizable(false)
.auto_shrink([false, false])
.min_scrolled_height(available_height);
asm_table_ui(table, left_obj, right_obj, selected_symbol, &view_state.view_config);
}
rebuild rebuild
} }

View File

@ -9,5 +9,5 @@ pub(crate) mod symbol_diff;
const COLOR_RED: Color32 = Color32::from_rgb(200, 40, 41); const COLOR_RED: Color32 = Color32::from_rgb(200, 40, 41);
fn write_text(str: &str, color: Color32, job: &mut LayoutJob, font_id: FontId) { fn write_text(str: &str, color: Color32, job: &mut LayoutJob, font_id: FontId) {
job.append(str, 0.0, TextFormat { font_id, color, ..Default::default() }); job.append(str, 0.0, TextFormat::simple(font_id, color));
} }

View File

@ -1,5 +1,6 @@
use egui::{ use egui::{
text::LayoutJob, CollapsingHeader, Color32, Rgba, ScrollArea, SelectableLabel, Ui, Widget, text::LayoutJob, Align, CollapsingHeader, Color32, Layout, Rgba, ScrollArea, SelectableLabel,
TextEdit, Ui, Vec2, Widget,
}; };
use egui_extras::{Size, StripBuilder}; use egui_extras::{Size, StripBuilder};
@ -135,12 +136,9 @@ fn symbol_list_ui(
selected_symbol: &mut Option<SymbolReference>, selected_symbol: &mut Option<SymbolReference>,
current_view: &mut View, current_view: &mut View,
reverse_function_order: bool, reverse_function_order: bool,
search: &mut String, lower_search: &str,
config: &ViewConfig, config: &ViewConfig,
) { ) {
ui.text_edit_singleline(search);
let lower_search = search.to_ascii_lowercase();
ScrollArea::both().auto_shrink([false, false]).show(ui, |ui| { ScrollArea::both().auto_shrink([false, false]).show(ui, |ui| {
ui.scope(|ui| { ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace); ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
@ -215,94 +213,116 @@ fn build_log_ui(ui: &mut Ui, status: &BuildStatus) {
} }
pub fn symbol_diff_ui(ui: &mut Ui, view_state: &mut ViewState) { pub fn symbol_diff_ui(ui: &mut Ui, view_state: &mut ViewState) {
if let (Some(result), highlighted_symbol, selected_symbol, current_view, search) = ( let (Some(result), highlighted_symbol, selected_symbol, current_view, search) = (
&view_state.build, &view_state.build,
&mut view_state.highlighted_symbol, &mut view_state.highlighted_symbol,
&mut view_state.selected_symbol, &mut view_state.selected_symbol,
&mut view_state.current_view, &mut view_state.current_view,
&mut view_state.search, &mut view_state.search,
) { ) else {
StripBuilder::new(ui).size(Size::exact(40.0)).size(Size::remainder()).vertical( return;
|mut strip| { };
strip.strip(|builder| {
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| {
strip.cell(|ui| {
ui.scope(|ui| {
ui.style_mut().override_text_style =
Some(egui::TextStyle::Monospace);
ui.style_mut().wrap = Some(false);
ui.label("Build target:"); // Header
if result.first_status.success { let available_width = ui.available_width();
ui.label("OK"); let column_width = available_width / 2.0;
} else { ui.allocate_ui_with_layout(
ui.colored_label(Rgba::from_rgb(1.0, 0.0, 0.0), "Fail"); Vec2 { x: available_width, y: 100.0 },
} Layout::left_to_right(Align::Min),
}); |ui| {
ui.separator(); // Left column
}); ui.allocate_ui_with_layout(
strip.cell(|ui| { Vec2 { x: column_width, y: 100.0 },
ui.scope(|ui| { Layout::top_down(Align::Min),
ui.style_mut().override_text_style = |ui| {
Some(egui::TextStyle::Monospace); ui.set_width(column_width);
ui.style_mut().wrap = Some(false);
ui.label("Build base:"); ui.scope(|ui| {
if result.second_status.success { ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.label("OK"); ui.style_mut().wrap = Some(false);
} else {
ui.colored_label(Rgba::from_rgb(1.0, 0.0, 0.0), "Fail"); ui.label("Build target:");
} if result.first_status.success {
ui.label("OK");
} else {
ui.colored_label(Rgba::from_rgb(1.0, 0.0, 0.0), "Fail");
}
});
TextEdit::singleline(search).hint_text("Filter symbols").ui(ui);
},
);
// Right column
ui.allocate_ui_with_layout(
Vec2 { x: column_width, y: 100.0 },
Layout::top_down(Align::Min),
|ui| {
ui.set_width(column_width);
ui.scope(|ui| {
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
ui.style_mut().wrap = Some(false);
ui.label("Build base:");
if result.second_status.success {
ui.label("OK");
} else {
ui.colored_label(Rgba::from_rgb(1.0, 0.0, 0.0), "Fail");
}
});
},
);
},
);
ui.separator();
// Table
let lower_search = search.to_ascii_lowercase();
StripBuilder::new(ui).size(Size::remainder()).vertical(|mut strip| {
strip.strip(|builder| {
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| {
strip.cell(|ui| {
if result.first_status.success {
if let Some(obj) = &result.first_obj {
ui.push_id("left", |ui| {
symbol_list_ui(
ui,
obj,
highlighted_symbol,
selected_symbol,
current_view,
view_state.reverse_fn_order,
&lower_search,
&view_state.view_config,
);
}); });
ui.separator(); }
}); } else {
}); build_log_ui(ui, &result.first_status);
}
}); });
strip.strip(|builder| { strip.cell(|ui| {
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| { if result.second_status.success {
strip.cell(|ui| { if let Some(obj) = &result.second_obj {
if result.first_status.success { ui.push_id("right", |ui| {
if let Some(obj) = &result.first_obj { symbol_list_ui(
ui.push_id("left", |ui| { ui,
symbol_list_ui( obj,
ui, highlighted_symbol,
obj, selected_symbol,
highlighted_symbol, current_view,
selected_symbol, view_state.reverse_fn_order,
current_view, &lower_search,
view_state.reverse_fn_order, &view_state.view_config,
search, );
&view_state.view_config, });
); }
}); } else {
} build_log_ui(ui, &result.second_status);
} else { }
build_log_ui(ui, &result.first_status);
}
});
strip.cell(|ui| {
if result.second_status.success {
if let Some(obj) = &result.second_obj {
ui.push_id("right", |ui| {
symbol_list_ui(
ui,
obj,
highlighted_symbol,
selected_symbol,
current_view,
view_state.reverse_fn_order,
search,
&view_state.view_config,
);
});
}
} else {
build_log_ui(ui, &result.second_status);
}
});
});
}); });
}, });
); });
} });
} }