use crate::AppModel;
use crate::theme;
pub fn accessory(ui: &mut egui::Ui, model: &AppModel) {
let summary = model.activity();
let heading = if summary.errors > 0 {
egui::RichText::new(summary.chip()).color(theme::ICHOR)
} else {
egui::RichText::new(summary.chip()).weak()
};
egui::CollapsingHeader::new(heading)
.id_salt("activity-accessory")
.default_open(false)
.show(ui, |ui| {
egui::ScrollArea::vertical()
.max_height(160.0)
.show(ui, |ui| {
let liveness = crate::opslog::live_failures(model.ops_rows());
for (i, (row, live)) in model.ops_rows().iter().zip(liveness).enumerate() {
ui.push_id(i, |ui| ops_row(ui, row, live));
}
});
});
}
fn ops_row(ui: &mut egui::Ui, row: &crate::opslog::OpRow, live: bool) {
let failed = row.failed();
let more = if row.has_output() { " ⋯" } else { "" };
let summary = format!(
"{} {} {}{more}",
if failed { "⚠" } else { "·" },
row.ts,
row.argv
);
let heading = if live {
egui::RichText::new(summary).color(theme::ICHOR)
} else if failed {
egui::RichText::new(summary).weak()
} else {
egui::RichText::new(summary)
};
ui.collapsing(heading, |ui| {
ui.label(format!("cwd: {}", row.cwd));
ui.label(format!("exit: {}", row.exit));
if !row.stdout.is_empty() {
ui.label("stdout:");
ui.code(&row.stdout);
}
if !row.stderr.is_empty() {
ui.colored_label(theme::ICHOR, "stderr:");
ui.code(&row.stderr);
}
});
}