This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

🚸 Make Canvas#layer safe by default

+25 -28
+1 -1
examples/dna-analysis-machine/src/main.rs
··· 35 35 canvas.add_layer(strands); 36 36 37 37 for (i, (_key, obj)) in canvas 38 - .layer("strands") 38 + .layer_unchecked("strands") 39 39 .objects 40 40 .iter_mut() 41 41 .sorted_by_key(|(k, _)| *k)
+2 -2
examples/schedule-hell/src/scenes/first_break.rs
··· 61 61 }) 62 62 .on_note("goup", &|canvas, _| { 63 63 let world = canvas.world_region.clone(); 64 - let shapes = &mut canvas.layer("shapes").objects; 64 + let shapes = &mut canvas.layer("shapes")?.objects; 65 65 66 66 for (i, point) in world.iter().enumerate() { 67 67 let shape = shapes.get_mut(&format!("shape{i}")); ··· 78 78 79 79 for (i, _) in world.iter().enumerate() { 80 80 canvas 81 - .layer("tiling") 81 + .layer("tiling")? 82 82 .objects 83 83 .get_mut(&format!("tile{i}")) 84 84 .unwrap()
+1 -1
examples/schedule-hell/src/scenes/intro.rs
··· 22 22 }) 23 23 .on_note("anchor kick", &|canvas, ctx| { 24 24 canvas 25 - .layer("anchor kick") 25 + .layer("anchor kick")? 26 26 .paint_all_objects(Fill::Translucent(ctx.extra.kick_color, 1.0)); 27 27 28 28 ctx.animate_layer("anchor kick", 200, &|t, layer, _| {
+1 -1
examples/specimen/src/main.rs
··· 6 6 canvas.set_grid_size(3, 3); 7 7 canvas.set_background(Color::White); 8 8 9 - canvas.layer("root").add_objects([ 9 + canvas.layer_unchecked("root").add_objects([ 10 10 Object::BigCircle(Point(0, 0)).colored(Color::Black), 11 11 Object::CurveOutward(Point(1, 1), Point(2, 0), 5.0).colored(Color::Black), 12 12 Object::CurveInward(Point(2, 1), Point(3, 0), 5.0).colored(Color::Black),
+17 -20
src/graphics/canvas.rs
··· 1 + use anyhow::{Result, anyhow}; 1 2 use core::panic; 2 3 use resvg::usvg; 3 4 use std::{collections::HashMap, ops::Range, sync::Arc}; ··· 99 100 }; 100 101 } 101 102 102 - pub fn layer_safe(&mut self, name: &str) -> Option<&mut Layer> { 103 - self.layers.iter_mut().find(|layer| layer.name == name) 103 + pub fn layer(&mut self, name: &str) -> Result<&mut Layer> { 104 + self.layers 105 + .iter_mut() 106 + .find(|layer| layer.name == name) 107 + .ok_or(anyhow!("Layer {name} does not exist")) 104 108 } 105 109 106 - pub fn layer(&mut self, name: &str) -> &mut Layer { 107 - if !self.layer_exists(name) { 108 - panic!("Layer {} does not exist", name); 109 - } 110 - 111 - self.layer_safe(name).unwrap() 110 + pub fn layer_unchecked(&mut self, name: &str) -> &mut Layer { 111 + self.layer(name).unwrap() 112 112 } 113 113 114 114 pub fn new_layer(&mut self, name: &str) -> &mut Layer { ··· 133 133 134 134 pub fn layer_or_empty(&mut self, name: &str) -> &mut Layer { 135 135 if self.layer_exists(name) { 136 - return self.layer(name); 136 + return self.layer_unchecked(name); 137 137 } 138 138 139 139 self.new_layer(name) ··· 186 186 } 187 187 188 188 pub fn root(&mut self) -> &mut Layer { 189 - self.layer_safe("root") 189 + self.layer("root") 190 190 .expect("Layer 'root' should always exist in a canvas") 191 191 } 192 192 ··· 196 196 name: &str, 197 197 object: Object, 198 198 fill: Option<Fill>, 199 - ) -> Result<(), String> { 200 - match self.layer_safe(layer) { 201 - None => Err(format!("Layer {} does not exist", layer)), 202 - Some(layer) => { 203 - layer.set(name, ColoredObject::from((object, fill))); 204 - Ok(()) 205 - } 206 - } 199 + ) -> Result<()> { 200 + self.layer(layer)? 201 + .set(name, ColoredObject::from((object, fill))); 202 + 203 + Ok(()) 207 204 } 208 205 209 206 pub fn remove_object(&mut self, name: &str) { ··· 224 221 self.fontdb.is_some() 225 222 } 226 223 227 - pub fn load_fonts(&mut self) -> anyhow::Result<()> { 224 + pub fn load_fonts(&mut self) -> Result<()> { 228 225 if self.fonts_loaded() { 229 226 return Ok(()); 230 227 } ··· 236 233 } 237 234 238 235 pub fn add_or_replace_layer(&mut self, layer: Layer) { 239 - if let Some(existing_layer) = self.layer_safe(&layer.name) { 236 + if let Ok(existing_layer) = self.layer(&layer.name) { 240 237 existing_layer.replace(layer); 241 238 } else { 242 239 self.layers.push(layer);
+1 -1
src/video/context.rs
··· 219 219 let animation = Animation { 220 220 name: format!("unnamed animation {}", nanoid!()), 221 221 update: Box::new(move |progress, canvas, ms| { 222 - (f)(progress, canvas.layer(layer), ms)?; 222 + (f)(progress, canvas.layer_unchecked(layer), ms)?; 223 223 Ok(()) 224 224 }), 225 225 };
+2 -2
src/video/hooks.rs
··· 240 240 }), 241 241 render_function: Box::new(move |canvas, ctx| { 242 242 let object = create_object(canvas, ctx)?; 243 - canvas.layer(layer_name).set(object_name, object); 243 + canvas.layer(layer_name)?.set(object_name, object); 244 244 Ok(()) 245 245 }), 246 246 }) ··· 358 358 when: Box::new(move |_, _, _, _| true), 359 359 render_function: Box::new(move |canvas, context| { 360 360 let amplitude = context.stem(stem).amplitude_relative(); 361 - update(amplitude, canvas.layer(layer), context.ms)?; 361 + update(amplitude, canvas.layer(layer)?, context.ms)?; 362 362 Ok(()) 363 363 }), 364 364 })