Struct Engine

Source
pub struct Engine { /* private fields */ }
Expand description

This is a storage container for the Pushrod event engine.

Implementations§

Source§

impl Engine

This is the heart of the Pushrod event engine, and is what is used to drive the interaction between the user and your application. The suggested method of use for this code is as follows:

§Create a new object

Use Engine::new(w, h, frame_rate) to instantiate a new object.

§Set up the base

Call engine.setup(width, height), by passing the width and height of the window that is being created for the main application. This is required, as a base widget is added to the render list. This BaseWidget is considered the parent of the application screen.

§Add Widgets to the Engine

Call add_widget(Box::new(widget), "name".to_string()) to add your Widget to the managed display list.

§Call Run()

Calling run(sdl, window) will manage the application screen after all widgets have been added to the display list.

That’s all there is to it. If you want to see more interactions on how the Engine is used in an application, check out the demo test code, and look at rust-pushrod-chassis.

Source

pub fn new(w: u32, h: u32, frame_rate: u8) -> Self

Creates a new Engine object. Sets the engine up with the bounds of the screen, and the desired FPS rate, which must be provided at instantiation time. This is in order to set up the BaseWidget in the top-level of the Engine, so that it knows what area of the screen to refresh when required as part of the draw cycle.

NOTE: Setting a lower frame_rate will increase the efficiency of your API, however, it could lower responsiveness if you have a very active UI.

Examples found in repository?
examples/push_button.rs (line 25)
16pub fn main() {
17    let sdl_context = sdl2::init().unwrap();
18    let video_subsystem = sdl_context.video().unwrap();
19    let window = video_subsystem
20        .window("pushrod-render push button demo", 400, 100)
21        .position_centered()
22        .opengl()
23        .build()
24        .unwrap();
25    let mut engine = Engine::new(400, 100, 30);
26    let mut button1 = PushButtonWidget::new(
27        make_points(20, 20),
28        make_size(360, 60),
29        String::from("Click me!"),
30        40,
31    );
32
33    button1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
34    button1.set_numeric(CONFIG_BORDER_WIDTH, 2);
35    button1.on_click(|_x, _widgets, _layouts| {
36        eprintln!("Click me clicked!");
37    });
38
39    engine.add_widget(Box::new(button1), String::from("button1"));
40
41    engine.run(sdl_context, window);
42}
More examples
Hide additional examples
examples/tab_bar.rs (line 24)
15pub fn main() {
16    let sdl_context = sdl2::init().unwrap();
17    let video_subsystem = sdl_context.video().unwrap();
18    let window = video_subsystem
19        .window("pushrod-render tab bar demo", 400, 300)
20        .position_centered()
21        .opengl()
22        .build()
23        .unwrap();
24    let mut engine = Engine::new(400, 300, 60);
25    let mut widget1 = TabBarWidget::new(
26        make_points(20, 20),
27        make_size(360, 30),
28        vec![
29            String::from("First"),
30            String::from("Second"),
31            String::from("Third"),
32        ],
33    );
34
35    widget1.set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
36    widget1.set_color(CONFIG_COLOR_HOVER, Color::RGB(192, 192, 255));
37    widget1.on_tab_selected(|_, _, _, selected_tab| {
38        eprintln!("Selected tab: {}", selected_tab);
39    });
40
41    engine.add_widget(Box::new(widget1), String::from("widget1"));
42
43    engine.run(sdl_context, window);
44}
examples/progress.rs (line 20)
11pub fn main() {
12    let sdl_context = sdl2::init().unwrap();
13    let video_subsystem = sdl_context.video().unwrap();
14    let window = video_subsystem
15        .window("pushrod-render progress demo", 400, 180)
16        .position_centered()
17        .opengl()
18        .build()
19        .unwrap();
20    let mut engine = Engine::new(400, 180, 60);
21    let mut widget1 = ProgressWidget::new(make_points(20, 20), make_size(360, 40), 25);
22
23    widget1.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
24
25    let mut widget2 = ProgressWidget::new(make_points(20, 70), make_size(360, 40), 50);
26
27    widget2.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
28
29    let mut widget3 = ProgressWidget::new(make_points(20, 120), make_size(360, 40), 75);
30
31    widget3.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
32
33    engine.add_widget(Box::new(widget1), String::from("widget1"));
34    engine.add_widget(Box::new(widget2), String::from("widget2"));
35    engine.add_widget(Box::new(widget3), String::from("widget3"));
36
37    engine.run(sdl_context, window);
38}
examples/checkbox.rs (line 17)
8pub fn main() {
9    let sdl_context = sdl2::init().unwrap();
10    let video_subsystem = sdl_context.video().unwrap();
11    let window = video_subsystem
12        .window("pushrod-render image button demo", 400, 180)
13        .position_centered()
14        .opengl()
15        .build()
16        .unwrap();
17    let mut engine = Engine::new(400, 180, 60);
18    let widget1 = CheckboxWidget::new(
19        make_points(20, 20),
20        make_size(360, 30),
21        String::from(" Checkbox Item 1"),
22        22,
23        false,
24    );
25    let widget2 = CheckboxWidget::new(
26        make_points(20, 70),
27        make_size(360, 30),
28        String::from(" Checked Checkbox"),
29        22,
30        true,
31    );
32    let widget3 = CheckboxWidget::new(
33        make_points(20, 120),
34        make_size(360, 30),
35        String::from(" Unchecked Checkbox"),
36        22,
37        false,
38    );
39
40    engine.add_widget(Box::new(widget1), String::from("widget1"));
41    engine.add_widget(Box::new(widget2), String::from("widget2"));
42    engine.add_widget(Box::new(widget3), String::from("widget3"));
43
44    engine.run(sdl_context, window);
45}
examples/list.rs (line 23)
14pub fn main() {
15    let sdl_context = sdl2::init().unwrap();
16    let video_subsystem = sdl_context.video().unwrap();
17    let window = video_subsystem
18        .window("pushrod-render list demo", 400, 300)
19        .position_centered()
20        .opengl()
21        .build()
22        .unwrap();
23    let mut engine = Engine::new(400, 300, 60);
24    let mut widget1 = ListWidget::new(make_points(20, 20), make_size(200, 260));
25
26    widget1.set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
27    widget1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
28    widget1.set_color(CONFIG_COLOR_HOVER, Color::RGB(0x90, 0x90, 0xFF));
29    widget1.set_numeric(CONFIG_BORDER_WIDTH, 1);
30
31    widget1.add_item(String::from("Item 1"));
32    widget1.add_item(String::from("Item 2"));
33    widget1.add_item(String::from("Item 3"));
34    widget1.add_item(String::from("Item 4"));
35    widget1.add_item(String::from("Item 5"));
36
37    widget1.on_selected(|x, _widgets, _layout, selected_item| {
38        eprintln!("Selected: {}", selected_item);
39    });
40
41    engine.add_widget(Box::new(widget1), String::from("widget1"));
42
43    engine.run(sdl_context, window);
44}
examples/image_button.rs (line 17)
8pub fn main() {
9    let sdl_context = sdl2::init().unwrap();
10    let video_subsystem = sdl_context.video().unwrap();
11    let window = video_subsystem
12        .window("pushrod-render image button demo", 400, 180)
13        .position_centered()
14        .opengl()
15        .build()
16        .unwrap();
17    let mut engine = Engine::new(400, 180, 60);
18    let widget1 = ImageButtonWidget::new(
19        make_points(20, 20),
20        make_size(360, 40),
21        String::from(" Rust Logo"),
22        24,
23        String::from("assets/rust-48x48.jpg"),
24    );
25    let widget2 = ImageButtonWidget::new(
26        make_points(20, 70),
27        make_size(360, 40),
28        String::from(" Unselected Radio Button"),
29        24,
30        String::from("assets/radio_unselected.png"),
31    );
32    let widget3 = ImageButtonWidget::new(
33        make_points(20, 120),
34        make_size(360, 40),
35        String::from(" Unchecked Button"),
36        24,
37        String::from("assets/checkbox_unselected.png"),
38    );
39
40    engine.add_widget(Box::new(widget1), String::from("widget1"));
41    engine.add_widget(Box::new(widget2), String::from("widget2"));
42    engine.add_widget(Box::new(widget3), String::from("widget3"));
43
44    engine.run(sdl_context, window);
45}
Source

