use crate::ui::{Aim, Fill, Model, keys};
pub const STOP: &str = "stop";
pub const REVOKE: &str = "revoke";
pub const RESTORE: &str = "restore";
pub const RETARGET: &str = "retarget";
pub const FLAG: &str = "flag";
pub const WHY: &str = "why it wants a look";
pub const DELETE: &str = "delete";
pub const ARM: &str = "its name, to take its children too";
const ARM_WIDTH: f32 = 200.0;
pub fn render(ui: &mut egui::Ui, model: &mut Model, aim: &Aim, agent: &str) {
let mut fired = None;
let wanted = model.filling();
ui.horizontal_wrapped(|ui| {
let records = ui.button(crate::ui::records::OPEN);
crate::ui::act::tag(
&records,
&[
crate::verbs::STEPS.word,
crate::verbs::FILES.word,
crate::verbs::RAIL.word,
crate::verbs::GOVERNING.word,
crate::verbs::AGENT.word,
crate::verbs::INBOX.word,
],
);
if records.clicked() {
model.begin_records();
}
let halt = ui.button(STOP);
crate::ui::act::tag(&halt, &[crate::verbs::STOP.word]);
if halt.clicked() {
fired = Some(crate::verbs::stop(
aim.address.clone(),
agent.to_owned(),
false,
));
}
let take = ui.button(REVOKE);
crate::ui::act::tag(&take, &[crate::verbs::REVOKE.word]);
if take.clicked() {
fired = Some(crate::verbs::revoke(aim.address.clone(), agent.to_owned()));
}
let give = ui.button(RESTORE);
crate::ui::act::tag(&give, &[crate::verbs::RESTORE.word]);
if give.clicked() {
fired = Some(crate::verbs::restore(aim.address.clone(), agent.to_owned()));
}
let settle = ui.button(RETARGET);
crate::ui::act::tag(&settle, &[crate::verbs::RETARGET.word]);
if settle.clicked() {
fired = Some(crate::verbs::retarget(
aim.address.clone(),
agent.to_owned(),
));
}
let why = ui.add(
egui::TextEdit::singleline(&mut model.reason)
.id(egui::Id::new(keys::REASON_ID))
.desired_width(ARM_WIDTH)
.hint_text(WHY),
);
if wanted == Some(Fill::Reason) {
why.request_focus();
}
let raise = ui.add_enabled(!model.reason.trim().is_empty(), egui::Button::new(FLAG));
crate::ui::act::tag(&raise, &[crate::verbs::FLAG.word]);
if raise.clicked() {
fired = Some(crate::verbs::flag(
aim.address.clone(),
agent.to_owned(),
std::mem::take(&mut model.reason),
));
}
let arming = ui.add(
egui::TextEdit::singleline(&mut model.typed)
.id(egui::Id::new(keys::ARM_ID))
.desired_width(ARM_WIDTH)
.hint_text(ARM),
);
if wanted == Some(Fill::Arming) {
arming.request_focus();
}
let unmake = ui.button(DELETE);
crate::ui::act::tag(&unmake, &[crate::verbs::DELETE_AGENT.word]);
if unmake.clicked() {
fired = Some(crate::verbs::delete_agent(
aim.address.clone(),
agent.to_owned(),
model.typed.clone(),
));
}
});
model
.outbox
.extend(fired.into_iter().map(crate::ui::Posted::act));
}
#[cfg(test)]
mod tests;