git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

src/color/materials.rs (2.1K)

 1 //! The named materials config defines and the rung bindings (`docs/rfc-material.md` § 5).
 2 
 3 use super::*;
 4 
 5 /// The named materials config defines (`style.surface.material { <name> {…} }`)
 6 /// and the rung bindings (`plate material=`, `plate { root material= }`,
 7 /// `control material=`) — see `docs/rfc-material.md` § 5. Replaced wholesale
 8 /// on every config load, so a node or binding removed from config is gone
 9 /// after a reload.
10 pub(super) static NAMED_MATERIALS: crate::style::StyleCell<Vec<(String, crate::scene::material::MaterialDef)>> = crate::style::StyleCell::new(|s| &s.color.NAMED_MATERIALS, |s| &mut s.color.NAMED_MATERIALS);
11 pub(super) static MATERIAL_BINDINGS: crate::style::StyleCell<[Option<String>; 3]> = crate::style::StyleCell::new(|s| &s.color.MATERIAL_BINDINGS, |s| &mut s.color.MATERIAL_BINDINGS);
12 
13 fn rung_index(rung: crate::scene::material::PlateRung) -> usize {
14     match rung {
15         crate::scene::material::PlateRung::Root => 0,
16         crate::scene::material::PlateRung::Pane => 1,
17         crate::scene::material::PlateRung::Control => 2,
18     }
19 }
20 
21 pub fn named_material(name: &str) -> Option<crate::scene::material::MaterialDef> {
22     load_colors_once();
23     style_read(&NAMED_MATERIALS).iter().find(|(n, _)| n == name).map(|(_, d)| d.clone())
24 }
25 
26 /// Every defined material's name, sorted.
27 pub fn material_names() -> Vec<String> {
28     load_colors_once();
29     let mut v: Vec<String> = style_read(&NAMED_MATERIALS).into_iter().map(|(n, _)| n).collect();
30     v.sort();
31     v
32 }
33 
34 pub fn set_named_material(name: &str, def: Option<crate::scene::material::MaterialDef>) {
35     let mut list = style_read(&NAMED_MATERIALS);
36     list.retain(|(n, _)| n != name);
37     if let Some(d) = def {
38         list.push((name.to_string(), d));
39     }
40     style_write(&NAMED_MATERIALS, list);
41 }
42 
43 pub fn material_binding(rung: crate::scene::material::PlateRung) -> Option<String> {
44     load_colors_once();
45     style_read(&MATERIAL_BINDINGS)[rung_index(rung)].clone()
46 }
47 
48 pub fn set_material_binding(rung: crate::scene::material::PlateRung, name: Option<String>) {
49     let mut b = style_read(&MATERIAL_BINDINGS);
50     b[rung_index(rung)] = name;
51     style_write(&MATERIAL_BINDINGS, b);
52 }