pub fn add_widget( &mut self, widget: Box<dyn Widget>, widget_name: String, ) -> i32

Adds a Widget to the display list. Widgets are rendered in the order in which they were created in the display list.

Examples found in repository?
examples/push_button.rs (line 39)
16pub fn main() {
17    let sdl_context = sdl2::init().unwrap();
18    let video_subsystem = sdl_context.video().unwrap();
19    let window = video_subsystem
20        .window("pushrod-render push button demo", 400, 100)
21        .position_centered()
22        .opengl()
23        .build()
24        .unwrap();
25    let mut engine = Engine::new(400, 100, 30);
26    let mut button1 = PushButtonWidget::new(
27        make_points(20, 20),
28        make_size(360, 60),
29        String::from("Click me!"),
30        40,
31    );
32
33    button1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
34    button1.set_numeric(CONFIG_BORDER_WIDTH, 2);
35    button1.on_click(|_x, _widgets, _layouts| {
36        eprintln!("Click me clicked!");
37    });
38
39    engine.add_widget(Box::new(button1), String::from("button1"));
40
41    engine.run(sdl_context, window);
42}
More examples
Hide additional examples
examples/tab_bar.rs (line 41)
15pub fn main() {
16    let sdl_context = sdl2::init().unwrap();
17    let video_subsystem = sdl_context.video().unwrap();
18    let window = video_subsystem
19        .window("pushrod-render tab bar demo", 400, 300)
20        .position_centered()
21        .opengl()
22        .build()
23        .unwrap();
24    let mut engine = Engine::new(400, 300, 60);
25    let mut widget1 = TabBarWidget::new(
26        make_points(20, 20),
27        make_size(360, 30),
28        vec![
29            String::from("First"),
30            String::from("Second"),
31            String::from("Third"),
32        ],
33    );
34
35    widget1.set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
36    widget1.set_color(CONFIG_COLOR_HOVER, Color::RGB(192, 192, 255));
37    widget1.on_tab_selected(|_, _, _, selected_tab| {
38        eprintln!("Selected tab: {}", selected_tab);
39    });
40
41    engine.add_widget(Box::new(widget1), String::from("widget1"));
42
43    engine.run(sdl_context, window);
44}
examples/progress.rs (line 33)
11pub fn main() {
12    let sdl_context = sdl2::init().unwrap();
13    let video_subsystem = sdl_context.video().unwrap();
14    let window = video_subsystem
15        .window("pushrod-render progress demo", 400, 180)
16        .position_centered()
17        .opengl()
18        .build()
19        .unwrap();
20    let mut engine = Engine::new(400, 180, 60);
21    let mut widget1 = ProgressWidget::new(make_points(20, 20), make_size(360, 40), 25);
22
23    widget1.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
24
25    let mut widget2 = ProgressWidget::new(make_points(20, 70), make_size(360, 40), 50);
26
27    widget2.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
28
29    let mut widget3 = ProgressWidget::new(make_points(20, 120), make_size(360, 40), 75);
30
31    widget3.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
32
33    engine.add_widget(Box::new(widget1), String::from("widget1"));
34    engine.add_widget(Box::new(widget2), String::from("widget2"));
35    engine.add_widget(Box::new(widget3), String::from("widget3"));
36
37    engine.run(sdl_context, window);
38}
examples/checkbox.rs (line 40)
8pub fn main() {
9    let sdl_context = sdl2::init().unwrap();
10    let video_subsystem = sdl_context.video().unwrap();
11    let window = video_subsystem
12        .window("pushrod-render image button demo", 400, 180)
13        .position_centered()
14        .opengl()
15        .build()
16        .unwrap();
17    let mut engine = Engine::new(400, 180, 60);
18    let widget1 = CheckboxWidget::new(
19        make_points(20, 20),
20        make_size(360, 30),
21        String::from(" Checkbox Item 1"),
22        22,
23        false,
24    );
25    let widget2 = CheckboxWidget::new(
26        make_points(20, 70),
27        make_size(360, 30),
28        String::from(" Checked Checkbox"),
29        22,
30        true,
31    );
32    let widget3 = CheckboxWidget::new(
33        make_points(20, 120),
34        make_size(360, 30),
35        String::from(" Unchecked Checkbox"),
36        22,
37        false,
38    );
39
40    engine.add_widget(Box::new(widget1), String::from("widget1"));
41    engine.add_widget(Box::new(widget2), String::from("widget2"));
42    engine.add_widget(Box::new(widget3), String::from("widget3"));
43
44    engine.run(sdl_context, window);
45}
examples/list.rs (line 41)
14pub fn main() {
15    let sdl_context = sdl2::init().unwrap();
16    let video_subsystem = sdl_context.video().unwrap();
17    let window = video_subsystem
18        .window("pushrod-render list demo", 400, 300)
19        .position_centered()
20        .opengl()
21        .build()
22        .unwrap();
23    let mut engine = Engine::new(400, 300, 60);
24    let mut widget1 = ListWidget::new(make_points(20, 20), make_size(200, 260));
25
26    widget1.set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
27    widget1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
28    widget1.set_color(CONFIG_COLOR_HOVER, Color::RGB(0x90, 0x90, 0xFF));
29    widget1.set_numeric(CONFIG_BORDER_WIDTH, 1);
30
31    widget1.add_item(String::from("Item 1"));
32    widget1.add_item(String::from("Item 2"));
33    widget1.add_item(String::from("Item 3"));
34    widget1.add_item(String::from("Item 4"));
35    widget1.add_item(String::from("Item 5"));
36
37    widget1.on_selected(|x, _widgets, _layout, selected_item| {
38        eprintln!("Selected: {}", selected_item);
39    });
40
41    engine.add_widget(Box::new(widget1), String::from("widget1"));
42
43    engine.run(sdl_context, window);
44}
examples/image_button.rs (line 40)
8pub fn main() {
9    let sdl_context = sdl2::init().unwrap();
10    let video_subsystem = sdl_context.video().unwrap();
11    let window = video_subsystem
12        .window("pushrod-render image button demo", 400, 180)
13        .position_centered()
14        .opengl()
15        .build()
16        .unwrap();
17    let mut engine = Engine::new(400, 180, 60);
18    let widget1 = ImageButtonWidget::new(
19        make_points(20, 20),
20        make_size(360, 40),
21        String::from(" Rust Logo"),
22        24,
23        String::from("assets/rust-48x48.jpg"),
24    );
25    let widget2 = ImageButtonWidget::new(
26        make_points(20, 70),
27        make_size(360, 40),
28        String::from(" Unselected Radio Button"),
29        24,
30        String::from("assets/radio_unselected.png"),
31    );
32    let widget3 = ImageButtonWidget::new(
33        make_points(20, 120),
34        make_size(360, 40),
35        String::from(" Unchecked Button"),
36        24,
37        String::from("assets/checkbox_unselected.png"),
38    );
39
40    engine.add_widget(Box::new(widget1), String::from("widget1"));
41    engine.add_widget(Box::new(widget2), String::from("widget2"));
42    engine.add_widget(Box::new(widget3), String::from("widget3"));
43
44    engine.run(sdl_context, window);
45}
Source

