use malwaredb_api::Labels;
use malwaredb_server::State;
use std::sync::Arc;
use anyhow::Result;
use eframe::egui::Id;
const COLUMN_HEADERS: [&str; 3] = ["ID", "Name", "Parent"];
#[derive(Debug, Clone)]
pub struct LabelTable {
#[allow(dead_code)]
state: Arc<State>,
labels: Labels,
}
impl LabelTable {
pub async fn new(state: Arc<State>) -> Result<Self> {
let labels = state.db_type.get_labels().await?;
Ok(Self { state, labels })
}
pub fn ui(&mut self, ui: &mut eframe::egui::Ui) {
let id_salt = Id::new("label_table");
let table = egui_table::Table::new()
.id_salt(id_salt)
.auto_size_mode(egui_table::AutoSizeMode::OnParentResize)
.num_rows(self.labels.len() as u64)
.columns(
(0..COLUMN_HEADERS.len())
.map(|_| egui_table::Column::new(100.0).resizable(true))
.collect::<Vec<_>>(),
);
table.show(ui, self);
}
}
impl egui_table::TableDelegate for LabelTable {
fn header_cell_ui(&mut self, ui: &mut eframe::egui::Ui, cell: &egui_table::HeaderCellInfo) {
if let Some(header) = COLUMN_HEADERS.get(cell.group_index) {
ui.label(*header);
}
}
fn cell_ui(&mut self, ui: &mut eframe::egui::Ui, cell: &egui_table::CellInfo) {
let Some(label) = usize::try_from(cell.row_nr)
.ok()
.and_then(|row| self.labels.0.get(row))
else {
return;
};
let text: std::borrow::Cow<str> = match cell.col_nr {
0 => label.id.to_string().into(),
1 => label.name.as_str().into(),
2 => label.parent.as_deref().unwrap_or_default().into(),
_ => "".into(),
};
ui.label(text.as_ref());
}
}