1use crate::{Icon, IsMenuItem, MenuId, NativeIcon, Submenu};
6
7#[derive(Clone, Default)]
9pub struct SubmenuBuilder<'a> {
10 text: String,
11 enabled: bool,
12 id: Option<MenuId>,
13 items: Vec<&'a dyn IsMenuItem>,
14 icon: Option<Icon>,
15 native_icon: Option<NativeIcon>,
16}
17
18impl std::fmt::Debug for SubmenuBuilder<'_> {
19 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20 f.debug_struct("SubmenuBuilder")
21 .field("text", &self.text)
22 .field("enabled", &self.enabled)
23 .finish()
24 }
25}
26
27impl<'a> SubmenuBuilder<'a> {
28 pub fn new() -> Self {
29 Default::default()
30 }
31
32 pub fn id(mut self, id: MenuId) -> Self {
34 self.id.replace(id);
35 self
36 }
37
38 pub fn text<S: Into<String>>(mut self, text: S) -> Self {
42 self.text = text.into();
43 self
44 }
45
46 pub fn enabled(mut self, enabled: bool) -> Self {
48 self.enabled = enabled;
49 self
50 }
51
52 pub fn item(mut self, item: &'a dyn IsMenuItem) -> Self {
54 self.items.push(item);
55 self
56 }
57
58 pub fn items(mut self, items: &[&'a dyn IsMenuItem]) -> Self {
60 self.items.extend_from_slice(items);
61 self
62 }
63
64 pub fn icon(mut self, icon: Icon) -> Self {
66 self.icon = Some(icon);
67 self
68 }
69
70 pub fn native_icon(mut self, icon: NativeIcon) -> Self {
72 self.native_icon = Some(icon);
73 self
74 }
75
76 pub fn build(self) -> crate::Result<Submenu> {
78 let submenu = if let Some(id) = self.id {
79 Submenu::with_id_and_items(id, self.text, self.enabled, &self.items)?
80 } else {
81 Submenu::with_items(self.text, self.enabled, &self.items)?
82 };
83
84 if let Some(icon) = self.icon {
85 submenu.set_icon(Some(icon));
86 }
87
88 if let Some(native_icon) = self.native_icon {
89 submenu.set_native_icon(Some(native_icon));
90 }
91
92 Ok(submenu)
93 }
94}