pub fn add_layout(&mut self, layout: Box<dyn Layout>) -> i32

Adds a Layout to the Layout list.

Examples found in repository?
examples/layout.rs (line 83)
33pub fn main() {
34    let sdl_context = sdl2::init().unwrap();
35    let video_subsystem = sdl_context.video().unwrap();
36    let window = video_subsystem
37        .window("pushrod-render horizontal layout demo", 400, 300)
38        .position_centered()
39        .opengl()
40        .build()
41        .unwrap();
42    let mut engine = Engine::new(400, 300, 60);
43    let mut layout = HorizontalLayout::new(20, 20, 360, 80, PaddingConstraint::new(0, 0, 0, 0, 1));
44    let mut layout2 =
45        VerticalLayout::new(250, 120, 130, 160, PaddingConstraint::new(0, 0, 0, 0, 1));
46    let mut widget1 = BaseWidget::new(make_points_origin(), make_size(0, 0));
47
48    widget1
49        .get_config()
50        .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
51    widget1.get_config().set_numeric(CONFIG_BORDER_WIDTH, 2);
52
53    let mut widget2 = BaseWidget::new(make_points_origin(), make_size(0, 0));
54
55    widget2
56        .get_config()
57        .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
58    widget2.get_config().set_numeric(CONFIG_BORDER_WIDTH, 2);
59
60    let mut widget3 = BaseWidget::new(make_points_origin(), make_size(0, 0));
61
62    widget3
63        .get_config()
64        .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
65    widget3.get_config().set_numeric(CONFIG_BORDER_WIDTH, 2);
66
67    let mut widget4 = BaseWidget::new(make_points_origin(), make_size(0, 0));
68
69    widget4
70        .get_config()
71        .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
72    widget4.get_config().set_numeric(CONFIG_BORDER_WIDTH, 2);
73
74    let widget1_id = engine.add_widget(Box::new(widget1), String::from("widget1"));
75    let widget2_id = engine.add_widget(Box::new(widget2), String::from("widget2"));
76    let widget3_id = engine.add_widget(Box::new(widget3), String::from("widget3"));
77    let widget4_id = engine.add_widget(Box::new(widget4), String::from("widget4"));
78
79    layout.append_widget(widget1_id);
80    layout.append_widget(widget2_id);
81    layout2.append_widget(widget3_id);
82    layout2.append_widget(widget4_id);
83    engine.add_layout(Box::new(layout));
84    engine.add_layout(Box::new(layout2));
85
86    let mut text_widget1 = TextWidget::new(
87        String::from("assets/OpenSans-Regular.ttf"),
88        sdl2::ttf::FontStyle::NORMAL,
89        16,
90        TextJustify::Right,
91        String::from("Spacing:"),
92        make_points(20, 116),
93        make_size(70, 22),
94    );
95
96    text_widget1
97        .get_config()
98        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
99
100    let mut text_widget2 = TextWidget::new(
101        String::from("assets/OpenSans-Regular.ttf"),
102        sdl2::ttf::FontStyle::NORMAL,
103        16,
104        TextJustify::Left,
105        String::from("1"),
106        make_points(100, 116),
107        make_size(40, 22),
108    );
109
110    text_widget2
111        .get_config()
112        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 255));
113
114    let mut button1 = PushButtonWidget::new(
115        make_points(130, 112),
116        make_size(50, 30),
117        String::from("<"),
118        20,
119    );
120
121    button1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
122    button1.set_numeric(CONFIG_BORDER_WIDTH, 2);
123    button1.on_click(|_, _widgets, _layouts| {
124        let mut spacing = _layouts[0].layout.borrow_mut().get_padding().spacing - 1;
125        let top = _layouts[0].layout.borrow_mut().get_padding().top;
126        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
127        let left = _layouts[0].layout.borrow_mut().get_padding().left;
128        let right = _layouts[0].layout.borrow_mut().get_padding().right;
129        let text_widget2_id = widget_id_for_name(_widgets, String::from("text_widget2"));
130
131        if spacing <= 0 {
132            spacing = 0;
133        }
134
135        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
136
137        _layouts[0]
138            .layout
139            .borrow_mut()
140            .set_padding(spacing_new.clone());
141        _layouts[1]
142            .layout
143            .borrow_mut()
144            .set_padding(spacing_new.clone());
145
146        refresh_widgets(_widgets);
147
148        cast!(_widgets, text_widget2_id, TextWidget).set_text(format!("{}", spacing));
149    });
150
151    let mut button2 = PushButtonWidget::new(
152        make_points(180, 112),
153        make_size(50, 30),
154        String::from(">"),
155        20,
156    );
157
158    button2.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
159    button2.set_numeric(CONFIG_BORDER_WIDTH, 2);
160    button2.on_click(|_, _widgets, _layouts| {
161        let mut spacing = _layouts[0].layout.borrow_mut().get_padding().spacing + 1;
162        let top = _layouts[0].layout.borrow_mut().get_padding().top;
163        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
164        let left = _layouts[0].layout.borrow_mut().get_padding().left;
165        let right = _layouts[0].layout.borrow_mut().get_padding().right;
166        let text_widget2_id = widget_id_for_name(_widgets, String::from("text_widget2"));
167
168        if spacing >= MAX_SPACING {
169            spacing = MAX_SPACING;
170        }
171
172        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
173
174        _layouts[0]
175            .layout
176            .borrow_mut()
177            .set_padding(spacing_new.clone());
178        _layouts[1]
179            .layout
180            .borrow_mut()
181            .set_padding(spacing_new.clone());
182
183        refresh_widgets(_widgets);
184
185        cast!(_widgets, text_widget2_id, TextWidget).set_text(format!("{}", spacing));
186    });
187
188    let mut text_widget3 = TextWidget::new(
189        String::from("assets/OpenSans-Regular.ttf"),
190        sdl2::ttf::FontStyle::NORMAL,
191        16,
192        TextJustify::Right,
193        String::from("Top:"),
194        make_points(20, 146),
195        make_size(70, 22),
196    );
197
198    text_widget3
199        .get_config()
200        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
201
202    let mut text_widget4 = TextWidget::new(
203        String::from("assets/OpenSans-Regular.ttf"),
204        sdl2::ttf::FontStyle::NORMAL,
205        16,
206        TextJustify::Left,
207        String::from("0"),
208        make_points(100, 146),
209        make_size(40, 22),
210    );
211
212    text_widget4
213        .get_config()
214        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 255));
215
216    let mut button3 = PushButtonWidget::new(
217        make_points(130, 142),
218        make_size(50, 30),
219        String::from("<"),
220        20,
221    );
222
223    button3.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
224    button3.set_numeric(CONFIG_BORDER_WIDTH, 2);
225    button3.on_click(|_, _widgets, _layouts| {
226        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
227        let mut top = _layouts[0].layout.borrow_mut().get_padding().top - 1;
228        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
229        let left = _layouts[0].layout.borrow_mut().get_padding().left;
230        let right = _layouts[0].layout.borrow_mut().get_padding().right;
231        let text_widget4_id = widget_id_for_name(_widgets, String::from("text_widget4"));
232
233        if top <= 0 {
234            top = 0;
235        }
236
237        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
238
239        _layouts[0]
240            .layout
241            .borrow_mut()
242            .set_padding(spacing_new.clone());
243        _layouts[1]
244            .layout
245            .borrow_mut()
246            .set_padding(spacing_new.clone());
247
248        refresh_widgets(_widgets);
249
250        cast!(_widgets, text_widget4_id, TextWidget).set_text(format!("{}", top));
251    });
252
253    let mut button4 = PushButtonWidget::new(
254        make_points(180, 142),
255        make_size(50, 30),
256        String::from(">"),
257        20,
258    );
259
260    button4.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
261    button4.set_numeric(CONFIG_BORDER_WIDTH, 2);
262    button4.on_click(|_, _widgets, _layouts| {
263        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
264        let mut top = _layouts[0].layout.borrow_mut().get_padding().top + 1;
265        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
266        let left = _layouts[0].layout.borrow_mut().get_padding().left;
267        let right = _layouts[0].layout.borrow_mut().get_padding().right;
268        let text_widget4_id = widget_id_for_name(_widgets, String::from("text_widget4"));
269
270        if top >= MAX_SPACING {
271            top = MAX_SPACING;
272        }
273
274        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
275
276        _layouts[0]
277            .layout
278            .borrow_mut()
279            .set_padding(spacing_new.clone());
280        _layouts[1]
281            .layout
282            .borrow_mut()
283            .set_padding(spacing_new.clone());
284
285        refresh_widgets(_widgets);
286
287        cast!(_widgets, text_widget4_id, TextWidget).set_text(format!("{}", top));
288    });
289
290    let mut text_widget5 = TextWidget::new(
291        String::from("assets/OpenSans-Regular.ttf"),
292        sdl2::ttf::FontStyle::NORMAL,
293        16,
294        TextJustify::Right,
295        String::from("Bottom:"),
296        make_points(20, 176),
297        make_size(70, 22),
298    );
299
300    text_widget5
301        .get_config()
302        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
303
304    let mut text_widget6 = TextWidget::new(
305        String::from("assets/OpenSans-Regular.ttf"),
306        sdl2::ttf::FontStyle::NORMAL,
307        16,
308        TextJustify::Left,
309        String::from("0"),
310        make_points(100, 176),
311        make_size(40, 22),
312    );
313
314    text_widget6
315        .get_config()
316        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 255));
317
318    let mut button5 = PushButtonWidget::new(
319        make_points(130, 172),
320        make_size(50, 30),
321        String::from("<"),
322        20,
323    );
324
325    button5.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
326    button5.set_numeric(CONFIG_BORDER_WIDTH, 2);
327    button5.on_click(|_, _widgets, _layouts| {
328        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
329        let top = _layouts[0].layout.borrow_mut().get_padding().top;
330        let mut bottom = _layouts[0].layout.borrow_mut().get_padding().bottom - 1;
331        let left = _layouts[0].layout.borrow_mut().get_padding().left;
332        let right = _layouts[0].layout.borrow_mut().get_padding().right;
333        let text_widget6_id = widget_id_for_name(_widgets, String::from("text_widget6"));
334
335        if bottom <= 0 {
336            bottom = 0;
337        }
338
339        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
340
341        _layouts[0]
342            .layout
343            .borrow_mut()
344            .set_padding(spacing_new.clone());
345        _layouts[1]
346            .layout
347            .borrow_mut()
348            .set_padding(spacing_new.clone());
349
350        refresh_widgets(_widgets);
351
352        cast!(_widgets, text_widget6_id, TextWidget).set_text(format!("{}", bottom));
353    });
354
355    let mut button6 = PushButtonWidget::new(
356        make_points(180, 172),
357        make_size(50, 30),
358        String::from(">"),
359        20,
360    );
361
362    button6.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
363    button6.set_numeric(CONFIG_BORDER_WIDTH, 2);
364    button6.on_click(|_, _widgets, _layouts| {
365        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
366        let top = _layouts[0].layout.borrow_mut().get_padding().top;
367        let mut bottom = _layouts[0].layout.borrow_mut().get_padding().bottom + 1;
368        let left = _layouts[0].layout.borrow_mut().get_padding().left;
369        let right = _layouts[0].layout.borrow_mut().get_padding().right;
370        let text_widget6_id = widget_id_for_name(_widgets, String::from("text_widget6"));
371
372        if bottom >= MAX_SPACING {
373            bottom = MAX_SPACING;
374        }
375
376        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
377
378        _layouts[0]
379            .layout
380            .borrow_mut()
381            .set_padding(spacing_new.clone());
382        _layouts[1]
383            .layout
384            .borrow_mut()
385            .set_padding(spacing_new.clone());
386
387        refresh_widgets(_widgets);
388
389        cast!(_widgets, text_widget6_id, TextWidget).set_text(format!("{}", bottom));
390    });
391
392    let mut text_widget7 = TextWidget::new(
393        String::from("assets/OpenSans-Regular.ttf"),
394        sdl2::ttf::FontStyle::NORMAL,
395        16,
396        TextJustify::Right,
397        String::from("Left:"),
398        make_points(20, 206),
399        make_size(70, 22),
400    );
401
402    text_widget7
403        .get_config()
404        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
405
406    let mut text_widget8 = TextWidget::new(
407        String::from("assets/OpenSans-Regular.ttf"),
408        sdl2::ttf::FontStyle::NORMAL,
409        16,
410        TextJustify::Left,
411        String::from("0"),
412        make_points(100, 206),
413        make_size(40, 22),
414    );
415
416    text_widget8
417        .get_config()
418        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 255));
419
420    let mut button7 = PushButtonWidget::new(
421        make_points(130, 202),
422        make_size(50, 30),
423        String::from("<"),
424        20,
425    );
426
427    button7.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
428    button7.set_numeric(CONFIG_BORDER_WIDTH, 2);
429    button7.on_click(|_, _widgets, _layouts| {
430        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
431        let top = _layouts[0].layout.borrow_mut().get_padding().top;
432        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
433        let mut left = _layouts[0].layout.borrow_mut().get_padding().left - 1;
434        let right = _layouts[0].layout.borrow_mut().get_padding().right;
435        let text_widget8_id = widget_id_for_name(_widgets, String::from("text_widget8"));
436
437        if left <= 0 {
438            left = 0;
439        }
440
441        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
442
443        _layouts[0]
444            .layout
445            .borrow_mut()
446            .set_padding(spacing_new.clone());
447        _layouts[1]
448            .layout
449            .borrow_mut()
450            .set_padding(spacing_new.clone());
451
452        refresh_widgets(_widgets);
453
454        cast!(_widgets, text_widget8_id, TextWidget).set_text(format!("{}", left));
455    });
456
457    let mut button8 = PushButtonWidget::new(
458        make_points(180, 202),
459        make_size(50, 30),
460        String::from(">"),
461        20,
462    );
463
464    button8.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
465    button8.set_numeric(CONFIG_BORDER_WIDTH, 2);
466    button8.on_click(|_, _widgets, _layouts| {
467        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
468        let top = _layouts[0].layout.borrow_mut().get_padding().top;
469        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
470        let mut left = _layouts[0].layout.borrow_mut().get_padding().left + 1;
471        let right = _layouts[0].layout.borrow_mut().get_padding().right;
472        let text_widget8_id = widget_id_for_name(_widgets, String::from("text_widget8"));
473
474        if left >= MAX_SPACING {
475            left = MAX_SPACING;
476        }
477
478        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
479
480        _layouts[0]
481            .layout
482            .borrow_mut()
483            .set_padding(spacing_new.clone());
484        _layouts[1]
485            .layout
486            .borrow_mut()
487            .set_padding(spacing_new.clone());
488
489        refresh_widgets(_widgets);
490
491        cast!(_widgets, text_widget8_id, TextWidget).set_text(format!("{}", left));
492    });
493
494    let mut text_widget9 = TextWidget::new(
495        String::from("assets/OpenSans-Regular.ttf"),
496        sdl2::ttf::FontStyle::NORMAL,
497        16,
498        TextJustify::Right,
499        String::from("Right:"),
500        make_points(20, 236),
501        make_size(70, 22),
502    );
503
504    text_widget9
505        .get_config()
506        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 0));
507
508    let mut text_widget10 = TextWidget::new(
509        String::from("assets/OpenSans-Regular.ttf"),
510        sdl2::ttf::FontStyle::NORMAL,
511        16,
512        TextJustify::Left,
513        String::from("0"),
514        make_points(100, 236),
515        make_size(40, 22),
516    );
517
518    text_widget10
519        .get_config()
520        .set_color(CONFIG_COLOR_TEXT, Color::RGB(0, 0, 255));
521
522    let mut button9 = PushButtonWidget::new(
523        make_points(130, 232),
524        make_size(50, 30),
525        String::from("<"),
526        20,
527    );
528
529    button9.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
530    button9.set_numeric(CONFIG_BORDER_WIDTH, 2);
531    button9.on_click(|_, _widgets, _layouts| {
532        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
533        let top = _layouts[0].layout.borrow_mut().get_padding().top;
534        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
535        let left = _layouts[0].layout.borrow_mut().get_padding().left;
536        let mut right = _layouts[0].layout.borrow_mut().get_padding().right - 1;
537        let text_widget10_id = widget_id_for_name(_widgets, String::from("text_widget10"));
538
539        if right <= 0 {
540            right = 0;
541        }
542
543        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
544
545        _layouts[0]
546            .layout
547            .borrow_mut()
548            .set_padding(spacing_new.clone());
549        _layouts[1]
550            .layout
551            .borrow_mut()
552            .set_padding(spacing_new.clone());
553
554        refresh_widgets(_widgets);
555
556        cast!(_widgets, text_widget10_id, TextWidget).set_text(format!("{}", right));
557    });
558
559    let mut button10 = PushButtonWidget::new(
560        make_points(180, 232),
561        make_size(50, 30),
562        String::from(">"),
563        20,
564    );
565
566    button10.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
567    button10.set_numeric(CONFIG_BORDER_WIDTH, 2);
568    button10.on_click(|_, _widgets, _layouts| {
569        let spacing = _layouts[0].layout.borrow_mut().get_padding().spacing;
570        let top = _layouts[0].layout.borrow_mut().get_padding().top;
571        let bottom = _layouts[0].layout.borrow_mut().get_padding().bottom;
572        let left = _layouts[0].layout.borrow_mut().get_padding().left;
573        let mut right = _layouts[0].layout.borrow_mut().get_padding().right + 1;
574        let text_widget10_id = widget_id_for_name(_widgets, String::from("text_widget10"));
575
576        if right >= MAX_SPACING {
577            right = MAX_SPACING;
578        }
579
580        let spacing_new = PaddingConstraint::new(top, bottom, left, right, spacing);
581
582        _layouts[0]
583            .layout
584            .borrow_mut()
585            .set_padding(spacing_new.clone());
586        _layouts[1]
587            .layout
588            .borrow_mut()
589            .set_padding(spacing_new.clone());
590
591        refresh_widgets(_widgets);
592
593        cast!(_widgets, text_widget10_id, TextWidget).set_text(format!("{}", right));
594    });
595
596    engine.add_widget(Box::new(text_widget1), String::from("text_widget1"));
597    engine.add_widget(Box::new(text_widget2), String::from("text_widget2"));
598    engine.add_widget(Box::new(button1), String::from("button1"));
599    engine.add_widget(Box::new(button2), String::from("button2"));
600    engine.add_widget(Box::new(text_widget3), String::from("text_widget3"));
601    engine.add_widget(Box::new(text_widget4), String::from("text_widget4"));
602    engine.add_widget(Box::new(button3), String::from("button3"));
603    engine.add_widget(Box::new(button4), String::from("button4"));
604    engine.add_widget(Box::new(text_widget5), String::from("text_widget5"));
605    engine.add_widget(Box::new(text_widget6), String::from("text_widget6"));
606    engine.add_widget(Box::new(button5), String::from("button5"));
607    engine.add_widget(Box::new(button6), String::from("button6"));
608    engine.add_widget(Box::new(text_widget7), String::from("text_widget7"));
609    engine.add_widget(Box::new(text_widget8), String::from("text_widget8"));
610    engine.add_widget(Box::new(button7), String::from("button7"));
611    engine.add_widget(Box::new(button8), String::from("button8"));
612    engine.add_widget(Box::new(text_widget9), String::from("text_widget9"));
613    engine.add_widget(Box::new(text_widget10), String::from("text_widget10"));
614    engine.add_widget(Box::new(button9), String::from("button9"));
615    engine.add_widget(Box::new(button10), String::from("button10"));
616
617    engine.run(sdl_context, window);
618}
Source

