|
@@ -2,97 +2,106 @@
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
-use super::AboutMetadata;
|
|
|
-use crate::{menu::MenuId, resources::Resource, run_main_thread, AppHandle, Manager, Runtime};
|
|
|
-
|
|
|
-/// A predefined (native) menu item which has a predfined behavior by the OS or by this crate.
|
|
|
-pub struct PredefinedMenuItem<R: Runtime> {
|
|
|
- pub(crate) id: MenuId,
|
|
|
- pub(crate) inner: muda::PredefinedMenuItem,
|
|
|
- pub(crate) app_handle: AppHandle<R>,
|
|
|
-}
|
|
|
+use std::sync::Arc;
|
|
|
|
|
|
-impl<R: Runtime> Clone for PredefinedMenuItem<R> {
|
|
|
- fn clone(&self) -> Self {
|
|
|
- Self {
|
|
|
- id: self.id.clone(),
|
|
|
- inner: self.inner.clone(),
|
|
|
- app_handle: self.app_handle.clone(),
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+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};
|
|
|
|
|
|
-/// # Safety
|
|
|
-///
|
|
|
-/// We make sure it always runs on the main thread.
|
|
|
-unsafe impl<R: Runtime> Sync for PredefinedMenuItem<R> {}
|
|
|
-unsafe impl<R: Runtime> Send for PredefinedMenuItem<R> {}
|
|
|
+impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
+ /// Separator menu item
|
|
|
+ pub fn separator<M: Manager<R>>(manager: &M) -> crate::Result<Self> {
|
|
|
+ let handle = manager.app_handle();
|
|
|
+ let app_handle = handle.clone();
|
|
|
|
|
|
-impl<R: Runtime> super::sealed::IsMenuItemBase for PredefinedMenuItem<R> {
|
|
|
- fn inner_muda(&self) -> &dyn muda::IsMenuItem {
|
|
|
- &self.inner
|
|
|
- }
|
|
|
-}
|
|
|
+ let item = run_main_thread!(handle, || {
|
|
|
+ let item = muda::PredefinedMenuItem::separator();
|
|
|
+ PredefinedMenuItemInner {
|
|
|
+ id: item.id().clone(),
|
|
|
+ inner: Some(item),
|
|
|
+ app_handle,
|
|
|
+ }
|
|
|
+ })?;
|
|
|
|
|
|
-impl<R: Runtime> super::IsMenuItem<R> for PredefinedMenuItem<R> {
|
|
|
- fn kind(&self) -> super::MenuItemKind<R> {
|
|
|
- super::MenuItemKind::Predefined(self.clone())
|
|
|
+ Ok(Self(Arc::new(item)))
|
|
|
}
|
|
|
|
|
|
- fn id(&self) -> &MenuId {
|
|
|
- self.id()
|
|
|
- }
|
|
|
-}
|
|
|
+ /// Copy menu 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();
|
|
|
|
|
|
-impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
- /// Separator menu item
|
|
|
- pub fn separator<M: Manager<R>>(manager: &M) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::separator();
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
- }
|
|
|
+ let text = text.map(|t| t.to_owned());
|
|
|
|
|
|
- /// Copy menu item
|
|
|
- pub fn copy<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::copy(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Cut menu item
|
|
|
- pub fn cut<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::cut(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Paste menu item
|
|
|
- pub fn paste<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::paste(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// SelectAll menu item
|
|
|
- pub fn select_all<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::select_all(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Undo menu item
|
|
@@ -100,26 +109,44 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Windows / Linux:** Unsupported.
|
|
|
- pub fn undo<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::undo(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
/// Redo menu item
|
|
|
///
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Windows / Linux:** Unsupported.
|
|
|
- pub fn redo<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::redo(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Minimize window menu item
|
|
@@ -127,13 +154,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Linux:** Unsupported.
|
|
|
- pub fn minimize<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::minimize(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Maximize window menu item
|
|
@@ -141,13 +177,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Linux:** Unsupported.
|
|
|
- pub fn maximize<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::maximize(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Fullscreen menu item
|
|
@@ -155,13 +200,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Windows / Linux:** Unsupported.
|
|
|
- pub fn fullscreen<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::fullscreen(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Hide window menu item
|
|
@@ -169,13 +223,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Linux:** Unsupported.
|
|
|
- pub fn hide<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::hide(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Hide other windows menu item
|
|
@@ -183,13 +246,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Linux:** Unsupported.
|
|
|
- pub fn hide_others<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::hide_others(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Show all app windows menu item
|
|
@@ -197,13 +269,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Windows / Linux:** Unsupported.
|
|
|
- pub fn show_all<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::show_all(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Close window menu item
|
|
@@ -211,13 +292,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Linux:** Unsupported.
|
|
|
- pub fn close_window<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::close_window(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Quit app menu item
|
|
@@ -225,13 +315,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Linux:** Unsupported.
|
|
|
- pub fn quit<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::quit(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// About app menu item
|
|
@@ -239,13 +338,22 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
manager: &M,
|
|
|
text: Option<&str>,
|
|
|
metadata: Option<AboutMetadata>,
|
|
|
- ) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::about(text, metadata.map(Into::into));
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ ) -> 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::about(text.as_deref(), metadata.map(Into::into));
|
|
|
+ PredefinedMenuItemInner {
|
|
|
+ id: item.id().clone(),
|
|
|
+ inner: Some(item),
|
|
|
+ app_handle,
|
|
|
+ }
|
|
|
+ })?;
|
|
|
+
|
|
|
+ Ok(Self(Arc::new(item)))
|
|
|
}
|
|
|
|
|
|
/// Services menu item
|
|
@@ -253,23 +361,32 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// ## Platform-specific:
|
|
|
///
|
|
|
/// - **Windows / Linux:** Unsupported.
|
|
|
- pub fn services<M: Manager<R>>(manager: &M, text: Option<&str>) -> Self {
|
|
|
- let inner = muda::PredefinedMenuItem::services(text);
|
|
|
- Self {
|
|
|
- id: inner.id().clone(),
|
|
|
- inner,
|
|
|
- app_handle: manager.app_handle().clone(),
|
|
|
- }
|
|
|
+ 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)))
|
|
|
}
|
|
|
|
|
|
/// Returns a unique identifier associated with this menu item.
|
|
|
pub fn id(&self) -> &MenuId {
|
|
|
- &self.id
|
|
|
+ &self.0.id
|
|
|
}
|
|
|
|
|
|
/// Get the text for this menu item.
|
|
|
pub fn text(&self) -> crate::Result<String> {
|
|
|
- run_main_thread!(self, |self_: Self| self_.inner.text())
|
|
|
+ run_item_main_thread!(self, |self_: Self| (*self_.0).as_ref().text())
|
|
|
}
|
|
|
|
|
|
/// Set the text for this menu item. `text` could optionally contain
|
|
@@ -277,13 +394,11 @@ impl<R: Runtime> PredefinedMenuItem<R> {
|
|
|
/// for this menu item. To display a `&` without assigning a mnemenonic, use `&&`.
|
|
|
pub fn set_text<S: AsRef<str>>(&self, text: S) -> crate::Result<()> {
|
|
|
let text = text.as_ref().to_string();
|
|
|
- run_main_thread!(self, |self_: Self| self_.inner.set_text(text))
|
|
|
+ run_item_main_thread!(self, |self_: Self| (*self_.0).as_ref().set_text(text))
|
|
|
}
|
|
|
|
|
|
/// The application handle associated with this type.
|
|
|
pub fn app_handle(&self) -> &AppHandle<R> {
|
|
|
- &self.app_handle
|
|
|
+ &self.0.app_handle
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-impl<R: Runtime> Resource for PredefinedMenuItem<R> {}
|