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
85pub 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}