pub fn set_running(&mut self, state: bool)

Sets running flag: false shuts down the engine.

Source

pub fn on_exit<F>(&mut self, callback: F)
where F: FnMut(&mut Engine) -> bool + 'static,

Assigns the callback closure that will be used the application close/quit is triggered.

Examples found in repository?
examples/render.rs (lines 85-88)
15pub fn main() {
16    let sdl_context = sdl2::init().unwrap();
17    let video_subsystem = sdl_context.video().unwrap();
18    let window = video_subsystem
19        .window("pushrod-render demo", 800, 600)
20        .position_centered()
21        .opengl()
22        .build()
23        .unwrap();
24    let mut engine = Engine::new(800, 600, 30);
25    let mut new_base_widget = BaseWidget::new(make_points(100, 100), make_size(600, 400));
26
27    new_base_widget
28        .get_config()
29        .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
30    new_base_widget
31        .get_config()
32        .set_numeric(CONFIG_BORDER_WIDTH, 2);
33
34    new_base_widget
35        .get_callbacks()
36        .on_mouse_entered(|x, _widgets, _layouts| {
37            x.get_config()
38                .set_color(CONFIG_COLOR_BASE, Color::RGB(255, 0, 0));
39            x.get_config().set_invalidated(true);
40            _widgets[0]
41                .widget
42                .borrow_mut()
43                .get_config()
44                .set_invalidated(true);
45            eprintln!("Mouse Entered");
46        });
47
48    new_base_widget
49        .get_callbacks()
50        .on_mouse_exited(|x, _widgets, _layouts| {
51            x.get_config()
52                .set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
53            x.get_config().set_invalidated(true);
54            _widgets[0]
55                .widget
56                .borrow_mut()
57                .get_config()
58                .set_invalidated(true);
59            eprintln!("Mouse Exited");
60        });
61
62    new_base_widget
63        .get_callbacks()
64        .on_mouse_moved(|_widget, _widgets, _layouts, points| {
65            eprintln!("Mouse Moved: {:?}", points);
66        });
67
68    new_base_widget
69        .get_callbacks()
70        .on_mouse_scrolled(|_widget, _widgets, _layouts, points| {
71            eprintln!("Mouse Scrolled: {:?}", points);
72        });
73
74    new_base_widget.get_callbacks().on_mouse_clicked(
75        |_widget, _widgets, _layouts, button, clicks, state| {
76            eprintln!(
77                "Mouse Clicked: button={} clicks={} state={}",
78                button, clicks, state
79            );
80        },
81    );
82
83    engine.add_widget(Box::new(new_base_widget), String::from("widget1"));
84
85    engine.on_exit(|_| {
86        eprintln!("Application exiting.");
87        true
88    });
89
90    engine.run(sdl_context, window);
91}
More examples
Hide additional examples
examples/exit.rs (lines 86-117)
16pub fn main() {
17    let sdl_context = sdl2::init().unwrap();
18    let video_subsystem = sdl_context.video().unwrap();
19    let window = video_subsystem
20        .window("pushrod-render exit demo", 800, 600)
21        .position_centered()
22        .opengl()
23        .build()
24        .unwrap();
25    let mut engine = Engine::new(800, 600, 30);
26    let mut new_base_widget = BaseWidget::new(make_points(100, 100), make_size(600, 400));
27
28    new_base_widget
29        .get_config()
30        .set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
31    new_base_widget
32        .get_config()
33        .set_numeric(CONFIG_BORDER_WIDTH, 2);
34
35    new_base_widget
36        .get_callbacks()
37        .on_mouse_entered(|x, _widgets, _layouts| {
38            x.get_config()
39                .set_color(CONFIG_COLOR_BASE, Color::RGB(255, 0, 0));
40            x.get_config().set_invalidated(true);
41            _widgets[0]
42                .widget
43                .borrow_mut()
44                .get_config()
45                .set_invalidated(true);
46            eprintln!("Mouse Entered");
47        });
48
49    new_base_widget
50        .get_callbacks()
51        .on_mouse_exited(|x, _widgets, _layouts| {
52            x.get_config()
53                .set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
54            x.get_config().set_invalidated(true);
55            _widgets[0]
56                .widget
57                .borrow_mut()
58                .get_config()
59                .set_invalidated(true);
60            eprintln!("Mouse Exited");
61        });
62
63    new_base_widget
64        .get_callbacks()
65        .on_mouse_moved(|_widget, _widgets, _layouts, points| {
66            eprintln!("Mouse Moved: {:?}", points);
67        });
68
69    new_base_widget
70        .get_callbacks()
71        .on_mouse_scrolled(|_widget, _widgets, _layouts, points| {
72            eprintln!("Mouse Scrolled: {:?}", points);
73        });
74
75    new_base_widget.get_callbacks().on_mouse_clicked(
76        |_widget, _widgets, _layouts, button, clicks, state| {
77            eprintln!(
78                "Mouse Clicked: button={} clicks={} state={}",
79                button, clicks, state
80            );
81        },
82    );
83
84    engine.add_widget(Box::new(new_base_widget), String::from("widget1"));
85
86    engine.on_exit(|engine| {
87        let buttons: Vec<_> = vec![
88            ButtonData {
89                flags: MessageBoxButtonFlag::RETURNKEY_DEFAULT,
90                button_id: 1,
91                text: "Yes",
92            },
93            ButtonData {
94                flags: MessageBoxButtonFlag::ESCAPEKEY_DEFAULT,
95                button_id: 2,
96                text: "No",
97            },
98        ];
99
100        let res = show_message_box(
101            MessageBoxFlag::WARNING,
102            buttons.as_slice(),
103            "Quit",
104            "Are you sure?",
105            None,
106            None,
107        )
108        .unwrap();
109
110        if let ClickedButton::CustomButton(x) = res {
111            if x.button_id == 1 {
112                return true;
113            }
114        }
115
116        false
117    });
118
119    engine.run(sdl_context, window);
120}
Source

