1use std::{cell::RefCell, mem, rc::Rc};
2
3use crate::{
4 accelerator::Accelerator,
5 icon::{Icon, NativeIcon},
6 sealed::IsMenuItemBase,
7 IsMenuItem, MenuId, MenuItemKind,
8};
9
10#[derive(Clone)]
16pub struct IconMenuItem {
17 pub(crate) id: Rc<MenuId>,
18 pub(crate) inner: Rc<RefCell<crate::platform_impl::MenuChild>>,
19}
20
21impl IsMenuItemBase for IconMenuItem {}
22impl IsMenuItem for IconMenuItem {
23 fn kind(&self) -> MenuItemKind {
24 MenuItemKind::Icon(self.clone())
25 }
26
27 fn id(&self) -> &MenuId {
28 self.id()
29 }
30
31 fn into_id(self) -> MenuId {
32 self.into_id()
33 }
34}
35
36impl IconMenuItem {
37 pub fn new<S: AsRef<str>>(
42 text: S,
43 enabled: bool,
44 icon: Option<Icon>,
45 accelerator: Option<Accelerator>,
46 ) -> Self {
47 let item = crate::platform_impl::MenuChild::new_icon(
48 text.as_ref(),
49 enabled,
50 icon,
51 accelerator,
52 None,
53 );
54 Self {
55 id: Rc::new(item.id().clone()),
56 inner: Rc::new(RefCell::new(item)),
57 }
58 }
59
60 pub fn with_id<I: Into<MenuId>, S: AsRef<str>>(
65 id: I,
66 text: S,
67 enabled: bool,
68 icon: Option<Icon>,
69 accelerator: Option<Accelerator>,
70 ) -> Self {
71 let id = id.into();
72 Self {
73 id: Rc::new(id.clone()),
74 inner: Rc::new(RefCell::new(crate::platform_impl::MenuChild::new_icon(
75 text.as_ref(),
76 enabled,
77 icon,
78 accelerator,
79 Some(id),
80 ))),
81 }
82 }
83
84 pub fn with_native_icon<S: AsRef<str>>(
92 text: S,
93 enabled: bool,
94 native_icon: Option<NativeIcon>,
95 accelerator: Option<Accelerator>,
96 ) -> Self {
97 let item = crate::platform_impl::MenuChild::new_native_icon(
98 text.as_ref(),
99 enabled,
100 native_icon,
101 accelerator,
102 None,
103 );
104 Self {
105 id: Rc::new(item.id().clone()),
106 inner: Rc::new(RefCell::new(item)),
107 }
108 }
109
110 pub fn with_id_and_native_icon<I: Into<MenuId>, S: AsRef<str>>(
118 id: I,
119 text: S,
120 enabled: bool,
121 native_icon: Option<NativeIcon>,
122 accelerator: Option<Accelerator>,
123 ) -> Self {
124 let id = id.into();
125 Self {
126 id: Rc::new(id.clone()),
127 inner: Rc::new(RefCell::new(
128 crate::platform_impl::MenuChild::new_native_icon(
129 text.as_ref(),
130 enabled,
131 native_icon,
132 accelerator,
133 Some(id),
134 ),
135 )),
136 }
137 }
138
139 pub fn id(&self) -> &MenuId {
141 &self.id
142 }
143
144 pub fn text(&self) -> String {
146 self.inner.borrow().text()
147 }
148
149 pub fn set_text<S: AsRef<str>>(&self, text: S) {
153 self.inner.borrow_mut().set_text(text.as_ref())
154 }
155
156 pub fn is_enabled(&self) -> bool {
158 self.inner.borrow().is_enabled()
159 }
160
161 pub fn set_enabled(&self, enabled: bool) {
163 self.inner.borrow_mut().set_enabled(enabled)
164 }
165
166 pub fn set_accelerator(&self, accelerator: Option<Accelerator>) -> crate::Result<()> {
168 self.inner.borrow_mut().set_accelerator(accelerator)
169 }
170
171 pub fn set_icon(&self, icon: Option<Icon>) {
173 self.inner.borrow_mut().set_icon(icon)
174 }
175
176 pub fn into_id(mut self) -> MenuId {
178 if let Some(id) = Rc::get_mut(&mut self.id) {
180 mem::take(id)
181 } else {
182 self.id().clone()
183 }
184 }
185}