use crate::{
EditorModel, MainWindow,
bridge::render_thread::RenderContext,
gui::{
editor::{
stall_guard::stall_guard,
state::EditorState,
view::{SolidLastSolved, refresh_editor_panel_stale, submit_preview_replan},
},
show_toast,
solid_preview::preview_state::SolidPreviewState,
},
};
use slint::ComponentHandle;
use std::{
cell::RefCell,
collections::BTreeSet,
rc::Rc,
sync::{Arc, Mutex},
};
pub(in crate::gui::editor) fn setup_adopt_meet_callback(
ui: &MainWindow,
state: &Rc<RefCell<EditorState>>,
render_ctx: &Arc<Mutex<RenderContext>>,
preview_state: &Arc<SolidPreviewState>,
solid_last_solved: &SolidLastSolved,
) {
let state = Rc::clone(state);
let render_ctx = Arc::clone(render_ctx);
let preview_state = Arc::clone(preview_state);
let solid_last_solved = Arc::clone(solid_last_solved);
let ui_weak = ui.as_weak();
ui.global::<EditorModel>().on_adopt_meet(move |index: i32| {
stall_guard("on_adopt_meet", || {
let Some(ui) = ui_weak.upgrade() else {
return;
};
if index < 0 {
return;
}
let index = index as usize;
let mut st = state.borrow_mut();
match st.adopt_imported_meet(index) {
Ok(false) => {}
Ok(true) => {
let dirty: BTreeSet<usize> = std::iter::once(index).collect();
refresh_editor_panel_stale(&ui, &render_ctx, &st, &dirty);
submit_preview_replan(
&ui,
&render_ctx,
&preview_state,
&solid_last_solved,
&st,
dirty,
false,
);
}
Err(e) => show_toast(&ui, &e.to_string(), "error"),
}
});
});
}