use super::preview_state::PickBuffer;
use crate::{EditorModel, MainWindow, SolidPreviewModel};
use slint::ComponentHandle;
use std::sync::{Arc, Mutex, PoisonError};
pub type DiagramPick = Arc<Mutex<Option<PickBuffer>>>;
pub type DiagramHoverText = Arc<Mutex<Option<Vec<String>>>>;
pub type DiagramFacetTier = Arc<Mutex<Option<Vec<Option<usize>>>>>;
pub fn setup_diagram_hover_and_click_callbacks(
ui: &MainWindow,
pick: &DiagramPick,
hover_text: &DiagramHoverText,
facet_tier: &DiagramFacetTier,
) {
{
let pick = Arc::clone(pick);
let hover_text = Arc::clone(hover_text);
let ui_weak = ui.as_weak();
ui.global::<SolidPreviewModel>()
.on_diagram_facet_hover(move |x: f32, y: f32| {
let Some(ui) = ui_weak.upgrade() else {
return;
};
let Some(facet_id) = pick
.lock()
.unwrap_or_else(PoisonError::into_inner)
.as_ref()
.and_then(|pick| pick.facet_at(x.max(0.0) as u32, y.max(0.0) as u32))
else {
ui.global::<SolidPreviewModel>()
.set_diagram_hover_text("".into());
return;
};
let text = hover_text
.lock()
.unwrap_or_else(PoisonError::into_inner)
.as_ref()
.and_then(|table| table.get(facet_id as usize))
.cloned()
.unwrap_or_default();
ui.global::<SolidPreviewModel>()
.set_diagram_hover_text(text.into());
});
}
{
let pick = Arc::clone(pick);
let facet_tier = Arc::clone(facet_tier);
let ui_weak = ui.as_weak();
ui.global::<SolidPreviewModel>()
.on_diagram_facet_click(move |x: f32, y: f32| {
let Some(ui) = ui_weak.upgrade() else {
return;
};
let Some(facet_id) = pick
.lock()
.unwrap_or_else(PoisonError::into_inner)
.as_ref()
.and_then(|pick| pick.facet_at(x.max(0.0) as u32, y.max(0.0) as u32))
else {
return;
};
let tier_index = facet_tier
.lock()
.unwrap_or_else(PoisonError::into_inner)
.as_ref()
.and_then(|table| table.get(facet_id as usize).copied())
.flatten();
if let Some(tier_index) = tier_index {
ui.global::<EditorModel>()
.set_selected_tier_index(tier_index as i32);
}
});
}
}