mod adopt;
mod batch_tilt;
mod deep_solve_pin;
mod deep_solve_run;
mod optimize_outcome;
mod optimize_run;
pub(in crate::gui::editor) use adopt::setup_adopt_meet_callback;
pub(in crate::gui::editor) use batch_tilt::setup_batch_tilt_for_open_design_callback;
pub(in crate::gui::editor) use deep_solve_pin::{
setup_deep_solve_cancel_callback, setup_deep_solve_pin_callback,
};
pub(in crate::gui::editor) use deep_solve_run::setup_deep_solve_callback;
pub(in crate::gui::editor) use optimize_outcome::{
setup_optimize_apply_callback, setup_optimize_cancel_callback, setup_optimize_preview_callback,
};
pub(in crate::gui::editor) use optimize_run::setup_optimize_callback;
use super::super::{auto_solve, deep_solve, state::EditorState};
use crate::{EditorModel, MainWindow, OptimizeResultRow};
use slint::{ComponentHandle, ModelRc, VecModel};
use std::{
cell::RefCell,
sync::{
Arc,
atomic::{AtomicU64, Ordering as AtomicOrdering},
},
};
thread_local! {
static LAST_DEEP_SOLVE_DELTAS: RefCell<Vec<deep_solve::TierMastDelta>> =
const { RefCell::new(Vec::new()) };
static DEEP_SOLVE_ACTIVITY_ID: RefCell<Option<u64>> = const { RefCell::new(None) };
static OPTIMIZE_ACTIVITY_ID: RefCell<Option<u64>> = const { RefCell::new(None) };
}
struct RunProvenance {
generation: Arc<AtomicU64>,
started_generation: u64,
design_epoch: Arc<AtomicU64>,
started_epoch: u64,
}
impl RunProvenance {
fn capture(state: &EditorState) -> Self {
Self {
generation: Arc::clone(&state.generation),
started_generation: state.generation.load(AtomicOrdering::Relaxed),
design_epoch: Arc::clone(&state.design_epoch),
started_epoch: state.design_epoch.load(AtomicOrdering::Relaxed),
}
}
fn is_stale(&self) -> bool {
self.generation.load(AtomicOrdering::Relaxed) != self.started_generation
}
fn design_replaced(&self) -> bool {
self.design_epoch.load(AtomicOrdering::Relaxed) != self.started_epoch
}
}
pub(in crate::gui::editor) fn clear_analysis_results(ui: &MainWindow) {
if let Some(activity) = auto_solve::activity() {
if let Some(id) = DEEP_SOLVE_ACTIVITY_ID.with(RefCell::take) {
activity.finish(id);
}
if let Some(id) = OPTIMIZE_ACTIVITY_ID.with(RefCell::take) {
activity.finish(id);
}
}
ui.global::<EditorModel>().set_deep_solve_running(false);
ui.global::<EditorModel>().set_optimize_running(false);
ui.global::<EditorModel>().set_deep_solve_status("".into());
ui.global::<EditorModel>()
.set_deep_solve_status_is_problem(false);
ui.global::<EditorModel>()
.set_deep_solve_tier_rows(ModelRc::new(VecModel::from(
Vec::<crate::DeepSolveTierRow>::new(),
)));
ui.global::<EditorModel>().set_optimize_status("".into());
ui.global::<EditorModel>()
.set_optimize_status_is_problem(false);
ui.global::<EditorModel>()
.set_optimize_result_rows(ModelRc::new(
VecModel::from(Vec::<OptimizeResultRow>::new()),
));
ui.global::<EditorModel>()
.set_optimize_change_rows(ModelRc::new(VecModel::from(
Vec::<crate::OptimizeChangeRow>::new(),
)));
ui.global::<EditorModel>().set_optimize_can_apply(false);
crate::gui::editor::optimize_panel::clear_results(ui);
ui.global::<EditorModel>().set_deep_solve_stale(false);
ui.global::<EditorModel>().set_optimize_stale(false);
LAST_DEEP_SOLVE_DELTAS.with(|cell| cell.borrow_mut().clear());
}