diff --git a/examples/free_axis.rs b/examples/free_axis.rs index 23c2928..119f86e 100644 --- a/examples/free_axis.rs +++ b/examples/free_axis.rs @@ -1,50 +1,53 @@ use embedded_graphics::{ pixelcolor::Rgb565, prelude::*, + style::TextStyleBuilder, + fonts::{Font6x8, Font6x6}, }; use embedded_graphics_simulator::{ SimulatorDisplay, Window, OutputSettingsBuilder, - }; use embedded_plots::{ axis::{Axis,Orientation,Scale}, }; -use embedded_graphics::style::TextStyleBuilder; -use embedded_graphics::fonts::Font6x8; fn main() -> Result<(), core::convert::Infallible> { let mut display: SimulatorDisplay = SimulatorDisplay::new(Size::new(480, 272)); - let text_style = TextStyleBuilder::new(Font6x8) + let text_style_white = TextStyleBuilder::new(Font6x8) .text_color(RgbColor::WHITE) .build(); - Axis::new("X Fixed 0-100(10)",Orientation::X{x1: 10, x2: 230, y: 10},0..100,Scale::Fixed(10),RgbColor::WHITE, text_style) + let text_style_yellow_compact = TextStyleBuilder::new(Font6x6) + .text_color(RgbColor::YELLOW) + .build(); + + Axis::new("X Fixed 0-100(10)",Orientation::X{x1: 10, x2: 230, y: 10},0..100,Scale::Fixed(10),RgbColor::WHITE, text_style_white, 2) .draw(&mut display)?; - Axis::new("X Fixed 0-200(100)",Orientation::X{x1: 240, x2: 470, y: 10},0..200,Scale::Fixed(100),RgbColor::YELLOW, text_style) + Axis::new("X Fixed 0-200(100)",Orientation::X{x1: 240, x2: 470, y: 10},0..200,Scale::Fixed(100),RgbColor::YELLOW, text_style_yellow_compact, 1) .draw(&mut display)?; - Axis::new("X Frac 0-100(7)",Orientation::X{x1: 20, x2: 220, y: 30},0..100,Scale::RangeFraction(7),RgbColor::BLUE, text_style) + Axis::new("X Frac 0-100(7)",Orientation::X{x1: 20, x2: 220, y: 30},0..100,Scale::RangeFraction(7),RgbColor::BLUE, text_style_white, 3) .draw(&mut display)?; - Axis::new("X Frac 0-200(4)",Orientation::X{x1: 250, x2: 460, y: 30},0..200,Scale::RangeFraction(4),RgbColor::RED, text_style) + Axis::new("X Frac 0-200(4)",Orientation::X{x1: 250, x2: 460, y: 30},0..200,Scale::RangeFraction(4),RgbColor::RED, text_style_yellow_compact, 7) .draw(&mut display)?; - Axis::new("Y Fixed 0-100(10)",Orientation::Y{y1: 60, y2: 250, x: 110},0..100,Scale::Fixed(10),RgbColor::WHITE, text_style) + Axis::new("Y Fixed 0-100(10)",Orientation::Y{y1: 70, y2: 250, x: 120},0..100,Scale::Fixed(10),RgbColor::WHITE, text_style_white, 2) .draw(&mut display)?; - Axis::new("Y Fixed 0-200(100)",Orientation::Y{y1: 70, y2: 230, x: 230},0..200,Scale::Fixed(100),RgbColor::YELLOW, text_style) + Axis::new("Y Fixed 0-200(100)",Orientation::Y{y1: 70, y2: 230, x: 230},0..200,Scale::Fixed(100),RgbColor::YELLOW, text_style_yellow_compact, 1) .draw(&mut display)?; - Axis::new("Y Frac 0-100(7)",Orientation::Y{y1: 60, y2: 180, x: 350},0..100,Scale::RangeFraction(7),RgbColor::BLUE, text_style) + Axis::new("Y Frac 0-100(7)",Orientation::Y{y1: 60, y2: 180, x: 350},0..100,Scale::RangeFraction(7),RgbColor::BLUE, text_style_white, 3) .draw(&mut display)?; - Axis::new("Y Frac 0-200(4)",Orientation::Y{y1: 90, y2: 260, x: 470},0..200,Scale::RangeFraction(4),RgbColor::RED, text_style) + Axis::new("Y Frac 0-200(4)",Orientation::Y{y1: 90, y2: 260, x: 470},0..200,Scale::RangeFraction(4),RgbColor::RED, text_style_yellow_compact, 7) .draw(&mut display)?; diff --git a/src/axis.rs b/src/axis.rs index 177087d..c9d2aa1 100644 --- a/src/axis.rs +++ b/src/axis.rs @@ -38,7 +38,8 @@ pub struct Axis<'a, C, F> range: Range, scale: Scale, color: C, - text_style: TextStyle + text_style: TextStyle, + tick_size: usize, } impl<'a, C, F> Axis<'a, C, F> @@ -47,8 +48,8 @@ impl<'a, C, F> Axis<'a, C, F> F: Font, TextStyle: Clone, { - pub fn new(title: &'a str, orientation: Orientation, range: Range, scale: Scale, color: C, text_style: TextStyle) -> Axis<'a, C, F> { - Axis { title, orientation, range, scale, color, text_style } + pub fn new(title: &'a str, orientation: Orientation, range: Range, scale: Scale, color: C, text_style: TextStyle, tick_height: usize) -> Axis<'a, C, F> { + Axis { title, orientation, range, scale, color, text_style, tick_size: tick_height } } } @@ -81,34 +82,36 @@ impl<'a, C, F> Drawable for Axis<'a, C, F> for line in lines { let x = line.scale_between_ranges(&self.range, &(x1..x2)); - Line { start: Point { x, y: y - 2 }, end: Point { x, y: y + 2 } } + Line { start: Point { x, y: y - self.tick_size as i32 }, end: Point { x, y: y + self.tick_size as i32 } } .into_styled(PrimitiveStyle::with_stroke(self.color, 1)) .draw(display)?; let mut buf: String:: = String::new(); write!(buf, "{}", line).unwrap(); - Text::new(&buf, Point { x: x + 1, y: y + 1 }).into_styled(self.text_style).draw(display)?; + Text::new(&buf, Point { x: x + 2, y: y + 2 }).into_styled(self.text_style).draw(display)?; } } Orientation::Y { y1, y2, x } => { Line { start: Point { x, y: y1 }, end: Point { x, y: y2 } } .into_styled(PrimitiveStyle::with_stroke(self.color, 1)) .draw(display)?; - let title = Text::new(self.title, Point { x, y: y1 }) - .into_styled(self.text_style); - let title = title.translate(Point { x: -(title.size().width as i32) - 5, y: (y2-y1)/2 }); - title.draw(display)?; + let mut max_tick_text_width = 0; for line in lines { let y = line.scale_between_ranges(&self.range, &(y2..y1)); - Line { start: Point { x: x - 2, y }, end: Point { x: x + 2, y} } + Line { start: Point { x: x - self.tick_size as i32, y }, end: Point { x: x + self.tick_size as i32, y} } .into_styled(PrimitiveStyle::with_stroke(self.color, 1)) .draw(display)?; let mut buf: String:: = String::new(); write!(buf, "{}", line).unwrap(); - let tick = Text::new(&buf, Point { x, y}).into_styled(self.text_style); - let tick = tick.translate(Point{ x: -(tick.size().width as i32), y: 0 }); - tick.draw(display)?; + let tick_val = Text::new(&buf, Point { x, y}).into_styled(self.text_style); + let tick_val = tick_val.translate(Point{ x: -(tick_val.size().width as i32) -2, y: 2 }); + if tick_val.size().width > max_tick_text_width { max_tick_text_width = tick_val.size().width } + tick_val.draw(display)?; } + let title = Text::new(self.title, Point { x, y: y1 }) + .into_styled(self.text_style); + let title = title.translate(Point { x: -(title.size().width as i32) - max_tick_text_width as i32 - self.tick_size as i32 - 2, y: (y2-y1)/2 }); + title.draw(display)?; } } Ok(())