librsmsx/libs/
simple_ui.rs

1use sdl3::{
2    pixels::Color,
3    render::{Canvas, FPoint, FRect},
4    video::Window,
5};
6
7// TODO: use better GUI when they adopt SDL3 properly
8pub fn simple_ui_button(
9    rect: &FRect,
10    color: Color,
11    canvas: &mut Canvas<Window>,
12    point: &FPoint,
13    pressed: bool,
14    scale: f32,
15    text: &str,
16) -> bool {
17    let color_ = canvas.draw_color();
18    canvas.set_draw_color(color);
19    // canvas.fill_rect(Rect::new(0, 0, 512, 192)).unwrap(); // fill_rect does not work for now
20    canvas.draw_rect(*rect).unwrap();
21
22    // draw text
23    for (i, ch) in text.chars().collect::<Vec<char>>().iter().enumerate() {
24        draw_letter(canvas, rect.x + 7.0 + (i as f32 * 10.), rect.y + 10., *ch);
25    }
26
27    canvas.set_draw_color(color_);
28
29    let x0 = rect.x * scale;
30    let y0 = rect.y * scale;
31    let x1 = (rect.x + rect.w) * scale;
32    let y1 = (rect.y + rect.h) * scale;
33    pressed && x0 <= point.x && point.x <= x1 && y0 <= point.y && point.y <= y1
34}
35
36fn draw_letter(canvas: &mut Canvas<Window>, x: f32, y: f32, ch: char) {
37    match ch {
38        'A' => {
39            let v: Vec<FPoint> = vec![
40                FPoint::new(x + 0., y + 10.),
41                FPoint::new(x + 0., y + 5.),
42                FPoint::new(x + 2., y + 0.),
43                FPoint::new(x + 3., y + 0.),
44                FPoint::new(x + 5., y + 5.),
45                FPoint::new(x + 5., y + 10.),
46                FPoint::new(x + 5., y + 5.),
47                FPoint::new(x + 0., y + 5.),
48            ];
49            canvas.draw_lines(v.as_slice()).unwrap();
50        }
51        'B' => {
52            let v: Vec<FPoint> = vec![
53                FPoint::new(x + 0., y + 10.),
54                FPoint::new(x + 0., y + 0.),
55                FPoint::new(x + 3., y + 0.),
56                FPoint::new(x + 5., y + 2.),
57                FPoint::new(x + 5., y + 3.),
58                FPoint::new(x + 3., y + 5.),
59                FPoint::new(x + 0., y + 5.),
60                FPoint::new(x + 3., y + 5.),
61                FPoint::new(x + 5., y + 7.),
62                FPoint::new(x + 5., y + 8.),
63                FPoint::new(x + 3., y + 10.),
64                FPoint::new(x + 0., y + 10.),
65            ];
66            canvas.draw_lines(v.as_slice()).unwrap();
67        }
68        'D' => {
69            let v: Vec<FPoint> = vec![
70                FPoint::new(x + 0., y + 0.),
71                FPoint::new(x + 0., y + 10.),
72                FPoint::new(x + 3., y + 10.),
73                FPoint::new(x + 5., y + 5.),
74                FPoint::new(x + 3., y + 0.),
75                FPoint::new(x + 0., y + 0.),
76            ];
77            canvas.draw_lines(v.as_slice()).unwrap();
78        }
79        'E' => {
80            let v: Vec<FPoint> = vec![
81                FPoint::new(x + 5., y + 0.),
82                FPoint::new(x + 0., y + 0.),
83                FPoint::new(x + 0., y + 5.),
84                FPoint::new(x + 5., y + 5.),
85                FPoint::new(x + 0., y + 5.),
86                FPoint::new(x + 0., y + 10.),
87                FPoint::new(x + 5., y + 10.),
88            ];
89            canvas.draw_lines(v.as_slice()).unwrap();
90        }
91        'G' => {
92            let v: Vec<FPoint> = vec![
93                FPoint::new(x + 5., y + 0.),
94                FPoint::new(x + 0., y + 0.),
95                FPoint::new(x + 0., y + 10.),
96                FPoint::new(x + 5., y + 10.),
97                FPoint::new(x + 5., y + 5.),
98                FPoint::new(x + 3., y + 5.),
99            ];
100            canvas.draw_lines(v.as_slice()).unwrap();
101        }
102        'L' => {
103            let v: Vec<FPoint> = vec![
104                FPoint::new(x + 0., y + 0.),
105                FPoint::new(x + 0., y + 10.),
106                FPoint::new(x + 5., y + 10.),
107            ];
108            canvas.draw_lines(v.as_slice()).unwrap();
109        }
110        'O' => {
111            let v: Vec<FPoint> = vec![
112                FPoint::new(x + 0., y + 0.),
113                FPoint::new(x + 0., y + 10.),
114                FPoint::new(x + 5., y + 10.),
115                FPoint::new(x + 5., y + 0.),
116                FPoint::new(x + 0., y + 0.),
117            ];
118            canvas.draw_lines(v.as_slice()).unwrap();
119        }
120        'R' => {
121            let v: Vec<FPoint> = vec![
122                FPoint::new(x + 0., y + 10.),
123                FPoint::new(x + 0., y + 0.),
124                FPoint::new(x + 5., y + 0.),
125                FPoint::new(x + 5., y + 5.),
126                FPoint::new(x + 0., y + 5.),
127                FPoint::new(x + 5., y + 10.),
128            ];
129            canvas.draw_lines(v.as_slice()).unwrap();
130        }
131        'S' => {
132            let v: Vec<FPoint> = vec![
133                FPoint::new(x + 5., y + 0.),
134                FPoint::new(x + 1., y + 0.),
135                FPoint::new(x + 0., y + 1.),
136                FPoint::new(x + 0., y + 5.),
137                FPoint::new(x + 5., y + 5.),
138                FPoint::new(x + 5., y + 9.),
139                FPoint::new(x + 4., y + 10.),
140                FPoint::new(x + 0., y + 10.),
141            ];
142            canvas.draw_lines(v.as_slice()).unwrap();
143        }
144        'T' => {
145            let v: Vec<FPoint> = vec![
146                FPoint::new(x + 0., y + 0.),
147                FPoint::new(x + 2.5, y + 0.),
148                FPoint::new(x + 2.5, y + 10.),
149                FPoint::new(x + 2.5, y + 0.),
150                FPoint::new(x + 5., y + 0.),
151            ];
152            canvas.draw_lines(v.as_slice()).unwrap();
153        }
154        'V' => {
155            let v: Vec<FPoint> = vec![
156                FPoint::new(x + 0., y + 0.),
157                FPoint::new(x + 2., y + 10.),
158                FPoint::new(x + 3., y + 10.),
159                FPoint::new(x + 5., y + 0.),
160            ];
161            canvas.draw_lines(v.as_slice()).unwrap();
162        }
163        '1' => {
164            let v: Vec<FPoint> = vec![
165                FPoint::new(x + 0., y + 2.),
166                FPoint::new(x + 2., y + 0.),
167                FPoint::new(x + 2., y + 10.),
168            ];
169            canvas.draw_lines(v.as_slice()).unwrap();
170        }
171        '2' => {
172            let v: Vec<FPoint> = vec![
173                FPoint::new(x + 0., y + 2.),
174                FPoint::new(x + 0., y + 0.),
175                FPoint::new(x + 5., y + 0.),
176                FPoint::new(x + 5., y + 3.),
177                FPoint::new(x + 0., y + 7.),
178                FPoint::new(x + 0., y + 10.),
179                FPoint::new(x + 5., y + 10.),
180            ];
181            canvas.draw_lines(v.as_slice()).unwrap();
182        }
183        _ => {}
184    }
185}