use crate::reply::convs::ConvRow;
use crate::ui::{Model, convs, theme};
pub const EMPTY: &str = "no conversations here yet — + new begins one";
pub const NOTHING_AIMED: &str = "pick a workspace below";
pub(super) fn render(ui: &mut egui::Ui, model: &mut Model, open: bool) {
let rows = model.rows();
if rows.is_empty() {
if open {
let said = match &model.aim {
None => NOTHING_AIMED,
Some(aim) if model.answered.as_ref() == Some(aim) => EMPTY,
Some(_) => convs::NOT_ANSWERED,
};
theme::paint::empty(ui, said);
}
return;
}
let mut picked = None;
let mut trashed = None;
egui::ScrollArea::vertical()
.id_salt("bar")
.auto_shrink(false)
.show(ui, |ui| {
for row in &rows {
let (seat, trash) = one(ui, model, row, open);
if seat.clicked() {
picked = Some(row.root_id.clone());
}
if trash.is_some_and(|door| door.clicked()) {
let at_once = ui.input(|i| i.modifiers.command);
trashed = Some((row.root_id.clone(), at_once));
}
}
});
if let Some(id) = picked {
model.select(&id);
}
if let Some((id, at_once)) = trashed {
if at_once {
model.post_delete(&id);
} else {
model.begin_deleting(&id);
}
}
}
fn one(
ui: &mut egui::Ui,
model: &Model,
row: &ConvRow,
open: bool,
) -> (egui::Response, Option<egui::Response>) {
let selected = model.conversation.as_ref() == Some(&row.root_id);
let ink = if selected { theme::BRAND } else { theme::INK };
let (glyph, glyph_ink) = convs::mark(row);
let age = convs::age(row.age_secs);
let preview = row.preview.lines().next().filter(|line| !line.is_empty());
let beneath = preview
.filter(|_| open)
.map(|line| (line.to_owned(), theme::INK_WEAK, egui::TextStyle::Small))
.into_iter()
.collect();
let (seat, trash) = theme::paint::Row {
mark: (glyph, glyph_ink),
words: row.display.clone(),
ink,
state: convs::rule(row),
chosen: selected,
indent: if open {
convs::indent(row.depth) - convs::STEP
} else {
0.0
},
aside: open.then_some(age),
beneath,
door: open.then_some(theme::glyph::TRASH),
}
.paint_doored(ui);
crate::ui::act::tag(
&seat,
&[crate::verbs::TRANSCRIPT.word, crate::verbs::FOLLOW.word],
);
if let Some(trash) = &trash {
crate::ui::act::tag(trash, &[crate::verbs::DELETE_AGENT.word]);
}
(seat, trash)
}