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_TEXT;
8use pushrod::render::{make_points, make_size};
9use pushrod::widgets::slider_widget::SliderOrientation::{SliderHorizontal, SliderVertical};
10use pushrod::widgets::slider_widget::SliderWidget;
11use pushrod::widgets::text_widget::{TextJustify, TextWidget};
12use sdl2::pixels::Color;
13
14#[macro_export]
20macro_rules! cast {
21 ($a:expr, $b:expr, $c:ident) => {
22 $a[$b]
23 .widget
24 .borrow_mut()
25 .as_any()
26 .downcast_mut::<$c>()
27 .unwrap()
28 };
29}
30
31pub fn main() {
32 let sdl_context = sdl2::init().unwrap();
33 let video_subsystem = sdl_context.video().unwrap();
34 let window = video_subsystem
35 .window("pushrod-render slider demo", 400, 300)
36 .position_centered()
37 .opengl()
38 .build()
39 .unwrap();
40 let mut engine = Engine::new(400, 300, 60);
41 let mut slider1 = SliderWidget::new(
42 make_points(20, 20),
43 make_size(300, 20),
44 0,
45 100,
46 20,
47 SliderHorizontal,
48 );
49
50 slider1.on_value_changed(|_slider, _widgets, _layouts, pos| {
51 let text1_id = widget_id_for_name(_widgets, String::from("text1"));
52
53 cast!(_widgets, text1_id, TextWidget).set_text(format!("{}", pos));
54 });
55
56 let mut text_widget1 = TextWidget::new(
57 String::from("assets/OpenSans-Regular.ttf"),
58 sdl2::ttf::FontStyle::NORMAL,
59 16,
60 TextJustify::Left,
61 String::from("20"),
62 make_points(330, 20),
63 make_size(50, 20),
64 );
65
66 text_widget1
67 .get_config()
68 .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
69
70 let mut slider2 = SliderWidget::new(
71 make_points(20, 50),
72 make_size(300, 20),
73 20,
74 80,
75 40,
76 SliderHorizontal,
77 );
78
79 slider2.on_value_changed(|_slider, _widgets, _layouts, pos| {
80 let text2_id = widget_id_for_name(_widgets, String::from("text2"));
81
82 cast!(_widgets, text2_id, TextWidget).set_text(format!("{}", pos));
83 });
84
85 let mut text_widget2 = TextWidget::new(
86 String::from("assets/OpenSans-Regular.ttf"),
87 sdl2::ttf::FontStyle::NORMAL,
88 16,
89 TextJustify::Left,
90 String::from("40"),
91 make_points(330, 50),
92 make_size(50, 20),
93 );
94
95 text_widget2
96 .get_config()
97 .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
98
99 let mut slider3 = SliderWidget::new(
100 make_points(30, 80),
101 make_size(20, 170),
102 0,
103 100,
104 0,
105 SliderVertical,
106 );
107
108 slider3.on_value_changed(|_slider, _widgets, _layouts, pos| {
109 let text3_id = widget_id_for_name(_widgets, String::from("text3"));
110
111 cast!(_widgets, text3_id, TextWidget).set_text(format!("{}", pos));
112 });
113
114 let mut text_widget3 = TextWidget::new(
115 String::from("assets/OpenSans-Regular.ttf"),
116 sdl2::ttf::FontStyle::NORMAL,
117 16,
118 TextJustify::Center,
119 String::from("0"),
120 make_points(16, 270),
121 make_size(50, 20),
122 );
123
124 text_widget3
125 .get_config()
126 .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
127
128 let mut slider4 = SliderWidget::new(
129 make_points(60, 80),
130 make_size(20, 170),
131 20,
132 80,
133 40,
134 SliderVertical,
135 );
136
137 slider4.on_value_changed(|_slider, _widgets, _layouts, pos| {
138 let text4_id = widget_id_for_name(_widgets, String::from("text4"));
139
140 cast!(_widgets, text4_id, TextWidget).set_text(format!("{}", pos));
141 });
142
143 let mut text_widget4 = TextWidget::new(
144 String::from("assets/OpenSans-Regular.ttf"),
145 sdl2::ttf::FontStyle::NORMAL,
146 16,
147 TextJustify::Center,
148 String::from("40"),
149 make_points(56, 270),
150 make_size(50, 20),
151 );
152
153 text_widget4
154 .get_config()
155 .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
156
157 engine.add_widget(Box::new(slider1), String::from("slider1"));
158 engine.add_widget(Box::new(text_widget1), String::from("text1"));
159 engine.add_widget(Box::new(slider2), String::from("slider2"));
160 engine.add_widget(Box::new(text_widget2), String::from("text2"));
161 engine.add_widget(Box::new(slider3), String::from("slider3"));
162 engine.add_widget(Box::new(text_widget3), String::from("text3"));
163 engine.add_widget(Box::new(slider4), String::from("slider4"));
164 engine.add_widget(Box::new(text_widget4), String::from("text4"));
165
166 engine.run(sdl_context, window);
167}