1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use sdl2::pixels::Color;
use sdl2::rect::{Point, Rect};
use sdl2::render::Canvas;
use sdl2::video::Window;
use drawable::{DrawSettings, Drawable, KnownSize, Position, State};
pub struct Margin<T: Drawable + KnownSize> {
pub margin: (u32, u32, u32, u32),
pub inner: T,
}
impl<T: Drawable + KnownSize> Margin<T> {
pub fn new(margin: (u32, u32, u32, u32), inner: T) -> Margin<T> {
Margin { margin, inner }
}
pub fn new_vert_hor(vertical: u32, horizontal: u32, inner: T) -> Margin<T> {
Margin {
margin: (vertical, horizontal, vertical, horizontal),
inner,
}
}
}
impl<T: Drawable + KnownSize> Drawable for Margin<T> {
fn content(&self) -> Vec<&dyn Drawable> {
vec![&self.inner]
}
fn content_mut(&mut self) -> Vec<&mut dyn Drawable> {
vec![&mut self.inner]
}
fn load(&mut self) {
self.inner.load();
}
fn update(&mut self, dt: f64) {
self.inner.update(dt);
}
fn step(&mut self) {
self.inner.step()
}
fn state(&self) -> State {
self.inner.state()
}
fn draw(&self, canvas: &mut Canvas<Window>, pos: &Position, settings: DrawSettings) {
match pos {
Position::Rect(r) => {
let r2 = Rect::new(
r.x() + self.margin.1 as i32,
r.y() + self.margin.0 as i32,
r.width() - self.margin.1 - self.margin.3,
r.height() - self.margin.0 - self.margin.2,
);
if settings.notes_view {
canvas.set_draw_color(Color::RGB(0, 255, 0));
canvas.draw_rect(*r).expect("Can't draw");
canvas.set_draw_color(Color::RGB(255, 0, 0));
canvas.draw_rect(r2).expect("Can't draw");
canvas.set_draw_color(Color::RGB(0, 0, 255));
let functions: [&dyn for<'r> Fn(&'r Rect) -> Point; 4] = [
&Rect::top_left,
&Rect::top_right,
&Rect::bottom_left,
&Rect::bottom_right,
];
for f in &functions {
let p1 = f(r);
let p2 = f(&r2);
canvas.draw_line(p2, p1).expect("Can't draw");
canvas
.draw_line(p2, Point::new((p2.x() + p1.x()) / 2, p2.y()))
.expect("Can't draw");
canvas
.draw_line(p2, Point::new(p2.x(), (p2.y() + p1.y()) / 2))
.expect("Can't draw");
}
}
self.inner.draw(canvas, &Position::Rect(r2), settings);
}
_ => {
self.inner.draw(canvas, pos, settings);
}
}
}
}
impl<T: Drawable + KnownSize> KnownSize for Margin<T> {
fn width(&self) -> usize {
self.inner.width() + (self.margin.1 + self.margin.3) as usize
}
fn height(&self) -> usize {
self.inner.height() + (self.margin.0 + self.margin.2) as usize
}
}