colors/
colors.rs

1use rustui::*;
2use std::{thread, time};
3
4const RENDERING_RATE: time::Duration = time::Duration::from_millis(16);
5const INPUT_CAPTURING_RATE: time::Duration = time::Duration::from_millis(10); // ms
6
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8    let mut win = Window::new(false)?;
9    win.initialize(RENDERING_RATE)?; // Initialize the window and start the rendering thread
10    let input_rx = InputListener::new(INPUT_CAPTURING_RATE); // Create an input listener
11
12    loop {
13        // Check for key presses
14        if let Ok(InputEvent::Key(Key::Char('q'))) = input_rx.try_recv() {
15            break; // Exit the loop if 'q' is pressed
16        }
17
18        // Draw the frame
19        win.draw(|canvas| {
20            canvas.set_named_border(
21                "COLORS",
22                Align::Right,
23                Attr::NORMAL,
24                Color::White,
25                Color::default(),
26            );
27
28            // Draw color circle
29            let outer_radius: i32 = 12;
30            let inner_radius: i32 = 6;
31            for hue in 0..360 {
32                for radius in inner_radius..outer_radius {
33                    let x = (radius as f32 * (hue as f32).to_radians().cos()) as i32;
34                    let y = (radius as f32 * (hue as f32).to_radians().sin()) as i32;
35                    let sat = 255 * (radius - inner_radius - outer_radius)
36                        / (outer_radius - inner_radius);
37                    let color = Color::HSV((hue as f32 / 360.0 * 255.0) as u8, sat as u8, 255);
38                    canvas.set_str(
39                        ((canvas.width / 2) as i32 + x * 2) as usize,
40                        ((canvas.height / 2) as i32 + y) as usize,
41                        "  ",
42                        Attr::NORMAL,
43                        Color::default(),
44                        color,
45                        Align::Left,
46                    );
47                }
48            }
49            canvas.set_str(
50                canvas.width / 2 + 1,
51                canvas.height / 2,
52                "Color Circle",
53                Attr::BOLD,
54                Color::White,
55                Color::default(),
56                Align::Center,
57            );
58            canvas.set_str(
59                3,
60                2,
61                "Press 'q' to quit",
62                Attr::BOLD,
63                Color::White,
64                Color::default(),
65                Align::Left,
66            );
67        })?;
68
69        thread::sleep(time::Duration::from_millis(100)); // Sleep to prevent high CPU usage
70    }
71    Ok(())
72}