Skip to content

Commit 7c14b78

Browse files
Alexandre425not-fl3
authored andcommitted
added progress bar, cargo fmt
1 parent 66dec99 commit 7c14b78

File tree

6 files changed

+141
-10
lines changed

6 files changed

+141
-10
lines changed

examples/ui.rs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use macroquad::prelude::*;
22

3+
use macroquad::ui::widgets::{ProgressBar, Slider};
34
use macroquad::ui::{
45
hash, root_ui,
56
widgets::{self, Group},
@@ -144,6 +145,7 @@ async fn main() {
144145

145146
let mut number0 = 0.;
146147
let mut number1 = 0.;
148+
let mut number2 = 0.;
147149

148150
let texture: Texture2D = load_texture("examples/ferris.png").await.unwrap();
149151

@@ -214,9 +216,35 @@ async fn main() {
214216
.size(vec2(120., 70.))
215217
.ui(ui);
216218
});
217-
ui.tree_node(hash!(), "sliders", |ui| {
218-
ui.slider(hash!(), "[-10 .. 10]", -10f32..10f32, &mut number0);
219-
ui.slider(hash!(), "[0 .. 100]", 0f32..100f32, &mut number1);
219+
ui.tree_node(hash!(), "sliders and bars", |ui| {
220+
let range0 = -10f32..10f32;
221+
ui.slider(hash!(), "[-10 .. 10]", range0.clone(), &mut number0);
222+
let progress0 = number0.remap(range0.start, range0.end, 0., 1.);
223+
ProgressBar::new().label("first bar").ui(
224+
ui,
225+
progress0,
226+
format!("{:.0}%", progress0 * 100.).as_str(),
227+
);
228+
229+
let range1 = 0f32..100f32;
230+
ui.slider(hash!(), "[0 .. 100]", range1.clone(), &mut number1);
231+
let progress1 = number1.remap(range1.start, range1.end, 0., 1.);
232+
ProgressBar::new().label("second bar").ui(
233+
ui,
234+
progress1,
235+
format!("{:.1}/{:.0}", number1, range1.end).as_str(),
236+
);
237+
238+
let range2 = 0f32..1f32;
239+
Slider::new(hash!(), range2.clone())
240+
.label_width(200.)
241+
.label("slider with a long label")
242+
.ui(ui, &mut number2);
243+
let progress2 = number2;
244+
ProgressBar::new()
245+
.label("bar with a really long label")
246+
.label_width(240.)
247+
.ui(ui, progress2, "");
220248
});
221249
ui.tree_node(hash!(), "editbox 1", |ui| {
222250
ui.label(None, "This is editbox!");

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -788,14 +788,14 @@ impl EventHandler for Stage {
788788

789789
fn window_restored_event(&mut self) {
790790
let context = get_context();
791-
791+
792792
#[cfg(target_os = "android")]
793793
context.audio_context.resume();
794794
#[cfg(target_os = "android")]
795795
if miniquad::window::blocking_event_loop() {
796796
miniquad::window::schedule_update();
797797
}
798-
798+
799799
context
800800
.input_events
801801
.iter_mut()
@@ -816,7 +816,7 @@ impl EventHandler for Stage {
816816
for (_, touch) in context.touches.iter_mut() {
817817
touch.phase = input::TouchPhase::Ended;
818818
}
819-
819+
820820
context
821821
.input_events
822822
.iter_mut()

src/ui/style.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ pub struct Skin {
379379
pub scrollbar_handle_style: Style,
380380
pub checkbox_style: Style,
381381
pub group_style: Style,
382+
pub progress_bar_style: Style,
382383

383384
pub margin: f32,
384385
pub title_height: f32,
@@ -479,6 +480,13 @@ impl Skin {
479480
color_selected_hovered: Color::from_rgba(55, 55, 55, 68),
480481
..Style::default(default_font.clone())
481482
},
483+
progress_bar_style: Style {
484+
margin: Some(RectOffset::new(2., 2., 2., 2.)),
485+
color: Color::from_rgba(204, 204, 204, 235),
486+
color_hovered: Color::from_rgba(170, 170, 170, 235),
487+
text_color: Color::from_rgba(0, 0, 0, 255),
488+
..Style::default(default_font.clone())
489+
},
482490

483491
margin: 2.0,
484492
title_height: 14.0,

src/ui/widgets.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod group;
77
mod input;
88
mod label;
99
mod popup;
10+
mod progress_bar;
1011
mod separator;
1112
mod slider;
1213
mod tabbar;
@@ -22,6 +23,7 @@ pub use group::{Group, GroupToken};
2223
pub use input::InputText;
2324
pub use label::Label;
2425
pub use popup::Popup;
26+
pub use progress_bar::ProgressBar;
2527
pub use slider::Slider;
2628
pub use tabbar::Tabbar;
2729
pub use texture::Texture;

src/ui/widgets/progress_bar.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
use crate::{
2+
math::{vec2, Rect},
3+
ui::{ElementState, Layout, Ui},
4+
};
5+
6+
pub struct ProgressBar<'a> {
7+
label: &'a str,
8+
label_width: Option<f32>,
9+
}
10+
11+
impl<'a> ProgressBar<'a> {
12+
pub const fn new() -> Self {
13+
ProgressBar {
14+
label: "",
15+
label_width: None,
16+
}
17+
}
18+
19+
pub const fn label<'b>(self, label: &'b str) -> ProgressBar<'b> {
20+
ProgressBar { label, ..self }
21+
}
22+
23+
pub const fn label_width(self, width: f32) -> Self {
24+
Self {
25+
label_width: Some(width),
26+
..self
27+
}
28+
}
29+
30+
pub fn ui(self, ui: &mut Ui, progress: f32, bar_text: &str) {
31+
let context = ui.get_active_window_context();
32+
33+
let size = vec2(
34+
context.window.cursor.area.w - context.style.margin * 3. - context.window.cursor.ident,
35+
19.,
36+
);
37+
38+
let pos = context.window.cursor.fit(size, Layout::Vertical);
39+
let label_width = self.label_width.unwrap_or(100.);
40+
let bar_width = size.x - label_width;
41+
let bar_progress_width = progress.clamp(0., 1.) * bar_width;
42+
43+
let bar_background = Rect::new(pos.x, pos.y, bar_width, 20.);
44+
let bar_progress = Rect::new(pos.x, pos.y, bar_progress_width, 20.);
45+
46+
// background bar
47+
context.window.painter.draw_rect(
48+
bar_background,
49+
None,
50+
context.style.progress_bar_style.color(ElementState {
51+
focused: context.focused,
52+
hovered: false,
53+
clicked: false,
54+
selected: false,
55+
}),
56+
);
57+
// progress bar
58+
context.window.painter.draw_rect(
59+
bar_progress,
60+
None,
61+
context.style.progress_bar_style.color(ElementState {
62+
focused: context.focused,
63+
hovered: true,
64+
clicked: false,
65+
selected: false,
66+
}),
67+
);
68+
// label
69+
context.window.painter.draw_element_label(
70+
&context.style.label_style,
71+
vec2(pos.x + bar_width + 10., pos.y + 2.),
72+
self.label,
73+
ElementState {
74+
focused: context.focused,
75+
..Default::default()
76+
},
77+
);
78+
// bar text
79+
context.window.painter.draw_element_content(
80+
&context.style.label_style,
81+
vec2(pos.x, pos.y),
82+
vec2(bar_width, 20.),
83+
&bar_text.into(),
84+
ElementState {
85+
focused: context.focused,
86+
..Default::default()
87+
},
88+
);
89+
}
90+
}
91+
92+
impl Ui {
93+
pub fn progress_bar(&mut self, label: &str, progress: f32) {
94+
ProgressBar::new().label(label).ui(self, progress, "");
95+
}
96+
}

src/ui/widgets/slider.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@ impl<'a> Slider<'a> {
2323
}
2424

2525
pub const fn label<'b>(self, label: &'b str) -> Slider<'b> {
26-
Slider {
27-
label,
28-
..self
29-
}
26+
Slider { label, ..self }
3027
}
3128

3229
pub const fn label_width(self, width: f32) -> Self {

0 commit comments

Comments
 (0)