1use std::{cell::RefCell, mem, rc::Rc};
6
7use crate::{accelerator::Accelerator, sealed::IsMenuItemBase, IsMenuItem, MenuId, MenuItemKind};
8
9#[derive(Clone)]
16pub struct CheckMenuItem {
17 pub(crate) id: Rc<MenuId>,
18 pub(crate) inner: Rc<RefCell<crate::platform_impl::MenuChild>>,
19}
20
21impl IsMenuItemBase for CheckMenuItem {}
22impl IsMenuItem for CheckMenuItem {
23 fn kind(&self) -> MenuItemKind {
24 MenuItemKind::Check(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 CheckMenuItem {
37 pub fn new<S: AsRef<str>>(
42 text: S,
43 enabled: bool,
44 checked: bool,
45 accelerator: Option<Accelerator>,
46 ) -> Self {
47 let item = crate::platform_impl::MenuChild::new_check(
48 text.as_ref(),
49 enabled,
50 checked,
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 checked: bool,
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_check(
75 text.as_ref(),
76 enabled,
77 checked,
78 accelerator,
79 Some(id),
80 ))),
81 }
82 }
83
84 pub fn id(&self) -> &MenuId {
86 &self.id
87 }
88
89 pub fn text(&self) -> String {
91 self.inner.borrow().text()
92 }
93
94 pub fn set_text<S: AsRef<str>>(&self, text: S) {
98 self.inner.borrow_mut().set_text(text.as_ref())
99 }
100
101 pub fn is_enabled(&self) -> bool {
103 self.inner.borrow().is_enabled()
104 }
105
106 pub fn set_enabled(&self, enabled: bool) {
108 self.inner.borrow_mut().set_enabled(enabled)
109 }
110
111 pub fn set_accelerator(&self, accelerator: Option<Accelerator>) -> crate::Result<()> {
113 self.inner.borrow_mut().set_accelerator(accelerator)
114 }
115
116 pub fn is_checked(&self) -> bool {
118 self.inner.borrow().is_checked()
119 }
120
121 pub fn set_checked(&self, checked: bool) {
123 self.inner.borrow_mut().set_checked(checked)
124 }
125
126 pub fn into_id(mut self) -> MenuId {
128 if let Some(id) = Rc::get_mut(&mut self.id) {
130 mem::take(id)
131 } else {
132 self.id().clone()
133 }
134 }
135}