muda_win/builders/
normal.rs

1use crate::{accelerator::Accelerator, MenuId, MenuItem};
2
3/// A builder type for [`MenuItem`]
4#[derive(Clone, Debug, Default)]
5pub struct MenuItemBuilder {
6    text: String,
7    enabled: bool,
8    id: Option<MenuId>,
9    accelerator: Option<Accelerator>,
10}
11
12impl MenuItemBuilder {
13    pub fn new() -> Self {
14        Default::default()
15    }
16
17    /// Set the id this menu item.
18    pub fn id(mut self, id: MenuId) -> Self {
19        self.id.replace(id);
20        self
21    }
22
23    /// Set the text for this menu item.
24    ///
25    /// See [`MenuItem::set_text`] for more info.
26    pub fn text<S: Into<String>>(mut self, text: S) -> Self {
27        self.text = text.into();
28        self
29    }
30
31    /// Enable or disable this menu item.
32    pub fn enabled(mut self, enabled: bool) -> Self {
33        self.enabled = enabled;
34        self
35    }
36
37    /// Set this menu item accelerator.
38    pub fn accelerator<A: TryInto<Accelerator>>(
39        mut self,
40        accelerator: Option<A>,
41    ) -> crate::Result<Self>
42    where
43        crate::Error: From<<A as TryInto<Accelerator>>::Error>,
44    {
45        self.accelerator = accelerator.map(|a| a.try_into()).transpose()?;
46        Ok(self)
47    }
48
49    /// Build this menu item.
50    pub fn build(self) -> MenuItem {
51        if let Some(id) = self.id {
52            MenuItem::with_id(id, self.text, self.enabled, self.accelerator)
53        } else {
54            MenuItem::new(self.text, self.enabled, self.accelerator)
55        }
56    }
57}