use crate::reply::roster::WsRow;
use crate::ui::{Chunk, Model};
pub const NO_NAME_HERE: &str = "no entry here names it, so nothing typed here can address it";
pub const PIN: &str = "pin to the front";
pub const UNPIN: &str = "unpin";
pub fn render(ui: &mut egui::Ui, model: &mut Model, chunk: &Chunk, row: &WsRow, reveal: bool) {
let Some(address) = chunk.channel.address(row) else {
ui.label(format!("{} — {NO_NAME_HERE}", line(row)));
return;
};
let aimed = model.aimed_at(&chunk.channel.name, Some(&address));
let seat = ui.selectable_label(aimed, line(row));
crate::ui::act::tag(&seat, &[crate::verbs::CONVERSATIONS.word]);
if aimed && reveal {
seat.scroll_to_me(None);
}
if seat.clicked() {
model.aim_at(&chunk.channel.name.clone(), &address);
}
if !aimed || model.covered() {
return;
}
let pinned = row.pinned.is_some();
let strip = ui.button(if pinned { UNPIN } else { PIN });
crate::ui::act::tag(
&strip,
&[if pinned {
crate::verbs::UNPIN.word
} else {
crate::verbs::PIN.word
}],
);
if strip.clicked() {
model.post_pin(!pinned);
}
if ui.button(crate::ui::enroll::OPEN).clicked() {
model.begin_enrollment();
}
let tune = ui.button(crate::ui::tuning::OPEN);
crate::ui::act::tag(&tune, &[crate::verbs::ROLES.word]);
if tune.clicked() {
model.begin_tuning();
}
let sign = ui.button(crate::ui::login::OPEN);
crate::ui::act::tag(&sign, &[crate::verbs::PROVIDERS.word]);
if sign.clicked() {
model.begin_login();
}
if ui.button(crate::ui::unmake::OPEN).clicked() {
model.begin_unmaking();
}
}
pub fn line(row: &WsRow) -> String {
let mut said = vec![format!(
"{} ({}) {} conversations",
row.workspace,
row.kind.label(),
row.agents
)];
if row.attention > 0 {
said.push(format!("{} waiting", row.attention));
}
if row.running {
said.push("running".to_owned());
}
said.join(" ")
}
#[cfg(test)]
mod tests;