1extern crate pushrod;
2extern crate sdl2;
3
4use pushrod::render::callbacks::widget_id_for_name;
5use pushrod::render::engine::Engine;
6use pushrod::render::widget::Widget;
7use pushrod::render::widget_config::{CONFIG_COLOR_BORDER, CONFIG_COLOR_SECONDARY};
8use pushrod::render::{make_points, make_size};
9use pushrod::widgets::progress_widget::*;
10use pushrod::widgets::timer_widget::*;
11use sdl2::pixels::Color;
12
13#[macro_export]
14macro_rules! cast {
15 ($a:expr, $b:expr, $c:ident) => {
16 $a[$b]
17 .widget
18 .borrow_mut()
19 .as_any()
20 .downcast_mut::<$c>()
21 .unwrap()
22 };
23}
24
25pub fn main() {
26 let sdl_context = sdl2::init().unwrap();
27 let video_subsystem = sdl_context.video().unwrap();
28 let window = video_subsystem
29 .window("pushrod-render timer demo", 400, 180)
30 .position_centered()
31 .opengl()
32 .build()
33 .unwrap();
34 let mut engine = Engine::new(400, 180, 30);
35 let mut widget1 = ProgressWidget::new(make_points(20, 20), make_size(360, 40), 25);
36
37 widget1.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
38 widget1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 255));
39
40 let mut widget2 = ProgressWidget::new(make_points(20, 70), make_size(360, 40), 50);
41
42 widget2.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
43 widget2.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 255, 0));
44
45 let mut widget3 = ProgressWidget::new(make_points(20, 120), make_size(360, 40), 75);
46
47 widget3.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
48 widget3.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 255, 255));
49
50 let mut timer = TimerWidget::new(100, true);
51 timer.on_timeout(|_, _widgets, _layouts| {
52 let widget1_id = widget_id_for_name(_widgets, String::from("widget1"));
53 let widget2_id = widget_id_for_name(_widgets, String::from("widget2"));
54 let widget3_id = widget_id_for_name(_widgets, String::from("widget3"));
55 let progress1_value: u8 =
56 (cast!(_widgets, widget1_id, ProgressWidget).get_progress() + 1) % 100;
57 let progress2_value: u8 =
58 (cast!(_widgets, widget2_id, ProgressWidget).get_progress() + 1) % 100;
59 let progress3_value: u8 =
60 (cast!(_widgets, widget3_id, ProgressWidget).get_progress() + 1) % 100;
61
62 cast!(_widgets, widget1_id, ProgressWidget).set_progress(progress1_value);
63 cast!(_widgets, widget2_id, ProgressWidget).set_progress(progress2_value);
64 cast!(_widgets, widget3_id, ProgressWidget).set_progress(progress3_value);
65 });
66
67 engine.add_widget(Box::new(widget1), String::from("widget1"));
68 engine.add_widget(Box::new(widget2), String::from("widget2"));
69 engine.add_widget(Box::new(widget3), String::from("widget3"));
70 engine.add_widget(Box::new(timer), String::from("timer1"));
71
72 engine.run(sdl_context, window);
73}