diff options
author | Jovansonlee Cesar <ivanceras@gmail.com> | 2018-07-31 05:24:12 +0800 |
---|---|---|
committer | Jovansonlee Cesar <ivanceras@gmail.com> | 2018-07-31 05:24:12 +0800 |
commit | 707fe5654522b1001095748633ec9721513101dd (patch) | |
tree | 001f695ecc77c0c9d14562279bc54b3554ae4aef | |
parent | 9390395f0ec5e5ac9442688136882f07a63711e8 (diff) |
Add circle and open circle marker
-rw-r--r-- | svgbob/src/element.rs | 17 | ||||
-rw-r--r-- | svgbob/src/focus_char.rs | 4 | ||||
-rw-r--r-- | svgbob/src/fragments.rs | 10 | ||||
-rw-r--r-- | svgbob/src/grid.rs | 43 | ||||
-rw-r--r-- | svgbob/src/properties.rs | 36 |
5 files changed, 88 insertions, 22 deletions
diff --git a/svgbob/src/element.rs b/svgbob/src/element.rs index f82dbb9..76ee05d 100644 --- a/svgbob/src/element.rs +++ b/svgbob/src/element.rs @@ -16,7 +16,7 @@ use loc::Loc; use element::{ Stroke::{Solid,Dashed}, ArcFlag::{Minor,Major}, - Feature::{Arrow,ArrowStart,Circle}, + Feature::{Arrow,ArrowStart,Circle,OpenCircle}, }; use unicode_width::UnicodeWidthStr; @@ -40,6 +40,7 @@ pub enum Feature { ArrowStart, // start arrow Arrow, //end Circle, //start + OpenCircle, //start } @@ -69,6 +70,14 @@ pub fn dashed_line(a: &Point, b: &Point) -> Element { Element::Line(a.clone(), b.clone(), Dashed, vec![]) } +pub fn circle_start_line(a: &Point, b: &Point) -> Element { + Element::Line(a.clone(), b.clone(), Solid, vec![Circle]) +} + +pub fn circle_open_line(a: &Point, b: &Point) -> Element { + Element::Line(a.clone(), b.clone(), Solid, vec![OpenCircle]) +} + pub fn solid_circle(c: &Point, r: f32) -> Element { Element::Circle(c.clone(), r, "solid".to_string()) } @@ -254,6 +263,9 @@ impl Element { Circle => { svg_line.assign("marker-start", "url(#circle)"); } + OpenCircle => { + svg_line.assign("marker-start", "url(#open_circle)"); + } }; } match *stroke { @@ -288,6 +300,9 @@ impl Element { Circle => { svg_arc.assign("marker-start", "url(#circle)"); } + OpenCircle => { + svg_arc.assign("marker-start", "url(#open_circle)"); + } }; } SvgElement::Path(svg_arc) diff --git a/svgbob/src/focus_char.rs b/svgbob/src/focus_char.rs index d6e9a19..437d4a3 100644 --- a/svgbob/src/focus_char.rs +++ b/svgbob/src/focus_char.rs @@ -13,7 +13,7 @@ use point::Point; use loc_block::LocBlock; use element::Element; use fragments::Fragment::Text; -use element::{line,dashed_line,arrow_line,start_arrow_line,arc,open_circle,solid_circle,text}; +use element::{line,dashed_line,circle_start_line, circle_open_line,arrow_line,start_arrow_line,arc,open_circle,solid_circle,text}; use location::Location; use settings::Settings; use enhance::Enhance; @@ -172,6 +172,8 @@ impl<'g> FocusChar<'g> { let unit_x = self.loc_block().unit_x(); match frag { Fragment::Line(p1, p2) => line(&self.point(&p1), &self.point(&p2)), + Fragment::CircleStartLine(p1, p2) => circle_start_line(&self.point(&p1), &self.point(&p2)), + Fragment::CircleOpenLine(p1, p2) => circle_open_line(&self.point(&p1), &self.point(&p2)), Fragment::DashedLine(p1, p2) => dashed_line(&self.point(&p1), &self.point(&p2)), Fragment::ArrowLine(p1, p2) => arrow_line(&self.point(&p1), &self.point(&p2)), diff --git a/svgbob/src/fragments.rs b/svgbob/src/fragments.rs index 15682d4..43649f6 100644 --- a/svgbob/src/fragments.rs +++ b/svgbob/src/fragments.rs @@ -1,4 +1,4 @@ -use self::Fragment::{Arc, ArrowLine, Line, DashedLine, OpenCircle, SolidCircle, StartArrowLine}; +use self::Fragment::{Arc, ArrowLine, Line, DashedLine, CircleStartLine, CircleOpenLine, OpenCircle, SolidCircle, StartArrowLine}; use point_block::PointBlock; @@ -10,6 +10,8 @@ use point_block::PointBlock; #[derive(Debug, Clone, PartialOrd, PartialEq, Ord, Eq)] pub enum Fragment { Line(PointBlock, PointBlock), + CircleStartLine(PointBlock, PointBlock), + CircleOpenLine(PointBlock, PointBlock), DashedLine(PointBlock, PointBlock), ArrowLine(PointBlock, PointBlock), StartArrowLine(PointBlock, PointBlock), // the arrow is at the start marker @@ -22,6 +24,12 @@ pub enum Fragment { pub fn line(p1: &PointBlock, p2: &PointBlock) -> Fragment { Line(p1.clone(), p2.clone()) } +pub fn circle_start_line(p1: &PointBlock, p2: &PointBlock) -> Fragment { + CircleStartLine(p1.clone(), p2.clone()) +} +pub fn circle_open_line(p1: &PointBlock, p2: &PointBlock) -> Fragment { + CircleOpenLine(p1.clone(), p2.clone()) +} pub fn dashed_line(p1: &PointBlock, p2: &PointBlock) -> Fragment { DashedLine(p1.clone(), p2.clone()) } diff --git a/svgbob/src/grid.rs b/svgbob/src/grid.rs index 184cbbb..f52bb8e 100644 --- a/svgbob/src/grid.rs +++ b/svgbob/src/grid.rs @@ -10,6 +10,7 @@ use svg::node::element::{ Path as SvgPath, Rectangle as SvgRect, Style, + Circle as SvgCircle, }; use element::Element; use pom::TextInput; @@ -307,6 +308,8 @@ impl Grid { fn get_defs() -> Definitions { let mut defs = Definitions::new(); defs.append(arrow_marker()); + defs.append(circle_marker()); + defs.append(open_circle_marker()); defs } @@ -356,7 +359,6 @@ fn arrow_marker() -> Marker { .set("viewBox", "0 0 50 20") .set("refX", 15) .set("refY", 10) - .set("markerUnits", "strokeWidth") .set("markerWidth", 10) .set("markerHeight", 10) .set("orient", "auto"); @@ -366,6 +368,45 @@ fn arrow_marker() -> Marker { marker } + +/// <marker id="dot" viewBox="0 0 10 10" refX="5" refY="5" +/// markerWidth="5" markerHeight="5"> +/// <circle cx="5" cy="5" r="5" fill="red" /> +/// </marker> +fn circle_marker() -> Marker { + let mut marker = Marker::new() + .set("id", "circle") + .set("viewBox", "0 0 20 20") + .set("refX", 10) + .set("refY", 10) + .set("markerWidth", 5) + .set("markerHeight", 5); + + let mut circle = SvgCircle::new() + .set("cx",10) + .set("cy",10) + .set("r",8) + .set("fill","red"); + marker.append(circle); + marker +} +fn open_circle_marker() -> Marker { + let mut marker = Marker::new() + .set("id", "open_circle") + .set("viewBox", "0 0 20 20") + .set("refX", 10) + .set("refY", 10) + .set("markerWidth", 5) + .set("markerHeight", 5); + + let mut circle = SvgCircle::new() + .set("cx",10) + .set("cy",10) + .set("r",8) + .set("fill","green"); + marker.append(circle); + marker +} //copied from https://github.com/rust-lang/rust/blob/master/src/librustdoc/html/escape.rs //just adding for \0 pub fn svg_escape(arg: &str) -> String { diff --git a/svgbob/src/properties.rs b/svgbob/src/properties.rs index 2d977b5..0517c2e 100644 --- a/svgbob/src/properties.rs +++ b/svgbob/src/properties.rs @@ -5,7 +5,7 @@ use block::Block::{A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U use point_block::PointBlock; use fragments::Fragment; -use fragments::{arc, arrow_line, line, open_circle, solid_circle, start_arrow_line, dashed_line}; +use fragments::{arc, arrow_line, line, circle_start_line, circle_open_line, open_circle, solid_circle, start_arrow_line, dashed_line}; use self::Signal::{Medium, Strong, Weak}; use box_drawing; @@ -933,7 +933,7 @@ impl Properties for char { } ////////////////////// // - // * asterisk + // * asterisk or star // ////////////////////// else if self.is('*') { @@ -1013,14 +1013,14 @@ impl Properties for char { ], intended_behavior: vec![], properties: vec![ - (C, Medium, vec![line(m, c), solid_circle(m, 2)]), - (W, Medium, vec![line(m, w), solid_circle(m, 2)]), - (K, Medium, vec![line(m, k), solid_circle(m, 2)]), - (O, Medium, vec![line(m, o), solid_circle(m, 2)]), - (A, Medium, vec![line(m, a), solid_circle(m, 2)]), - (E, Medium, vec![line(m, e), solid_circle(m, 2)]), - (U, Medium, vec![line(m, u), solid_circle(m, 2)]), - (Y, Medium, vec![line(m, y), solid_circle(m, 2)]), + (C, Medium, vec![circle_start_line(m, c)]), + (W, Medium, vec![circle_start_line(m, w)]), + (K, Medium, vec![circle_start_line(m, k)]), + (O, Medium, vec![circle_start_line(m, o)]), + (A, Medium, vec![circle_start_line(m, a)]), + (E, Medium, vec![circle_start_line(m, e)]), + (U, Medium, vec![circle_start_line(m, u)]), + (Y, Medium, vec![circle_start_line(m, y)]), ], }) } @@ -1106,14 +1106,14 @@ impl Properties for char { ], intended_behavior: vec![], properties: vec![ - (C, Medium, vec![line(h, c), open_circle(m, 2)]), - (W, Medium, vec![line(r, w), open_circle(m, 2)]), - (K, Medium, vec![open_circle(m, 2)]), - (O, Medium, vec![open_circle(m, 2)]), - (A, Medium, vec![line(g, a), open_circle(m, 2)]), - (E, Medium, vec![line(i, e), open_circle(m, 2)]), - (U, Medium, vec![line(q, u), open_circle(m, 2)]), - (Y, Medium, vec![line(s, y), open_circle(m, 2)]), + (C, Medium, vec![circle_open_line(m, c)]), + (W, Medium, vec![circle_open_line(m, w)]), + (K, Medium, vec![circle_open_line(m, k)]), + (O, Medium, vec![circle_open_line(m, o)]), + (A, Medium, vec![circle_open_line(m, a)]), + (E, Medium, vec![circle_open_line(m, e)]), + (U, Medium, vec![circle_open_line(m, u)]), + (Y, Medium, vec![circle_open_line(m, y)]), ], }) } |