use std::sync::Arc;
use super::run_item_main_thread;
use super::{AboutMetadata, PredefinedMenuItem};
use crate::menu::PredefinedMenuItemInner;
use crate::run_main_thread;
use crate::{menu::MenuId, AppHandle, Manager, Runtime};
impl<R: Runtime> PredefinedMenuItem<R> {
pub fn separator<M: Manager<R>>(manager: &M) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::separator();
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn copy<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::copy(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn cut<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::cut(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn paste<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::paste(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn select_all<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::select_all(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn undo<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::undo(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn redo<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::redo(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn minimize<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::minimize(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn maximize<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::maximize(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn fullscreen<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::fullscreen(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn hide<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::hide(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn hide_others<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::hide_others(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn show_all<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::show_all(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn close_window<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::close_window(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn quit<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::quit(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn about<M: Manager<R>>(
manager: &M,
text: Option<&str>,
metadata: Option<AboutMetadata<'_>>,
) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let metadata = match metadata {
Some(m) => Some(m.try_into()?),
None => None,
};
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::about(text.as_deref(), metadata);
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn services<M: Manager<R>>(manager: &M, text: Option<&str>) -> crate::Result<Self> {
let handle = manager.app_handle();
let app_handle = handle.clone();
let text = text.map(|t| t.to_owned());
let item = run_main_thread!(handle, || {
let item = muda::PredefinedMenuItem::services(text.as_deref());
PredefinedMenuItemInner {
id: item.id().clone(),
inner: Some(item),
app_handle,
}
})?;
Ok(Self(Arc::new(item)))
}
pub fn id(&self) -> &MenuId {
&self.0.id
}
pub fn text(&self) -> crate::Result<String> {
run_item_main_thread!(self, |self_: Self| (*self_.0).as_ref().text())
}
pub fn set_text<S: AsRef<str>>(&self, text: S) -> crate::Result<()> {
let text = text.as_ref().to_string();
run_item_main_thread!(self, |self_: Self| (*self_.0).as_ref().set_text(text))
}
pub fn app_handle(&self) -> &AppHandle<R> {
&self.0.app_handle
}
}