aboutsummaryrefslogtreecommitdiff
path: root/src/brush.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/brush.rs')
-rw-r--r--src/brush.rs73
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 @@
1use std::fmt;
2
3use crate::bitmap::MapPoint;
4
5#[derive(Debug, Copy, Clone)]
6pub 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
25impl 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
59impl 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
71pub enum BrushError {
72 CannotIncreaseSize,
73}