tauri_nspanel/
lib.rs

1#![allow(deprecated)]
2
3mod macros;
4pub mod raw_nspanel;
5
6use std::{collections::HashMap, sync::Mutex};
7
8use cocoa::base::id;
9use objc_id::ShareId;
10use raw_nspanel::RawNSPanel;
11use tauri::{
12    plugin::{Builder, TauriPlugin},
13    Manager, Runtime, WebviewWindow,
14};
15
16pub extern crate block;
17pub extern crate cocoa;
18pub extern crate objc;
19pub extern crate objc_foundation;
20pub extern crate objc_id;
21pub extern crate tauri;
22
23pub type Panel = ShareId<RawNSPanel>;
24
25#[derive(Default)]
26pub struct Store {
27    panels: HashMap<String, ShareId<RawNSPanel>>,
28}
29
30pub struct WebviewPanelManager(pub Mutex<Store>);
31
32impl Default for WebviewPanelManager {
33    fn default() -> Self {
34        Self(Mutex::new(Store::default()))
35    }
36}
37
38pub trait ManagerExt<R: Runtime> {
39    fn get_webview_panel(&self, label: &str) -> Result<ShareId<RawNSPanel>, Error>;
40}
41
42#[derive(Debug)]
43pub enum Error {
44    PanelNotFound,
45}
46
47impl<R: Runtime, T: Manager<R>> ManagerExt<R> for T {
48    fn get_webview_panel(&self, label: &str) -> Result<ShareId<RawNSPanel>, Error> {
49        let manager = self.state::<self::WebviewPanelManager>();
50        let manager = manager.0.lock().unwrap();
51
52        match manager.panels.get(label) {
53            Some(panel) => Ok(panel.clone()),
54            None => Err(Error::PanelNotFound),
55        }
56    }
57}
58
59#[derive(Default)]
60pub struct WebviewPanelConfig {
61    pub delegate: Option<id>,
62}
63
64pub trait WebviewWindowExt<R: Runtime> {
65    fn to_panel(&self) -> tauri::Result<ShareId<RawNSPanel>>;
66}
67
68impl<R: Runtime> WebviewWindowExt<R> for WebviewWindow<R> {
69    fn to_panel(&self) -> tauri::Result<ShareId<RawNSPanel>> {
70        let panel = RawNSPanel::from_window(self.to_owned());
71        let shared_panel = panel.share();
72        let manager = self.state::<self::WebviewPanelManager>();
73
74        manager
75            .0
76            .lock()
77            .unwrap()
78            .panels
79            .insert(self.label().into(), shared_panel.clone());
80
81        Ok(shared_panel)
82    }
83}
84
85/// Initializes the plugin.
86pub fn init<R: Runtime>() -> TauriPlugin<R> {
87    Builder::new("nspanel")
88        .setup(|app, _api| {
89            app.manage(self::WebviewPanelManager::default());
90
91            Ok(())
92        })
93        .build()
94}