diff options
Diffstat (limited to 'packages/svgbob/src/buffer')
6 files changed, 84 insertions, 75 deletions
diff --git a/packages/svgbob/src/buffer/cell_buffer.rs b/packages/svgbob/src/buffer/cell_buffer.rs index d632132..c949c51 100644 --- a/packages/svgbob/src/buffer/cell_buffer.rs +++ b/packages/svgbob/src/buffer/cell_buffer.rs @@ -13,7 +13,8 @@ pub use endorse::Endorse; use itertools::Itertools; use sauron::{ html, - html::{attributes::*, *}, + html::attributes::{class, id}, + html::*, svg::{attributes::*, *}, Node, }; @@ -109,7 +110,7 @@ impl CellBuffer { let svg_node = Self::fragments_to_node(fragments, legend_css, settings, w, h) - .add_children(group_nodes); + .with_children(group_nodes); (svg_node, w, h) } @@ -125,7 +126,7 @@ impl CellBuffer { let svg_node = Self::fragments_to_node(fragments, legend_css, settings, w, h) - .add_children(group_nodes); + .with_children(group_nodes); svg_node } @@ -261,7 +262,9 @@ impl CellBuffer { let classes: Vec<String> = self .css_styles .iter() - .map(|(class, styles)| format!(".{}{{ {} }}", class, styles)) + .map(|(class, styles)| { + format!(".svgbob .{}{{ {} }}", class, styles) + }) .collect(); classes.join("\n") } @@ -276,8 +279,11 @@ impl CellBuffer { let font_family = settings.font_family.to_owned(); let font_size = settings.font_size.to_owned(); - let element_styles = sauron::jss! { - "line, path, circle, rect, polygon": { + // we put a .svgbob class in order to avoid clashing with other svg in the document + // since the style element in this svg also affects the other svg element in the whole + // document + let element_styles = sauron::jss_pretty! { + ".svgbob line, .svgbob path, .svgbob circle, .svgbob rect, .svgbob polygon": { stroke: stroke_color.clone(), stroke_width: stroke_width, stroke_opacity: 1, @@ -286,76 +292,74 @@ impl CellBuffer { stroke_linejoin: "miter", }, - "text": { + ".svgbob text": { /* This fix the spacing bug in svg text*/ white_space: "pre", fill: stroke_color, + font_family: font_family, + font_size: px(font_size), }, - "rect.backdrop":{ + ".svgbob rect.backdrop":{ stroke: "none", fill: background.clone(), }, - ".broken":{ + ".svgbob .broken":{ stroke_dasharray: 8, }, - ".filled":{ + ".svgbob .filled":{ fill: fill_color, }, - ".bg_filled":{ + ".svgbob .bg_filled":{ fill: background.clone(), + stroke_width: 1, }, - ".nofill":{ + ".svgbob .nofill":{ fill: background, }, - "text": { - font_family: font_family, - font_size: px(font_size), - }, - - ".end_marked_arrow":{ + ".svgbob .end_marked_arrow":{ marker_end: "url(#arrow)", - }, + }, - ".start_marked_arrow":{ + ".svgbob .start_marked_arrow":{ marker_start: "url(#arrow)", - }, + }, - ".end_marked_diamond":{ + ".svgbob .end_marked_diamond":{ marker_end: "url(#diamond)", - }, - ".start_marked_diamond":{ + }, + ".svgbob .start_marked_diamond":{ marker_start: "url(#diamond)", - }, + }, - ".end_marked_circle":{ + ".svgbob .end_marked_circle":{ marker_end: "url(#circle)", - }, + }, - ".start_marked_circle":{ + ".svgbob .start_marked_circle":{ marker_start: "url(#circle)", - }, + }, - ".end_marked_open_circle":{ + ".svgbob .end_marked_open_circle":{ marker_end: "url(#open_circle)", - }, + }, - ".start_marked_open_circle":{ + ".svgbob .start_marked_open_circle":{ marker_start: "url(#open_circle)", - }, + }, - ".end_marked_big_open_circle":{ + ".svgbob .end_marked_big_open_circle":{ marker_end: "url(#big_open_circle)", - }, + }, - ".start_marked_big_open_circle": { + ".svgbob .start_marked_big_open_circle": { marker_start: "url(#big_open_circle)", - } + } }; html::tags::style([], [text(element_styles), text(legend_css)]) } @@ -397,7 +401,12 @@ impl CellBuffer { children.extend(fragment_nodes); svg( - [xmlns("http://www.w3.org/2000/svg"), width(w), height(h)], + [ + xmlns("http://www.w3.org/2000/svg"), + width(w), + height(h), + class("svgbob"), + ], children, ) } @@ -419,11 +428,11 @@ impl CellBuffer { marker( [ id("arrow"), - viewBox("-2 -2 8 8"), - refX(4), - refY(2), - markerWidth(7), - markerHeight(7), + view_box("-2 -2 8 8"), + ref_x(4), + ref_y(2), + marker_width(7), + marker_height(7), orient("auto-start-reverse"), ], [polygon([points("0,0 0,4 4,2 0,0")], [])], @@ -434,11 +443,11 @@ impl CellBuffer { marker( [ id("diamond"), - viewBox("-2 -2 8 8"), - refX(4), - refY(2), - markerWidth(7), - markerHeight(7), + view_box("-2 -2 8 8"), + ref_x(4), + ref_y(2), + marker_width(7), + marker_height(7), orient("auto-start-reverse"), ], [polygon([points("0,2 2,0 4,2 2,4 0,2")], [])], @@ -449,11 +458,11 @@ impl CellBuffer { marker( [ id("open_circle"), - viewBox("0 0 8 8"), - refX(4), - refY(4), - markerWidth(7), - markerHeight(7), + view_box("0 0 8 8"), + ref_x(4), + ref_y(4), + marker_width(7), + marker_height(7), orient("auto-start-reverse"), ], [circle( @@ -467,11 +476,11 @@ impl CellBuffer { marker( [ id("circle"), - viewBox("0 0 8 8"), - refX(4), - refY(4), - markerWidth(7), - markerHeight(7), + view_box("0 0 8 8"), + ref_x(4), + ref_y(4), + marker_width(7), + marker_height(7), orient("auto-start-reverse"), ], [circle( @@ -485,11 +494,11 @@ impl CellBuffer { marker( [ id("big_open_circle"), - viewBox("0 0 8 8"), - refX(4), - refY(4), - markerWidth(7), - markerHeight(7), + view_box("0 0 8 8"), + ref_x(4), + ref_y(4), + marker_width(7), + marker_height(7), orient("auto-start-reverse"), ], [circle( diff --git a/packages/svgbob/src/buffer/cell_buffer/cell.rs b/packages/svgbob/src/buffer/cell_buffer/cell.rs index 27b82bc..286b6cb 100644 --- a/packages/svgbob/src/buffer/cell_buffer/cell.rs +++ b/packages/svgbob/src/buffer/cell_buffer/cell.rs @@ -1,6 +1,6 @@ use crate::{util, Point}; use parry2d::{ - bounding_volume::AABB, + bounding_volume::Aabb, math::Isometry, query::{intersection_test, PointQuery}, shape::{Polyline, Segment}, @@ -129,7 +129,7 @@ impl Cell { /// the bounding box of this cell #[inline] - fn bounding_box(&self) -> AABB { + fn bounding_box(&self) -> Aabb { let start = Point::new( self.x as f32 * Self::width(), self.y as f32 * Self::height(), @@ -138,7 +138,7 @@ impl Cell { (self.x + 1) as f32 * Self::width(), (self.y + 1) as f32 * Self::height(), ); - AABB::new(*start, *end) + Aabb::new(*start, *end) } /// Convert the bounding box aabb to polyline segment @@ -433,7 +433,7 @@ mod tests { #[test] fn test_aabb() { assert_eq!( - AABB::new(*Point::new(0.0, 0.0), *Point::new(1.0, 2.0)), + Aabb::new(*Point::new(0.0, 0.0), *Point::new(1.0, 2.0)), Cell::new(0, 0).bounding_box() ); } diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment.rs index aa041ab..1cef8f1 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment.rs @@ -5,7 +5,7 @@ pub use circle::Circle; pub use line::Line; pub use marker_line::{Marker, MarkerLine}; use parry2d::{ - bounding_volume::{BoundingVolume, AABB}, + bounding_volume::{Aabb, BoundingVolume}, math::Isometry, query::{intersection_test, PointQuery}, shape::{ConvexPolygon, Polyline, Segment, Shape}, @@ -167,13 +167,13 @@ impl Fragment { } pub fn hit(&self, start: Point, end: Point) -> bool { - self.is_intersecting(&AABB::new(*start, *end)) + self.is_intersecting(&Aabb::new(*start, *end)) } /// check if this fragment is intersecting with this bounding box /// Note: if intersection logic requires testing the solid shape inside the polygon /// use the ConvexPolygon of each shape instead of Polyline - pub fn is_intersecting(&self, bbox: &AABB) -> bool { + pub fn is_intersecting(&self, bbox: &Aabb) -> bool { let points = vec![ *Point::new(bbox.mins.x, bbox.mins.y), *Point::new(bbox.maxs.x, bbox.mins.y), @@ -206,9 +206,9 @@ impl Fragment { } /// check if this fragment can be contain in the specified bounding box `bbox` - pub fn is_inside(&self, bbox: &AABB) -> bool { + pub fn is_inside(&self, bbox: &Aabb) -> bool { let (start, end) = self.bounds(); - let frag_bound = AABB::new(*start, *end); + let frag_bound = Aabb::new(*start, *end); bbox.contains(&frag_bound) } diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs index bcf7fdb..1b656f0 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs @@ -4,7 +4,7 @@ use crate::{ util, Direction, Point, }; use parry2d::{ - bounding_volume::AABB, + bounding_volume::Aabb, math::Isometry, query::PointQuery, shape::{Polyline, Segment, Shape}, diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs index 183cad0..2cf90bb 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment/marker_line.rs @@ -174,6 +174,6 @@ impl<MSG> From<MarkerLine> for Node<MSG> { if let Some(end_marker) = ml.end_marker { classes.push(class(format!("end_marked_{}", end_marker))); } - node.add_attributes(classes) + node.with_attributes(classes) } } diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment/rect.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment/rect.rs index 7bbc18d..e45f4f0 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment/rect.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment/rect.rs @@ -1,7 +1,7 @@ use crate::{fragment::Bounds, util, Cell, Point}; use parry2d::shape::{ConvexPolygon, Polyline, Segment, Shape}; use sauron::{ - html::attributes::*, + html::attributes::{class, classes_flag}, svg::{attributes::*, *}, Node, }; |