use std::cell::RefCell;
use indicatrix_cut_core::Design;
use crate::gui::{
editor::auto_solve,
solid_preview::{
facet_map::FacetMap,
preview_state::{FacetOverlay, SolidPreviewState},
},
};
thread_local! {
static FACET_OVERLAY: RefCell<FacetOverlay> = const {
RefCell::new(FacetOverlay {
hovered: None,
selected_facet: None,
multi_selected: Vec::new(),
provisional: Vec::new(),
moved: Vec::new(),
})
};
}
pub(in crate::gui::editor) fn resubmit_facet_overlay(
preview_state: &SolidPreviewState,
mutate: impl FnOnce(&mut FacetOverlay),
) {
let overlay = FACET_OVERLAY.with(|cell| {
let mut overlay = cell.borrow_mut();
mutate(&mut overlay);
overlay.clone()
});
preview_state.set_outlines(&overlay.provisional, &overlay.moved);
preview_state.request_facet_overlay(overlay);
}
pub(in crate::gui::editor) fn set_hovered_facet(
preview_state: &SolidPreviewState,
facet: Option<u32>,
) {
if FACET_OVERLAY.with(|cell| cell.borrow().hovered) == facet {
return;
}
resubmit_facet_overlay(preview_state, |overlay| overlay.hovered = facet);
}
pub(super) fn facet_map_from_aligned_solve(design: &Design) -> FacetMap {
let solved = auto_solve::solid_last_solved()
.and_then(|cache| {
cache
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.clone()
})
.filter(|(_, solved)| solved.len() == design.tiers.len())
.map(|(_, solved)| solved)
.unwrap_or_default();
FacetMap::from_design(design, &solved)
}