use crate::reply::queue::QueueRow;
use crate::ui::{Model, theme};
pub const OPEN: &str = "waiting on you…";
pub const CLOSE: &str = "done";
pub const HEADING: &str = "waiting on you";
pub const NOT_ANSWERED: &str = "waiting to hear what is asking for you";
pub const NOTHING: &str = "nothing is waiting on you";
pub const SEEN: &str = "seen";
pub const GO: &str = "go to it";
pub fn render(ui: &mut egui::Ui, model: &mut Model) -> bool {
if !model.queue {
return false;
}
ui.heading(HEADING);
ui.horizontal_wrapped(|ui| {
if ui.button(CLOSE).clicked() {
model.close_queue();
}
});
ui.separator();
let waiting = model.waiting.clone();
if waiting.is_empty() {
ui.label(NOT_ANSWERED);
return true;
}
if waiting.iter().all(|section| section.rows.is_empty()) {
ui.label(NOTHING);
return true;
}
egui::ScrollArea::vertical()
.id_salt(HEADING)
.auto_shrink(false)
.show(ui, |ui| {
for section in &waiting {
if section.rows.is_empty() {
continue;
}
ui.separator();
ui.label(crate::ui::roster::header(§ion.channel));
for row in §ion.rows {
waiting_row(ui, model, row);
}
}
});
true
}
fn waiting_row(ui: &mut egui::Ui, model: &mut Model, row: &QueueRow) {
ui.label(headline(row));
for said in [flagged(row), row.failure.clone(), parked(row)]
.into_iter()
.flatten()
{
ui.colored_label(theme::NOTICE, said);
}
if let Some(said) = signalled(row) {
ui.colored_label(theme::tone_ink(&crate::reply::convs::Tone::Weak), said);
}
if !row.preview.is_empty() {
ui.colored_label(
theme::tone_ink(&crate::reply::convs::Tone::Weak),
row.preview.clone(),
);
}
acts(ui, model, row);
}
fn acts(ui: &mut egui::Ui, model: &mut Model, row: &QueueRow) {
if model.wall(&row.workspace).is_none() {
ui.colored_label(theme::NOTICE, crate::ui::roster::NO_NAME_HERE);
return;
}
let mut fired = None;
ui.horizontal_wrapped(|ui| {
let answer = ui.button(SEEN);
crate::ui::act::tag(&answer, &[crate::verbs::SEEN.word]);
if answer.clicked() {
fired = Some(row.clone());
}
if ui.button(GO).clicked() {
model.go_to(row);
}
});
if let Some(row) = fired {
model.post_seen(&row);
}
}
pub fn headline(row: &QueueRow) -> String {
let mut said = vec![format!(
"{} on {} [{}{}] {}",
row.display,
row.workspace,
row.state.label(),
if row.uncertain {
crate::ui::convs::UNCERTAIN
} else {
""
},
crate::ui::convs::age(row.age_secs)
)];
if row.pending > 0 {
said.push(format!("{} under it", row.pending));
}
said.join(" ")
}
pub fn flagged(row: &QueueRow) -> Option<String> {
let flag = row.flag.as_ref()?;
Some(format!("flagged {} — {}", flag.at, flag.reason))
}
pub fn parked(row: &QueueRow) -> Option<String> {
let held = row.held.as_ref()?;
Some(format!(
"held at the boundary: {} ({}) — {}",
held.tool, held.tool_use, held.reason
))
}
pub fn signalled(row: &QueueRow) -> Option<String> {
(!row.signals.is_empty()).then(|| row.signals.join(" "))
}
#[cfg(test)]
mod tests;