mod catalogue;
mod design;
mod pass;
#[cfg(test)]
mod tests;
use pass::run_mirror_sync;
use super::options::{
MirrorHandle, MirrorOptions, MirrorOutcome, MirrorProgress, mirror_source_id,
};
use crate::{bridge::library::client::LibrarySession, settings::WorkerSettings};
use indicatrix_vault::db::sqlite::Database;
use slint::{ComponentHandle, Weak};
use std::{
sync::{Arc, Mutex, atomic::AtomicBool},
thread,
};
pub fn spawn_mirror_sync<T, P, D>(
ui_weak: Weak<T>,
db: Arc<Mutex<Database>>,
worker: WorkerSettings,
options: MirrorOptions,
on_progress: P,
on_done: D,
) -> MirrorHandle
where
T: ComponentHandle + 'static,
P: Fn(&T, MirrorProgress) + Send + 'static + Clone,
D: Fn(&T, MirrorOutcome) + Send + 'static,
{
let cancel = Arc::new(AtomicBool::new(false));
let cancel_worker = cancel.clone();
let ui_weak_done = ui_weak.clone();
thread::spawn(move || {
let source_id = mirror_source_id(&worker);
let session = LibrarySession::new(worker);
let progress_ui_weak = ui_weak;
let outcome = run_mirror_sync(
&db,
&session,
&source_id,
options,
&cancel_worker,
move |progress| {
let on_progress = on_progress.clone();
let _ =
progress_ui_weak.upgrade_in_event_loop(move |ui| on_progress(&ui, progress));
},
);
let _ = ui_weak_done.upgrade_in_event_loop(move |ui| on_done(&ui, outcome));
});
MirrorHandle { cancel }
}