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 }