use crate::{
EditorModel, MainWindow, bridge::render_thread::RenderContext, settings::SettingsPersister,
};
use slint::ComponentHandle;
use std::sync::{Arc, Mutex};
pub(super) fn setup_close_confirm_callbacks(
ui: &MainWindow,
render_ctx: &Arc<Mutex<RenderContext>>,
settings_store: &Arc<SettingsPersister>,
) {
let render_ctx_listener = render_ctx.clone();
let settings_store_listener = settings_store.clone();
crate::gui::editor::native_io::on_save_completed(move |ui, state| {
{
let mut st = state.borrow_mut();
match st.after_save.take() {
Some(crate::gui::editor::native_io::AfterSave::CloseWindow) => {}
other => {
st.after_save = other;
return;
}
}
}
render_ctx_listener
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.running = false;
settings_store_listener.flush();
crate::gui::editor::close_compare_window();
crate::gui::rough_plan::close_planner_window();
crate::gui::render_jobs::stop_for_app_close();
let _ = ui.hide();
});
let ui_weak_save = ui.as_weak();
ui.on_close_confirm_save(move || {
let Some(ui) = ui_weak_save.upgrade() else {
return;
};
ui.set_close_confirm_open(false);
crate::gui::editor::native_io::request_save_then_close();
ui.global::<EditorModel>().invoke_save_native();
});
let render_ctx_discard = render_ctx.clone();
let settings_store_discard = settings_store.clone();
let ui_weak_discard = ui.as_weak();
ui.on_close_confirm_discard(move || {
let Some(ui) = ui_weak_discard.upgrade() else {
return;
};
ui.set_close_confirm_open(false);
render_ctx_discard
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.running = false;
settings_store_discard.flush();
crate::gui::editor::close_compare_window();
crate::gui::rough_plan::close_planner_window();
crate::gui::render_jobs::stop_for_app_close();
let _ = ui.hide();
});
}