muda/builders/
submenu.rs

1// Copyright 2022-2022 Tauri Programme within The Commons Conservancy
2// SPDX-License-Identifier: Apache-2.0
3// SPDX-License-Identifier: MIT
4
5use crate::{Icon, IsMenuItem, MenuId, NativeIcon, Submenu};
6
7/// A builder type for [`Submenu`]
8#[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    /// Set the id this submenu.
33    pub fn id(mut self, id: MenuId) -> Self {
34        self.id.replace(id);
35        self
36    }
37
38    /// Set the text for this submenu.
39    ///
40    /// See [`Submenu::set_text`] for more info.
41    pub fn text<S: Into<String>>(mut self, text: S) -> Self {
42        self.text = text.into();
43        self
44    }
45
46    /// Enable or disable this submenu.
47    pub fn enabled(mut self, enabled: bool) -> Self {
48        self.enabled = enabled;
49        self
50    }
51
52    /// Add an item to this submenu.
53    pub fn item(mut self, item: &'a dyn IsMenuItem) -> Self {
54        self.items.push(item);
55        self
56    }
57
58    /// Add these items to this submenu.
59    pub fn items(mut self, items: &[&'a dyn IsMenuItem]) -> Self {
60        self.items.extend_from_slice(items);
61        self
62    }
63
64    /// Set an icon for this submenu.
65    pub fn icon(mut self, icon: Icon) -> Self {
66        self.icon = Some(icon);
67        self
68    }
69
70    /// Set a native icon for this submenu.
71    pub fn native_icon(mut self, icon: NativeIcon) -> Self {
72        self.native_icon = Some(icon);
73        self
74    }
75
76    /// Build this menu item.
77    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}