#[cfg(target_os = "windows")]
#[path = "windows/mod.rs"]
mod platform;
#[cfg(all(
any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
),
feature = "gtk"
))]
#[path = "gtk/mod.rs"]
mod platform;
#[cfg(target_os = "macos")]
#[path = "macos/mod.rs"]
mod platform;
use std::{
cell::{Ref, RefCell, RefMut},
rc::Rc,
};
use crate::{items::*, IsMenuItem, MenuItemKind, MenuItemType};
pub(crate) use self::platform::*;
impl dyn IsMenuItem + '_ {
fn child(&self) -> Rc<RefCell<MenuChild>> {
match self.kind() {
MenuItemKind::MenuItem(i) => i.inner,
MenuItemKind::Submenu(i) => i.inner,
MenuItemKind::Predefined(i) => i.inner,
MenuItemKind::Check(i) => i.inner,
MenuItemKind::Icon(i) => i.inner,
}
}
}
impl MenuChild {
fn kind(&self, c: Rc<RefCell<MenuChild>>) -> MenuItemKind {
match self.item_type() {
MenuItemType::Submenu => {
let id = c.borrow().id().clone();
MenuItemKind::Submenu(Submenu {
id: Rc::new(id),
inner: c,
})
}
MenuItemType::MenuItem => {
let id = c.borrow().id().clone();
MenuItemKind::MenuItem(MenuItem {
id: Rc::new(id),
inner: c,
})
}
MenuItemType::Predefined => {
let id = c.borrow().id().clone();
MenuItemKind::Predefined(PredefinedMenuItem {
id: Rc::new(id),
inner: c,
})
}
MenuItemType::Check => {
let id = c.borrow().id().clone();
MenuItemKind::Check(CheckMenuItem {
id: Rc::new(id),
inner: c,
})
}
MenuItemType::Icon => {
let id = c.borrow().id().clone();
MenuItemKind::Icon(IconMenuItem {
id: Rc::new(id),
inner: c,
})
}
}
}
}
#[allow(unused)]
impl MenuItemKind {
pub(crate) fn as_ref(&self) -> &dyn IsMenuItem {
match self {
MenuItemKind::MenuItem(i) => i,
MenuItemKind::Submenu(i) => i,
MenuItemKind::Predefined(i) => i,
MenuItemKind::Check(i) => i,
MenuItemKind::Icon(i) => i,
}
}
pub(crate) fn child(&self) -> Ref<'_, MenuChild> {
match self {
MenuItemKind::MenuItem(i) => i.inner.borrow(),
MenuItemKind::Submenu(i) => i.inner.borrow(),
MenuItemKind::Predefined(i) => i.inner.borrow(),
MenuItemKind::Check(i) => i.inner.borrow(),
MenuItemKind::Icon(i) => i.inner.borrow(),
}
}
pub(crate) fn child_mut(&self) -> RefMut<'_, MenuChild> {
match self {
MenuItemKind::MenuItem(i) => i.inner.borrow_mut(),
MenuItemKind::Submenu(i) => i.inner.borrow_mut(),
MenuItemKind::Predefined(i) => i.inner.borrow_mut(),
MenuItemKind::Check(i) => i.inner.borrow_mut(),
MenuItemKind::Icon(i) => i.inner.borrow_mut(),
}
}
}