use std::{
cell::RefCell,
collections::BTreeSet,
rc::Rc,
sync::{Arc, Mutex},
};
use slint::{ComponentHandle, SharedString};
use crate::{
EditorModel, MainWindow, ViewportModel,
bridge::render_thread::RenderContext,
gui::{
editor::{
state::EditorState,
view::{refresh_editor_panel_stale, sync_viewport_material_link},
},
show_toast,
},
};
pub(in crate::gui::editor) fn setup_viewport_material_linked_changed_callback(
ui: &MainWindow,
state: &Rc<RefCell<EditorState>>,
render_ctx: &Arc<Mutex<RenderContext>>,
) {
let state_linked = Rc::clone(state);
let render_ctx_linked = Arc::clone(render_ctx);
let ui_weak = ui.as_weak();
ui.global::<ViewportModel>()
.on_viewport_material_linked_changed(move |linked: bool| {
let Some(ui) = ui_weak.upgrade() else {
return;
};
if linked {
let st = state_linked.borrow();
let selected_material_index = {
let mut ctx = render_ctx_linked
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
sync_viewport_material_link(&ui, &mut ctx, &st.design)
};
drop(st);
if let Some(idx) = selected_material_index {
ui.global::<ViewportModel>()
.set_selected_material_index(idx);
}
}
});
let state_props = Rc::clone(state);
let render_ctx_props = Arc::clone(render_ctx);
let ui_weak_props = ui.as_weak();
ui.global::<EditorModel>().on_apply_printed_proportions(
move |vol_w3: SharedString,
lw: SharedString,
cw: SharedString,
pw: SharedString,
hw: SharedString| {
let Some(ui) = ui_weak_props.upgrade() else {
return;
};
let props = match parse_printed_proportions_form(&vol_w3, &lw, &cw, &pw, &hw) {
Ok(props) => props,
Err(e) => {
show_toast(&ui, &e, "error");
return;
}
};
let has_any = props.vol_w3.is_some()
|| props.lw.is_some()
|| props.cw.is_some()
|| props.pw.is_some()
|| props.hw.is_some();
let mut st = state_props.borrow_mut();
st.printed_proportions = has_any.then_some(props);
refresh_editor_panel_stale(&ui, &render_ctx_props, &st, &BTreeSet::new());
drop(st);
show_toast(
&ui,
if has_any {
"Printed proportions saved -- Deep Solve can now verify against them."
} else {
"Printed proportions cleared."
},
"success",
);
},
);
}
#[cfg(test)]
pub(super) use indicatrix_editor::printed_proportions::parse_printed_proportions_field;
pub(super) use indicatrix_editor::printed_proportions::parse_printed_proportions_form;