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;
egui::ScrollArea::vertical()
.id_salt("bar")
.auto_shrink(false)
.show(ui, |ui| {
for row in &rows {
if one(ui, model, row, open).clicked() {
picked = Some(row.root_id.clone());
}
}
});
if let Some(id) = picked {
model.select(&id);
}
}
fn one(ui: &mut egui::Ui, model: &Model, row: &ConvRow, open: bool) -> 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 = theme::paint::Row {
mark: (glyph, glyph_ink),
words: if open {
row.display.clone()
} else {
super::cut(&row.display)
},
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,
}
.paint(ui);
crate::ui::act::tag(
&seat,
&[crate::verbs::TRANSCRIPT.word, crate::verbs::FOLLOW.word],
);
seat
}