pub fn run(&mut self, sdl: Sdl, window: Window)

Main application run loop, controls interaction between the user and the application.

Examples found in repository?
examples/push_button.rs (line 41)
16pub fn main() {
17    let sdl_context = sdl2::init().unwrap();
18    let video_subsystem = sdl_context.video().unwrap();
19    let window = video_subsystem
20        .window("pushrod-render push button demo", 400, 100)
21        .position_centered()
22        .opengl()
23        .build()
24        .unwrap();
25    let mut engine = Engine::new(400, 100, 30);
26    let mut button1 = PushButtonWidget::new(
27        make_points(20, 20),
28        make_size(360, 60),
29        String::from("Click me!"),
30        40,
31    );
32
33    button1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
34    button1.set_numeric(CONFIG_BORDER_WIDTH, 2);
35    button1.on_click(|_x, _widgets, _layouts| {
36        eprintln!("Click me clicked!");
37    });
38
39    engine.add_widget(Box::new(button1), String::from("button1"));
40
41    engine.run(sdl_context, window);
42}
More examples
Hide additional examples
examples/tab_bar.rs (line 43)
15pub fn main() {
16    let sdl_context = sdl2::init().unwrap();
17    let video_subsystem = sdl_context.video().unwrap();
18    let window = video_subsystem
19        .window("pushrod-render tab bar demo", 400, 300)
20        .position_centered()
21        .opengl()
22        .build()
23        .unwrap();
24    let mut engine = Engine::new(400, 300, 60);
25    let mut widget1 = TabBarWidget::new(
26        make_points(20, 20),
27        make_size(360, 30),
28        vec![
29            String::from("First"),
30            String::from("Second"),
31            String::from("Third"),
32        ],
33    );
34
35    widget1.set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
36    widget1.set_color(CONFIG_COLOR_HOVER, Color::RGB(192, 192, 255));
37    widget1.on_tab_selected(|_, _, _, selected_tab| {
38        eprintln!("Selected tab: {}", selected_tab);
39    });
40
41    engine.add_widget(Box::new(widget1), String::from("widget1"));
42
43    engine.run(sdl_context, window);
44}
examples/progress.rs (line 37)
11pub fn main() {
12    let sdl_context = sdl2::init().unwrap();
13    let video_subsystem = sdl_context.video().unwrap();
14    let window = video_subsystem
15        .window("pushrod-render progress demo", 400, 180)
16        .position_centered()
17        .opengl()
18        .build()
19        .unwrap();
20    let mut engine = Engine::new(400, 180, 60);
21    let mut widget1 = ProgressWidget::new(make_points(20, 20), make_size(360, 40), 25);
22
23    widget1.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
24
25    let mut widget2 = ProgressWidget::new(make_points(20, 70), make_size(360, 40), 50);
26
27    widget2.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
28
29    let mut widget3 = ProgressWidget::new(make_points(20, 120), make_size(360, 40), 75);
30
31    widget3.set_color(CONFIG_COLOR_SECONDARY, Color::RGB(255, 0, 0));
32
33    engine.add_widget(Box::new(widget1), String::from("widget1"));
34    engine.add_widget(Box::new(widget2), String::from("widget2"));
35    engine.add_widget(Box::new(widget3), String::from("widget3"));
36
37    engine.run(sdl_context, window);
38}
examples/checkbox.rs (line 44)
8pub fn main() {
9    let sdl_context = sdl2::init().unwrap();
10    let video_subsystem = sdl_context.video().unwrap();
11    let window = video_subsystem
12        .window("pushrod-render image button demo", 400, 180)
13        .position_centered()
14        .opengl()
15        .build()
16        .unwrap();
17    let mut engine = Engine::new(400, 180, 60);
18    let widget1 = CheckboxWidget::new(
19        make_points(20, 20),
20        make_size(360, 30),
21        String::from(" Checkbox Item 1"),
22        22,
23        false,
24    );
25    let widget2 = CheckboxWidget::new(
26        make_points(20, 70),
27        make_size(360, 30),
28        String::from(" Checked Checkbox"),
29        22,
30        true,
31    );
32    let widget3 = CheckboxWidget::new(
33        make_points(20, 120),
34        make_size(360, 30),
35        String::from(" Unchecked Checkbox"),
36        22,
37        false,
38    );
39
40    engine.add_widget(Box::new(widget1), String::from("widget1"));
41    engine.add_widget(Box::new(widget2), String::from("widget2"));
42    engine.add_widget(Box::new(widget3), String::from("widget3"));
43
44    engine.run(sdl_context, window);
45}
examples/list.rs (line 43)
14pub fn main() {
15    let sdl_context = sdl2::init().unwrap();
16    let video_subsystem = sdl_context.video().unwrap();
17    let window = video_subsystem
18        .window("pushrod-render list demo", 400, 300)
19        .position_centered()
20        .opengl()
21        .build()
22        .unwrap();
23    let mut engine = Engine::new(400, 300, 60);
24    let mut widget1 = ListWidget::new(make_points(20, 20), make_size(200, 260));
25
26    widget1.set_color(CONFIG_COLOR_BASE, Color::RGB(255, 255, 255));
27    widget1.set_color(CONFIG_COLOR_BORDER, Color::RGB(0, 0, 0));
28    widget1.set_color(CONFIG_COLOR_HOVER, Color::RGB(0x90, 0x90, 0xFF));
29    widget1.set_numeric(CONFIG_BORDER_WIDTH, 1);
30
31    widget1.add_item(String::from("Item 1"));
32    widget1.add_item(String::from("Item 2"));
33    widget1.add_item(String::from("Item 3"));
34    widget1.add_item(String::from("Item 4"));
35    widget1.add_item(String::from("Item 5"));
36
37    widget1.on_selected(|x, _widgets, _layout, selected_item| {
38        eprintln!("Selected: {}", selected_item);
39    });
40
41    engine.add_widget(Box::new(widget1), String::from("widget1"));
42
43    engine.run(sdl_context, window);
44}
examples/image_button.rs (line 44)
8pub fn main() {
9    let sdl_context = sdl2::init().unwrap();
10    let video_subsystem = sdl_context.video().unwrap();
11    let window = video_subsystem
12        .window("pushrod-render image button demo", 400, 180)
13        .position_centered()
14        .opengl()
15        .build()
16        .unwrap();
17    let mut engine = Engine::new(400, 180, 60);
18    let widget1 = ImageButtonWidget::new(
19        make_points(20, 20),
20        make_size(360, 40),
21        String::from(" Rust Logo"),
22        24,
23        String::from("assets/rust-48x48.jpg"),
24    );
25    let widget2 = ImageButtonWidget::new(
26        make_points(20, 70),
27        make_size(360, 40),
28        String::from(" Unselected Radio Button"),
29        24,
30        String::from("assets/radio_unselected.png"),
31    );
32    let widget3 = ImageButtonWidget::new(
33        make_points(20, 120),
34        make_size(360, 40),
35        String::from(" Unchecked Button"),
36        24,
37        String::from("assets/checkbox_unselected.png"),
38    );
39
40    engine.add_widget(Box::new(widget1), String::from("widget1"));
41    engine.add_widget(Box::new(widget2), String::from("widget2"));
42    engine.add_widget(Box::new(widget3), String::from("widget3"));
43
44    engine.run(sdl_context, window);
45}

Auto Trait Implementations§

§

impl Freeze for Engine

§

impl !RefUnwindSafe for Engine

§

impl !Send for Engine

§

impl !Sync for Engine

§

impl Unpin for Engine

§

impl !UnwindSafe for Engine

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.