use super::{Aim, Model};
impl Model {
pub fn aim_at(&mut self, channel: &str, address: &str) {
self.aim = Some(Aim {
channel: channel.to_owned(),
address: address.to_owned(),
});
self.convs.clear();
self.answered = None;
self.conversation = None;
self.transcript = crate::reply::transcript::Transcript::default();
self.live = None;
self.tuning = None;
self.roles = None;
self.retire_login();
self.retire_records();
}
pub fn select(&mut self, root_id: &str) {
self.conversation = Some(root_id.to_owned());
self.transcript = crate::reply::transcript::Transcript::default();
self.live = None;
self.retire_records();
}
pub fn post_pin(&mut self, pinned: bool) {
let Some(Aim { address, .. }) = self.aim.clone() else {
return;
};
let gesture = if pinned {
crate::verbs::pin(address)
} else {
crate::verbs::unpin(address)
};
self.outbox.push(super::Posted::act(gesture));
}
pub fn dismiss(&mut self) {
self.notice = None;
}
pub fn escape(&mut self) {
if self.enroll.is_some() {
self.close_enrollment();
} else if matches!(self.tuning, Some(super::Tuning::Editing(_))) {
self.cancel_assignment();
} else if self.tuning.is_some() {
self.close_tuning();
} else if self.records {
self.close_records();
} else if self.queue {
self.close_queue();
} else if self.lookup.is_some() {
self.close_lookup();
} else if self.login.is_some() {
self.close_login();
} else if self.unmaking.is_some() {
self.close_unmaking();
} else {
self.dismiss();
}
}
pub fn begin_enrollment(&mut self) {
if let Some(aim) = self.aim.clone() {
self.enroll = Some(super::Enrolling::at(aim));
}
}
pub fn post_enrollment(&mut self) {
let Some(enrolling) = self.enroll.as_mut().filter(|held| held.ready()) else {
return;
};
enrolling.posted = true;
let gesture = enrolling.gesture();
self.outbox.push(super::Posted::act(gesture));
}
pub fn close_enrollment(&mut self) {
self.enroll = None;
}
pub(super) fn enrolled(&mut self, material: &crate::reply::enrolled::Enrolled) {
let Some(enrolling) = self.enroll.as_mut() else {
self.notice = Some(super::Notice::Unreadable(format!(
"the engine enrolled {} while this pane was closed, so the \
material is gone — enroll again to mint another",
material.caption()
)));
return;
};
match super::Shown::of(material) {
Ok(shown) => {
enrolling.shown = Some(shown);
self.notice = None;
}
Err(why) => {
self.enroll = None;
self.notice = Some(super::Notice::Unreadable(why));
}
}
}
}
#[cfg(test)]
mod tests;