diff options
Diffstat (limited to 'src/brush.rs')
-rw-r--r-- | src/brush.rs | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/brush.rs b/src/brush.rs new file mode 100644 index 0000000..98c2b23 --- /dev/null +++ b/src/brush.rs | |||
@@ -0,0 +1,73 @@ | |||
1 | use std::fmt; | ||
2 | |||
3 | use crate::bitmap::MapPoint; | ||
4 | |||
5 | #[derive(Debug, Copy, Clone)] | ||
6 | pub enum Brush { | ||
7 | Line { | ||
8 | size: u8, | ||
9 | start: Option<MapPoint>, | ||
10 | extend: bool, | ||
11 | }, | ||
12 | Circle { | ||
13 | size: u8, | ||
14 | }, | ||
15 | RectSelect { | ||
16 | start: MapPoint, | ||
17 | end: MapPoint, | ||
18 | }, | ||
19 | Fill, | ||
20 | Custom { | ||
21 | size: u8, | ||
22 | }, | ||
23 | } | ||
24 | |||
25 | impl Brush { | ||
26 | pub fn grow(&mut self) -> Result<(), BrushError> { | ||
27 | match self { | ||
28 | Brush::Line { ref mut size, .. } => *size += 1, | ||
29 | Brush::Circle { ref mut size, .. } => *size += 1, | ||
30 | Brush::Custom { ref mut size, .. } => *size += 1, | ||
31 | _ => return Err(BrushError::CannotIncreaseSize), | ||
32 | } | ||
33 | Ok(()) | ||
34 | } | ||
35 | pub fn shrink(&mut self) -> Result<(), BrushError> { | ||
36 | match self { | ||
37 | Brush::Line { ref mut size, .. } => *size += size.saturating_sub(1), | ||
38 | Brush::Circle { ref mut size, .. } => *size += size.saturating_sub(1), | ||
39 | Brush::Custom { ref mut size, .. } => *size += size.saturating_sub(1), | ||
40 | _ => return Err(BrushError::CannotIncreaseSize), | ||
41 | } | ||
42 | Ok(()) | ||
43 | } | ||
44 | pub fn new() -> Self { | ||
45 | Brush::Circle { size: 0 } | ||
46 | } | ||
47 | pub fn line(size: u8, extend: bool) -> Self { | ||
48 | Brush::Line { | ||
49 | size, | ||
50 | start: None, | ||
51 | extend, | ||
52 | } | ||
53 | } | ||
54 | pub fn is_line(&self) -> bool { | ||
55 | matches!(self, Self::Line { .. }) | ||
56 | } | ||
57 | } | ||
58 | |||
59 | impl fmt::Display for Brush { | ||
60 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
61 | match self { | ||
62 | Brush::Line { extend, .. } => write!(f, "LINE{}", if *extend { "+" } else { "" }), | ||
63 | Brush::Circle { .. } => write!(f, "CIRCLE"), | ||
64 | Brush::RectSelect { .. } => write!(f, "SELECT"), | ||
65 | Brush::Fill => write!(f, "FILL"), | ||
66 | Brush::Custom { .. } => write!(f, "CUSTOM"), | ||
67 | } | ||
68 | } | ||
69 | } | ||
70 | |||
71 | pub enum BrushError { | ||
72 | CannotIncreaseSize, | ||
73 | } | ||