use crate::*;
use alux_ext::ext;
use ambassador::delegatable_trait;
#[delegatable_trait]
pub trait NavigationStateAlg: ManagerSorts {
fn page(&self) -> ManagerPage<Self::Id>;
fn set_page(&mut self, page: ManagerPage<Self::Id>);
}
#[delegatable_trait]
pub trait DetailSelectionAlg {
fn selected_detail_control(&self) -> Option<DetailControl>;
fn set_selected_detail_control(&mut self, control: Option<DetailControl>);
}
#[delegatable_trait]
pub trait ManagerStatusAlg {
fn manager_message(&self) -> Option<&str>;
fn set_manager_message(&mut self, message: Option<String>);
}
#[delegatable_trait]
pub trait SafeExitAlg {
fn exit_requested(&self) -> bool;
fn request_safe_exit(&mut self);
}
pub const COLLECTION: &str = "Transfers";
#[ext(name = BreadcrumbExt)]
pub impl<This> This
where
This: NavigationStateAlg + QueueCatalogAlg,
This::Entry: QueueEntryAlg + RequestOptionsAlg,
This::Id: Copy,
{
fn breadcrumbs(&self) -> Vec<Breadcrumb> {
let mut breadcrumbs = vec![segment(COLLECTION)];
match self.page() {
ManagerPage::Collection => {}
ManagerPage::AddSources => breadcrumbs.push(segment("Add sources")),
ManagerPage::Details(id) => breadcrumbs.push(segment(self.entry_label(id))),
ManagerPage::Formats(id) => {
let chooses_media = self.queue_entry(id).is_some_and(|entry| entry.performer() == Performer::Retrieval);
let choice = if chooses_media { "Formats" } else { "Transfer" };
breadcrumbs.extend([segment(self.entry_label(id)), segment(choice)]);
}
ManagerPage::Input(id) => {
breadcrumbs.extend([segment(self.entry_label(id)), segment("Input")]);
}
ManagerPage::Output(id) => {
let stated = self.queue_entry(id).is_some_and(|entry| entry.output_naming() == OutputNaming::Stated);
let named = if stated { "Output" } else { "File name" };
breadcrumbs.extend([segment(self.entry_label(id)), segment(named)]);
}
ManagerPage::Log(id) => {
breadcrumbs.extend([segment(self.entry_label(id)), segment("Log")]);
}
ManagerPage::Report(id) => {
breadcrumbs.extend([segment(self.entry_label(id)), segment("Report")]);
}
ManagerPage::Command(id) => {
breadcrumbs.extend([segment(self.entry_label(id)), segment("Command")]);
}
}
breadcrumbs
}
fn entry_label(&self, id: This::Id) -> &str {
self.queue_entry(id).map_or("Missing entry", QueueEntryAlg::label)
}
}
fn segment(label: impl Into<String>) -> Breadcrumb {
Breadcrumb { label: label.into() }
}