use crate::{
BatchModel, LibraryModel, MainWindow,
bridge::library::source::LibrarySource,
gui::{
batch::{preview, tilt},
show_toast,
},
};
use indicatrix_vault::db::sqlite::Database;
use slint::ComponentHandle;
use std::{
cell::RefCell,
sync::{Arc, Mutex, PoisonError},
};
thread_local! {
static PENDING_TILT: RefCell<Option<Vec<i64>>> = const { RefCell::new(None) };
}
pub fn offer_preview_regeneration(ui: &MainWindow, ids: &[i64]) {
preview::offer_batch_confirmation(ui, ids);
ui.global::<BatchModel>().set_preview_offer_regenerate(true);
}
pub fn offer_tilt_regeneration(ui: &MainWindow, ids: &[i64]) {
tilt::offer_batch_confirmation(ui, ids);
ui.global::<BatchModel>().set_tilt_offer_regenerate(true);
}
pub fn preview_dialog_closed(ui: &MainWindow) {
if let Some(ids) = PENDING_TILT.with(|pending| pending.borrow_mut().take()) {
if ui.global::<BatchModel>().get_tilt_batch_running() {
show_toast(
ui,
"A tilt-curve batch is already running -- the tilt half of \"Regenerate Both\" was skipped.",
"info",
);
return;
}
offer_tilt_regeneration(ui, &ids);
}
}
fn clear_pending_tilt() {
PENDING_TILT.with(|pending| *pending.borrow_mut() = None);
}
pub(in crate::gui) fn all_ids_or_toast(
ui: &MainWindow,
db: &Arc<Mutex<Database>>,
source: &Arc<Mutex<LibrarySource>>,
) -> Option<Vec<i64>> {
if source
.lock()
.unwrap_or_else(PoisonError::into_inner)
.is_remote()
{
show_toast(
ui,
"Switch to the local library to regenerate its designs.",
"error",
);
return None;
}
let ids = db
.lock()
.unwrap_or_else(PoisonError::into_inner)
.all_entry_ids();
match ids {
Ok(ids) if ids.is_empty() => {
show_toast(ui, "The library has no designs yet.", "info");
None
}
Ok(ids) => Some(ids),
Err(e) => {
show_toast(ui, &format!("Could not list the library: {e}"), "error");
None
}
}
}
pub(in crate::gui) fn setup_regenerate_all_callbacks(
ui: &MainWindow,
db: &Arc<Mutex<Database>>,
source: &Arc<Mutex<LibrarySource>>,
) {
let (db_p, source_p, weak_p) = (Arc::clone(db), Arc::clone(source), ui.as_weak());
ui.global::<LibraryModel>()
.on_regenerate_all_previews(move || {
clear_pending_tilt();
if let Some(ui) = weak_p.upgrade()
&& let Some(ids) = all_ids_or_toast(&ui, &db_p, &source_p)
{
offer_preview_regeneration(&ui, &ids);
}
});
let (db_t, source_t, weak_t) = (Arc::clone(db), Arc::clone(source), ui.as_weak());
ui.global::<LibraryModel>()
.on_regenerate_all_tilt_curves(move || {
clear_pending_tilt();
if let Some(ui) = weak_t.upgrade()
&& let Some(ids) = all_ids_or_toast(&ui, &db_t, &source_t)
{
offer_tilt_regeneration(&ui, &ids);
}
});
let (db_b, source_b, weak_b) = (Arc::clone(db), Arc::clone(source), ui.as_weak());
ui.global::<LibraryModel>()
.on_regenerate_all_previews_and_tilt_curves(move || {
if let Some(ui) = weak_b.upgrade()
&& let Some(ids) = all_ids_or_toast(&ui, &db_b, &source_b)
{
PENDING_TILT.with(|pending| *pending.borrow_mut() = Some(ids.clone()));
offer_preview_regeneration(&ui, &ids);
}
});
}