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_BORDER_WIDTH, CONFIG_COLOR_BORDER, CONFIG_COLOR_TEXT};
8use pushrod::render::{make_points, make_size};
9use pushrod::widgets::grid_widget::GridWidget;
10use pushrod::widgets::slider_widget::SliderOrientation::SliderHorizontal;
11use pushrod::widgets::slider_widget::SliderWidget;
12use pushrod::widgets::text_widget::{TextJustify, TextWidget};
13use sdl2::pixels::Color;
14
15#[macro_export]
21macro_rules! cast {
22 ($a:expr, $b:expr, $c:ident) => {
23 $a[$b]
24 .widget
25 .borrow_mut()
26 .as_any()
27 .downcast_mut::<$c>()
28 .unwrap()
29 };
30}
31
32pub fn main() {
33 let sdl_context = sdl2::init().unwrap();
34 let video_subsystem = sdl_context.video().unwrap();
35 let window = video_subsystem
36 .window("pushrod-render grid demo", 600, 340)
37 .position_centered()
38 .opengl()
39 .build()
40 .unwrap();
41 let mut engine = Engine::new(600, 340, 60);
42 let mut grid1 = GridWidget::new(make_points(20, 20), make_size(280, 280), 10, false);
43 let mut grid2 = GridWidget::new(make_points(310, 20), make_size(280, 280), 10, true);
44
45 grid1
46 .get_config()
47 .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
48 grid1.get_config().set_numeric(CONFIG_BORDER_WIDTH, 1);
49
50 grid2
51 .get_config()
52 .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
53 grid2.get_config().set_numeric(CONFIG_BORDER_WIDTH, 1);
54
55 let mut slider1 = SliderWidget::new(
56 make_points(20, 310),
57 make_size(320, 20),
58 1,
59 20,
60 10,
61 SliderHorizontal,
62 );
63
64 slider1.on_value_changed(|_slider, _widgets, _layouts, pos| {
65 let text1_id = widget_id_for_name(_widgets, String::from("text1"));
66 let grid1_id = widget_id_for_name(_widgets, String::from("grid1"));
67 let grid2_id = widget_id_for_name(_widgets, String::from("grid2"));
68
69 cast!(_widgets, text1_id, TextWidget).set_text(format!("{}", pos));
70 cast!(_widgets, grid1_id, GridWidget).set_grid_size(pos);
71 cast!(_widgets, grid2_id, GridWidget).set_grid_size(pos);
72 });
73
74 let mut text_widget1 = TextWidget::new(
75 String::from("assets/OpenSans-Regular.ttf"),
76 sdl2::ttf::FontStyle::NORMAL,
77 16,
78 TextJustify::Left,
79 String::from("10"),
80 make_points(360, 310),
81 make_size(40, 20),
82 );
83
84 text_widget1
85 .get_config()
86 .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
87
88 engine.add_widget(Box::new(grid1), String::from("grid1"));
89 engine.add_widget(Box::new(grid2), String::from("grid2"));
90 engine.add_widget(Box::new(slider1), String::from("slider1"));
91 engine.add_widget(Box::new(text_widget1), String::from("text1"));
92
93 engine.run(sdl_context, window);
94}