use crate::gui::editor::{
material_lookup::{EditorMaterialLookup, resolved_gem_material},
state::{design_material_index_from_name, design_material_options, parse_design_material_form},
};
use indicatrix::optics::materials::GemMaterial;
use indicatrix_cut_core::{Design, MaterialSelection, ResolvedMaterial};
pub(super) fn resolve_target_selection(
design: &Design,
custom: &[GemMaterial],
combo_index: i32,
ri_override_text: &str,
) -> Result<MaterialSelection, String> {
let options = design_material_options(custom);
parse_design_material_form(combo_index, ri_override_text, &options, &design.material)
}
pub(super) fn target_material_selection(
design: &Design,
custom: &[GemMaterial],
combo_index: i32,
ri_override_text: &str,
) -> MaterialSelection {
resolve_target_selection(design, custom, combo_index, ri_override_text)
.unwrap_or_else(|_| design.material.clone())
}
pub(super) fn resolved_material_from_selection(
selection: &MaterialSelection,
custom: &[GemMaterial],
) -> ResolvedMaterial {
let lookup = EditorMaterialLookup::new(custom);
let resolved = selection.resolve(&lookup);
let gem = resolved_gem_material(selection, &lookup);
ResolvedMaterial { gem, ..resolved }
}
pub(super) fn target_display_name(selection: &MaterialSelection) -> String {
selection.name.clone().unwrap_or_else(|| {
if selection.refractive_index_override.is_some() {
"Custom RI".to_string()
} else {
"(none)".to_string()
}
})
}
pub(super) fn initial_target_index(material: &MaterialSelection, options: &[String]) -> i32 {
if material.name.is_none() && material.refractive_index_override.is_some() {
return i32::try_from(options.len()).unwrap_or(i32::MAX) - 1;
}
design_material_index_from_name(material.name.as_deref(), options)
}