use super::confirm::count_pending_collisions;
use crate::{LibraryModel, MainWindow, gui::show_toast, settings::SettingsPersister};
use indicatrix_vault::db::sqlite::Database;
use slint::{ComponentHandle, Weak};
use std::{
path::{Path, PathBuf},
sync::{Arc, Mutex},
thread,
};
pub(super) fn last_save_folder(settings_store: &Arc<SettingsPersister>) -> Option<PathBuf> {
settings_store
.snapshot()
.settings
.recent_native_files
.first()
.map(PathBuf::from)
.and_then(|p| p.parent().map(Path::to_path_buf))
}
pub(super) fn spawn_save_folder_rescan(
ui_weak: Weak<MainWindow>,
db: Arc<Mutex<Database>>,
settings_store: Arc<SettingsPersister>,
) {
thread::spawn(move || {
let Some(folder) = last_save_folder(&settings_store) else {
return;
};
let (collisions, total) = count_pending_collisions(&db, &folder, false);
let new_files = total - collisions;
if new_files == 0 {
return;
}
let _ = ui_weak.upgrade_in_event_loop(move |ui| {
show_toast(
&ui,
&format!(
"{new_files} new design file(s) found in your last save folder -- open \
Import > Choose folder to bring {} in.",
if new_files == 1 { "it" } else { "them" }
),
"info",
);
});
});
}
pub(super) fn last_import_directory(settings_store: &Arc<SettingsPersister>) -> Option<PathBuf> {
let remembered = settings_store.snapshot().settings.last_import_directory;
if remembered.is_empty() {
return None;
}
let path = PathBuf::from(remembered);
path.is_dir().then_some(path)
}
pub(super) fn remember_import_directory(
settings_store: &Arc<SettingsPersister>,
directory: Option<&Path>,
) {
let Some(directory) = directory else {
return;
};
let as_string = directory.to_string_lossy().into_owned();
settings_store.update(|s| s.settings.last_import_directory.clone_from(&as_string));
}
pub(super) fn reset_import_progress(ui: &MainWindow) {
ui.global::<LibraryModel>().set_import_done(0);
ui.global::<LibraryModel>().set_import_total(0);
ui.global::<LibraryModel>().set_import_progress(0.0);
}