mirror of
https://github.com/readest/readest.git
synced 2026-04-28 19:42:21 +00:00
This commit is contained in:
parent
11bc7497e8
commit
ba3f060cc4
44 changed files with 341 additions and 97 deletions
|
|
@ -1,6 +1,8 @@
|
|||
use tauri::{command, AppHandle, Runtime};
|
||||
use std::path::PathBuf;
|
||||
use tauri::{command, AppHandle, Runtime, State};
|
||||
|
||||
use crate::models::*;
|
||||
use crate::DirectoryCallbackState;
|
||||
use crate::NativeBridgeExt;
|
||||
use crate::Result;
|
||||
|
||||
|
|
@ -160,8 +162,21 @@ pub(crate) async fn open_external_url<R: Runtime>(
|
|||
#[command]
|
||||
pub(crate) async fn select_directory<R: Runtime>(
|
||||
app: AppHandle<R>,
|
||||
callback_state: State<'_, DirectoryCallbackState<R>>,
|
||||
) -> Result<SelectDirectoryResponse> {
|
||||
app.native_bridge().select_directory()
|
||||
let result = app.native_bridge().select_directory()?;
|
||||
|
||||
if let Some(dir_path) = &result.path {
|
||||
let path = PathBuf::from(dir_path);
|
||||
|
||||
if let Ok(callback_guard) = callback_state.callback.lock() {
|
||||
if let Some(callback) = callback_guard.as_ref() {
|
||||
callback(&app, &path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
#[command]
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
use std::sync::{Arc, Mutex};
|
||||
use tauri::{
|
||||
plugin::{Builder, TauriPlugin},
|
||||
Manager, Runtime,
|
||||
|
|
@ -17,6 +18,9 @@ mod platform;
|
|||
|
||||
pub use error::{Error, Result};
|
||||
|
||||
use std::path::PathBuf;
|
||||
use tauri::AppHandle;
|
||||
|
||||
#[cfg(desktop)]
|
||||
use desktop::NativeBridge;
|
||||
#[cfg(mobile)]
|
||||
|
|
@ -33,6 +37,20 @@ impl<R: Runtime, T: Manager<R>> crate::NativeBridgeExt<R> for T {
|
|||
}
|
||||
}
|
||||
|
||||
type DirectoryCallback<R> = Box<dyn Fn(&AppHandle<R>, &PathBuf) + Send + Sync>;
|
||||
|
||||
pub struct DirectoryCallbackState<R: Runtime> {
|
||||
pub callback: Arc<Mutex<Option<DirectoryCallback<R>>>>,
|
||||
}
|
||||
|
||||
impl<R: Runtime> Default for DirectoryCallbackState<R> {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
callback: Arc::new(Mutex::new(None)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Initializes the plugin.
|
||||
pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
||||
Builder::new("native-bridge")
|
||||
|
|
@ -66,7 +84,18 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
|
|||
#[cfg(desktop)]
|
||||
let native_bridge = desktop::init(app, api)?;
|
||||
app.manage(native_bridge);
|
||||
app.manage(DirectoryCallbackState::<R>::default());
|
||||
Ok(())
|
||||
})
|
||||
.build()
|
||||
}
|
||||
|
||||
pub fn register_select_directory_callback<R: Runtime>(
|
||||
app: &AppHandle<R>,
|
||||
callback: impl Fn(&AppHandle<R>, &PathBuf) + Send + Sync + 'static,
|
||||
) {
|
||||
if let Some(state) = app.try_state::<DirectoryCallbackState<R>>() {
|
||||
let mut cb = state.callback.lock().unwrap();
|
||||
*cb = Some(Box::new(callback));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue