use std::{cell::RefCell, mem, rc::Rc};
use crate::{
accelerator::Accelerator,
icon::{Icon, NativeIcon},
sealed::IsMenuItemBase,
IsMenuItem, MenuId, MenuItemKind,
};
#[derive(Clone)]
pub struct IconMenuItem {
pub(crate) id: Rc<MenuId>,
pub(crate) inner: Rc<RefCell<crate::platform_impl::MenuChild>>,
}
impl IsMenuItemBase for IconMenuItem {}
impl IsMenuItem for IconMenuItem {
fn kind(&self) -> MenuItemKind {
MenuItemKind::Icon(self.clone())
}
fn id(&self) -> &MenuId {
self.id()
}
fn into_id(self) -> MenuId {
self.into_id()
}
}
impl IconMenuItem {
pub fn new<S: AsRef<str>>(
text: S,
enabled: bool,
icon: Option<Icon>,
accelerator: Option<Accelerator>,
) -> Self {
let item = crate::platform_impl::MenuChild::new_icon(
text.as_ref(),
enabled,
icon,
accelerator,
None,
);
Self {
id: Rc::new(item.id().clone()),
inner: Rc::new(RefCell::new(item)),
}
}
pub fn with_id<I: Into<MenuId>, S: AsRef<str>>(
id: I,
text: S,
enabled: bool,
icon: Option<Icon>,
accelerator: Option<Accelerator>,
) -> Self {
let id = id.into();
Self {
id: Rc::new(id.clone()),
inner: Rc::new(RefCell::new(crate::platform_impl::MenuChild::new_icon(
text.as_ref(),
enabled,
icon,
accelerator,
Some(id),
))),
}
}
pub fn with_native_icon<S: AsRef<str>>(
text: S,
enabled: bool,
native_icon: Option<NativeIcon>,
accelerator: Option<Accelerator>,
) -> Self {
let item = crate::platform_impl::MenuChild::new_native_icon(
text.as_ref(),
enabled,
native_icon,
accelerator,
None,
);
Self {
id: Rc::new(item.id().clone()),
inner: Rc::new(RefCell::new(item)),
}
}
pub fn with_id_and_native_icon<I: Into<MenuId>, S: AsRef<str>>(
id: I,
text: S,
enabled: bool,
native_icon: Option<NativeIcon>,
accelerator: Option<Accelerator>,
) -> Self {
let id = id.into();
Self {
id: Rc::new(id.clone()),
inner: Rc::new(RefCell::new(
crate::platform_impl::MenuChild::new_native_icon(
text.as_ref(),
enabled,
native_icon,
accelerator,
Some(id),
),
)),
}
}
pub fn id(&self) -> &MenuId {
&self.id
}
pub fn text(&self) -> String {
self.inner.borrow().text()
}
pub fn set_text<S: AsRef<str>>(&self, text: S) {
self.inner.borrow_mut().set_text(text.as_ref())
}
pub fn is_enabled(&self) -> bool {
self.inner.borrow().is_enabled()
}
pub fn set_enabled(&self, enabled: bool) {
self.inner.borrow_mut().set_enabled(enabled)
}
pub fn set_accelerator(&self, accelerator: Option<Accelerator>) -> crate::Result<()> {
self.inner.borrow_mut().set_accelerator(accelerator)
}
pub fn set_icon(&self, icon: Option<Icon>) {
self.inner.borrow_mut().set_icon(icon)
}
pub fn set_native_icon(&self, _icon: Option<NativeIcon>) {
#[cfg(target_os = "macos")]
self.inner.borrow_mut().set_native_icon(_icon)
}
pub fn into_id(mut self) -> MenuId {
if let Some(id) = Rc::get_mut(&mut self.id) {
mem::take(id)
} else {
self.id().clone()
}
}
}