From 8f7ada85ed691d39c33f7cd5e4d474e6d0f76907 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Sat, 4 May 2024 02:22:30 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20remove=5Fobjects=5Fin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/canvas.rs | 6 ++++++ src/examples.rs | 16 ++++++++++++++++ src/layer.rs | 8 +++++++- src/main.rs | 13 +++++++------ src/objects.rs | 2 +- src/region.rs | 9 ++++++++- src/web.rs | 10 +++++++++- 7 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/canvas.rs b/src/canvas.rs index 1d2eee9..28aa3fb 100644 --- a/src/canvas.rs +++ b/src/canvas.rs @@ -439,6 +439,12 @@ impl Canvas { return self.height() as f32 / self.width() as f32; } + pub fn remove_all_objects_in(&mut self, region: &Region) { + self.layers + .iter_mut() + .for_each(|layer| layer.remove_all_objects_in(region)); + } + /// returns a list of all unique filters used throughout the canvas /// used to only generate one definition per filter /// diff --git a/src/examples.rs b/src/examples.rs index 406e493..5d921f9 100644 --- a/src/examples.rs +++ b/src/examples.rs @@ -4,6 +4,22 @@ use crate::*; pub fn dna_analysis_machine() -> Canvas { let mut canvas = Canvas::new(vec!["root"]); + + canvas.colormap = ColorMapping { + black: "#000000".into(), + white: "#ffffff".into(), + red: "#cf0a2b".into(), + green: "#22e753".into(), + blue: "#2734e6".into(), + yellow: "#f8e21e".into(), + orange: "#f05811".into(), + purple: "#6a24ec".into(), + brown: "#a05634".into(), + pink: "#e92e76".into(), + gray: "#81a0a8".into(), + cyan: "#4fecec".into(), + }; + canvas.set_grid_size(16, 9); canvas.set_background(Color::Black); let mut hatches_layer = Layer::new("root"); diff --git a/src/layer.rs b/src/layer.rs index a72b3d0..f857a3c 100644 --- a/src/layer.rs +++ b/src/layer.rs @@ -1,7 +1,8 @@ -use crate::{ColorMapping, ColoredObject, Fill, Filter, Object, ObjectSizes}; +use crate::{ColorMapping, ColoredObject, Containable, Fill, Filter, Object, ObjectSizes, Region}; use anyhow::Context; use std::collections::HashMap; use wasm_bindgen::prelude::*; +use web_sys::js_sys::RegExp; #[derive(Debug, Clone, Default)] // #[wasm_bindgen(getter_with_clone)] @@ -36,6 +37,11 @@ impl Layer { self.flush(); } + pub fn remove_all_objects_in(&mut self, region: &Region) { + self.objects + .retain(|_, ColoredObject(o, ..)| !o.region().within(region)) + } + pub fn paint_all_objects(&mut self, fill: Fill) { for (_id, ColoredObject(_, ref mut maybe_fill, _)) in &mut self.objects { *maybe_fill = Some(fill.clone()); diff --git a/src/main.rs b/src/main.rs index 7dd1560..50ac48b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,12 +13,13 @@ pub fn run(args: cli::Args) { let mut canvas = canvas_from_cli(&args); if args.cmd_image && !args.cmd_video { - canvas.root().add_object( - "hello", - Object::Text(Anchor(3, 4), "hello world!".into(), 16.0) - .color(Fill::Solid(Color::Black)), - ); - canvas.set_background(Color::White); + // canvas.root().add_object( + // "hello", + // Object::Text(Anchor(3, 4), "hello world!".into(), 16.0) + // .color(Fill::Solid(Color::Black)), + // ); + // canvas.set_background(Color::White); + canvas = examples::dna_analysis_machine(); let rendered = canvas.render(&vec!["*"], true); if args.arg_file.ends_with(".svg") { std::fs::write(args.arg_file, rendered).unwrap(); diff --git a/src/objects.rs b/src/objects.rs index feb6c11..1483608 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -159,7 +159,7 @@ impl Object { Object::Text(anchor, _, _) | Object::Dot(anchor) | Object::SmallCircle(anchor) => { (anchor, anchor).into() } - Object::BigCircle(center) => (center, center).into(), // FIXME will be wrong lmao, + Object::BigCircle(center) => Region::from((center, center)), Object::RawSVG(_) => { unimplemented!() } diff --git a/src/region.rs b/src/region.rs index 45cf5ed..1ad4d8a 100644 --- a/src/region.rs +++ b/src/region.rs @@ -11,6 +11,13 @@ impl Point { pub fn translated(&self, dx: i32, dy: i32) -> Self { Self((self.0 as i32 + dx) as usize, (self.1 as i32 + dy) as usize) } + + pub fn region(&self) -> Region { + Region { + start: self.clone(), + end: self.clone(), + } + } } impl From<(usize, usize)> for Point { @@ -129,7 +136,7 @@ impl From<(&CenterAnchor, &CenterAnchor)> for Region { fn from(value: (&CenterAnchor, &CenterAnchor)) -> Self { Region { start: (value.0 .0, value.0 .1).into(), - end: (value.1 .0, value.1 .1).into(), + end: (value.1 .0 - 1, value.1 .1 - 1).into(), } } } diff --git a/src/web.rs b/src/web.rs index 57368d7..e7a476c 100644 --- a/src/web.rs +++ b/src/web.rs @@ -8,7 +8,7 @@ use wasm_bindgen::{JsValue, UnwrapThrowExt}; use crate::{ examples, layer, Anchor, Canvas, CenterAnchor, Color, ColorMapping, Fill, Filter, FilterType, - HatchDirection, Layer, Object, Point, + HatchDirection, Layer, Object, Point, Region, }; static WEB_CANVAS: Lazy> = Lazy::new(|| Mutex::new(Canvas::default_settings())); @@ -59,12 +59,20 @@ pub fn render_image(opacity: f32, color: Color) -> Result<(), JsValue> { cyan: "#4fecec".into(), }; + canvas.remove_all_objects_in(&Region::from_topleft(Point(8, 2), (2, 2))); + canvas.remove_all_objects_in(&Point(11, 7).region()); + *WEB_CANVAS.lock().unwrap() = canvas; render_canvas_at(String::from("body")); Ok(()) } +#[wasm_bindgen] +pub fn map_to_midi_controller() { + +} + #[wasm_bindgen] pub fn render_canvas_into(selector: String) -> () { let svgstring = canvas().render(&vec!["*"], false);