use std::fmt; use crate::bitmap::MapPoint; #[derive(Debug, Copy, Clone)] pub enum Brush { Line(LineBrush), Circle(CircleBrush), RectSelect(RectSelectBrush), Fill, Custom { size: u8 }, } #[derive(Debug, Copy, Clone)] pub struct LineBrush { pub size: u8, pub start: Option, pub extend: bool, } #[derive(Debug, Copy, Clone)] pub struct CircleBrush { pub size: u8, } #[derive(Debug, Copy, Clone)] pub struct RectSelectBrush { pub start: Option, pub end: Option, pub active_end: bool, } impl Brush { pub fn grow(&mut self) { match self { Brush::Line(LineBrush { ref mut size, .. }) => *size += 1, Brush::Circle(CircleBrush { ref mut size, .. }) => *size += 1, Brush::Custom { ref mut size, .. } => *size += 1, _ => (), } } pub fn shrink(&mut self) { match self { Brush::Line(LineBrush { ref mut size, .. }) => *size = size.saturating_sub(1), Brush::Circle(CircleBrush { ref mut size, .. }) => *size = size.saturating_sub(1), Brush::Custom { ref mut size, .. } => *size = size.saturating_sub(1), _ => (), } } pub fn new(size: u8) -> Self { Brush::Circle(CircleBrush { size }) } pub fn line(size: u8, extend: bool) -> Self { Brush::Line(LineBrush { size, start: None, extend, }) } pub fn rect() -> Self { Brush::RectSelect(RectSelectBrush { start: None, end: None, active_end: true, }) } pub fn is_line(&self) -> bool { matches!(self, Self::Line(_)) } pub fn is_rect(&self) -> bool { matches!(self, Self::RectSelect(_)) } pub fn size(&self) -> Option { match self { Brush::Line(LineBrush { size, .. }) => Some(*size), Brush::Circle(CircleBrush { size }) => Some(*size), _ => None, } } } impl fmt::Display for Brush { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Brush::Line(LineBrush { extend, .. }) => { write!(f, "LINE{}", if *extend { "+" } else { "" }) } Brush::Circle(..) => write!(f, "CIRCLE"), Brush::RectSelect { .. } => write!(f, "SELECT"), Brush::Fill => write!(f, "FILL"), Brush::Custom { .. } => write!(f, "CUSTOM"), } } }