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:
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.
Sourcepub fn new(w: u32, h: u32, frame_rate: u8) -> Self
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?
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
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}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}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}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}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}Sourcepub fn add_widget(
&mut self,
widget: Box<dyn Widget>,
widget_name: String,
) -> i32
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?
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
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}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}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}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}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}Sourcepub fn add_layout(&mut self, layout: Box<dyn Layout>) -> i32
pub fn add_layout(&mut self, layout: Box<dyn Layout>) -> i32
Adds a Layout to the Layout list.
Examples found in repository?
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}Sourcepub fn set_running(&mut self, state: bool)
pub fn set_running(&mut self, state: bool)
Sets running flag: false shuts down the engine.
Sourcepub fn on_exit<F>(&mut self, callback: F)
pub fn on_exit<F>(&mut self, callback: F)
Assigns the callback closure that will be used the application close/quit is triggered.
Examples found in repository?
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
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}Sourcepub fn run(&mut self, sdl: Sdl, window: Window)
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?
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
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}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}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}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}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}