use std::borrow::Cow; use crate::Element; pub struct ContextDrawer<'a, Message: Clone + 'static> { pub title: Option>, pub header_actions: Vec>, pub header: Option>, pub content: Element<'a, Message>, pub footer: Option>, pub on_close: Message, } #[cfg(feature = "about")] pub fn about<'a, Message: Clone + 'static>( about: &'a crate::widget::about::About, on_url_press: impl Fn(String) -> Message, on_close: Message, ) -> ContextDrawer<'a, Message> { context_drawer(crate::widget::about(about, on_url_press), on_close) } pub fn context_drawer<'a, Message: Clone + 'static>( content: impl Into>, on_close: Message, ) -> ContextDrawer<'a, Message> { ContextDrawer { title: None, content: content.into(), header_actions: vec![], footer: None, on_close, header: None, } } impl<'a, Message: Clone + 'static> ContextDrawer<'a, Message> { /// Set a context drawer header title pub fn title(mut self, title: impl Into>) -> Self { self.title = Some(title.into()); self } /// App-specific actions at the start of the context drawer header pub fn header_actions( mut self, header_actions: impl IntoIterator>, ) -> Self { self.header_actions = header_actions.into_iter().collect(); self } /// Non-scrolling elements placed below the context drawer title row pub fn header(mut self, header: impl Into>) -> Self { self.header = Some(header.into()); self } /// Elements placed below the context drawer scrollable pub fn footer(mut self, footer: impl Into>) -> Self { self.footer = Some(footer.into()); self } }