use crate::{
accelerator::{Accelerator, KeyAccelerator, MenuAccelerator},
MenuId, MenuItem, TextStyle,
};
#[derive(Clone, Debug)]
pub struct MenuItemBuilder {
text: String,
enabled: bool,
id: Option<MenuId>,
accelerator: Option<MenuAccelerator>,
styled_text: Option<Vec<(String, TextStyle)>>,
}
impl Default for MenuItemBuilder {
fn default() -> Self {
Self {
text: String::new(),
enabled: true,
id: None,
accelerator: None,
styled_text: None,
}
}
}
impl MenuItemBuilder {
pub fn new() -> Self {
Default::default()
}
pub fn id(mut self, id: MenuId) -> Self {
self.id.replace(id);
self
}
pub fn text<S: Into<String>>(mut self, text: S) -> Self {
self.text = text.into();
self
}
pub fn enabled(mut self, enabled: bool) -> Self {
self.enabled = enabled;
self
}
pub fn accelerator<A: TryInto<Accelerator>>(
mut self,
accelerator: Option<A>,
) -> crate::Result<Self>
where
crate::Error: From<<A as TryInto<Accelerator>>::Error>,
{
self.accelerator = accelerator
.map(|a| a.try_into().map(MenuAccelerator::Physical))
.transpose()?;
Ok(self)
}
pub fn key_accelerator<A: TryInto<KeyAccelerator>>(
mut self,
accelerator: Option<A>,
) -> crate::Result<Self>
where
crate::Error: From<<A as TryInto<KeyAccelerator>>::Error>,
{
self.accelerator = accelerator
.map(|a| a.try_into().map(MenuAccelerator::Logical))
.transpose()?;
Ok(self)
}
pub fn styled_text<S: Into<String>>(
mut self,
parts: impl IntoIterator<Item = (S, TextStyle)>,
) -> Self {
self.styled_text = Some(
parts
.into_iter()
.map(|(text, style)| (text.into(), style))
.collect(),
);
self
}
pub fn build(self) -> MenuItem {
let item = if let Some(id) = self.id {
MenuItem::with_id(id, self.text, self.enabled, None)
} else {
MenuItem::new(self.text, self.enabled, None)
};
if let Some(accelerator) = self.accelerator {
let _ = match accelerator {
MenuAccelerator::Physical(accelerator) => item.set_accelerator(Some(accelerator)),
MenuAccelerator::Logical(accelerator) => {
item.set_key_accelerator(Some(accelerator))
}
};
}
if let Some(parts) = self.styled_text {
item.set_styled_text(parts);
}
item
}
}