use std::{cell::RefCell, rc::Rc};
use slint::{ComponentHandle, Model};
use super::facet_overlay::{facet_map_from_aligned_solve, resubmit_facet_overlay};
use crate::{
EditorModel, EditorTierItem, MainWindow,
gui::{
editor::{
auto_solve,
state::{EditorState, apply_multi_selection, push_multi_selected_count, push_tiers},
},
tutorial_events::raise,
},
};
use indicatrix_editor::guide::TIERS_MULTI_SELECTED;
pub(in crate::gui::editor) fn setup_toggle_multi_select_callback(
ui: &MainWindow,
state: &Rc<RefCell<EditorState>>,
) {
setup_select_tier_range_callback(ui, state);
let state = Rc::clone(state);
let ui_weak = ui.as_weak();
ui.global::<EditorModel>()
.on_toggle_multi_select(move |index: i32| {
let Some(ui) = ui_weak.upgrade() else {
return;
};
let Ok(index) = usize::try_from(index) else {
return;
};
let mut st = state.borrow_mut();
if !st.multi_selected.remove(&index) {
st.multi_selected.insert(index);
}
let multi_selected = st.multi_selected.clone();
let mut rows: Vec<EditorTierItem> =
ui.global::<EditorModel>().get_tiers().iter().collect();
apply_multi_selection(&mut rows, &multi_selected);
push_tiers(&ui, rows);
push_multi_selected_count(&ui, multi_selected.len());
if let Some(preview_state) = auto_solve::preview_state() {
let facet_map = facet_map_from_aligned_solve(&st.design);
let facet_ids: Vec<u32> = multi_selected
.iter()
.flat_map(|&tier_index| facet_map.facets_of_tier(tier_index).iter().copied())
.collect();
resubmit_facet_overlay(&preview_state, |overlay| {
overlay.multi_selected = facet_ids;
});
}
drop(st);
report_group(&ui, multi_selected.len());
});
}
fn report_group(ui: &MainWindow, count: usize) {
if count >= 2 {
raise(ui, TIERS_MULTI_SELECTED);
}
}
fn setup_select_tier_range_callback(ui: &MainWindow, state: &Rc<RefCell<EditorState>>) {
let state = Rc::clone(state);
let ui_weak = ui.as_weak();
ui.global::<EditorModel>()
.on_select_tier_range(move |index: i32| {
let Some(ui) = ui_weak.upgrade() else {
return;
};
let Ok(index) = usize::try_from(index) else {
return;
};
let flat_count = state.borrow().design.tiers.len();
let anchor = usize::try_from(ui.global::<EditorModel>().get_selected_tier_index())
.ok()
.filter(|&selected| selected < flat_count)
.unwrap_or(index);
let (lo, hi) = if anchor <= index {
(anchor, index)
} else {
(index, anchor)
};
let mut st = state.borrow_mut();
st.multi_selected = (lo..=hi).collect();
let multi_selected = st.multi_selected.clone();
let mut rows: Vec<EditorTierItem> =
ui.global::<EditorModel>().get_tiers().iter().collect();
apply_multi_selection(&mut rows, &multi_selected);
push_tiers(&ui, rows);
push_multi_selected_count(&ui, multi_selected.len());
if let Some(preview_state) = auto_solve::preview_state() {
let facet_map = facet_map_from_aligned_solve(&st.design);
let facet_ids: Vec<u32> = multi_selected
.iter()
.flat_map(|&tier_index| facet_map.facets_of_tier(tier_index).iter().copied())
.collect();
resubmit_facet_overlay(&preview_state, |overlay| {
overlay.multi_selected = facet_ids;
});
}
drop(st);
report_group(&ui, multi_selected.len());
});
}