slider/
slider.rs

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/*
15 * This demo just tests the rendering functionality of the `BaseWidget`.  It only tests the
16 * render portion of the library, nothing else.
17 */
18
19#[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}