parent
52cd43bf29
commit
9aa8662ba9
@ -0,0 +1,68 @@
|
||||
mod circular;
|
||||
mod rectangular;
|
||||
mod starry;
|
||||
|
||||
use crate::ui::display::{Color, Icon};
|
||||
use core::slice::from_raw_parts;
|
||||
|
||||
#[cfg(feature = "model_tt")]
|
||||
use crate::ui::display::loader::circular::{
|
||||
loader_circular as determinate, loader_circular_indeterminate as indeterminate,
|
||||
};
|
||||
#[cfg(not(feature = "model_tt"))]
|
||||
use crate::ui::display::loader::rectangular::loader_rectangular as determinate;
|
||||
#[cfg(not(feature = "model_tt"))]
|
||||
use crate::ui::display::loader::starry::loader_starry_indeterminate as indeterminate;
|
||||
|
||||
pub const LOADER_MIN: u16 = 0;
|
||||
pub const LOADER_MAX: u16 = 1000;
|
||||
|
||||
pub fn loader(
|
||||
progress: u16,
|
||||
y_offset: i16,
|
||||
fg_color: Color,
|
||||
bg_color: Color,
|
||||
icon: Option<(Icon, Color)>,
|
||||
) {
|
||||
determinate(progress, y_offset, fg_color, bg_color, icon);
|
||||
}
|
||||
|
||||
pub fn loader_indeterminate(
|
||||
progress: u16,
|
||||
y_offset: i16,
|
||||
fg_color: Color,
|
||||
bg_color: Color,
|
||||
icon: Option<(Icon, Color)>,
|
||||
) {
|
||||
indeterminate(progress, y_offset, fg_color, bg_color, icon);
|
||||
}
|
||||
|
||||
//TODO: remove when loader is no longer called from C
|
||||
#[no_mangle]
|
||||
pub extern "C" fn loader_uncompress_r(
|
||||
y_offset: cty::int32_t,
|
||||
fg_color: cty::uint16_t,
|
||||
bg_color: cty::uint16_t,
|
||||
icon_color: cty::uint16_t,
|
||||
progress: cty::int32_t,
|
||||
indeterminate: cty::int32_t,
|
||||
icon_data: cty::uintptr_t,
|
||||
icon_data_size: cty::uint32_t,
|
||||
) {
|
||||
let fg = Color::from_u16(fg_color);
|
||||
let bg = Color::from_u16(bg_color);
|
||||
let ic_color = Color::from_u16(icon_color);
|
||||
|
||||
let i = if icon_data != 0 {
|
||||
let data_slice = unsafe { from_raw_parts(icon_data as _, icon_data_size as _) };
|
||||
Some((Icon::new(data_slice), ic_color))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
if indeterminate == 0 {
|
||||
loader(progress as _, y_offset as _, fg, bg, i);
|
||||
} else {
|
||||
loader_indeterminate(progress as _, y_offset as _, fg, bg, i);
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
use crate::ui::{
|
||||
constant::{screen, LOADER_INNER},
|
||||
display,
|
||||
display::{Color, Icon},
|
||||
geometry::{Offset, Rect},
|
||||
};
|
||||
|
||||
pub fn loader_rectangular(
|
||||
progress: u16,
|
||||
y_offset: i16,
|
||||
fg_color: Color,
|
||||
bg_color: Color,
|
||||
icon: Option<(Icon, Color)>,
|
||||
) {
|
||||
let area = Rect::from_center_and_size(screen().center(), Offset::uniform(LOADER_INNER as _))
|
||||
.translate(Offset::y(y_offset));
|
||||
|
||||
display::rect_rounded2_partial(
|
||||
area,
|
||||
fg_color,
|
||||
bg_color,
|
||||
(100 * progress as u32 / 1000) as i16,
|
||||
icon,
|
||||
);
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
use crate::ui::{
|
||||
constant::{screen, LOADER_OUTER},
|
||||
display::{rect_fill, rect_fill_rounded, rect_fill_rounded1, Color, Icon},
|
||||
geometry::{Offset, Point, Rect, CENTER},
|
||||
};
|
||||
use core::f32::consts::SQRT_2;
|
||||
|
||||
const SIZE_SMALL: i16 = 2;
|
||||
const SIZE_MEDIUM: i16 = 4;
|
||||
const SIZE_LARGE: i16 = 6;
|
||||
const RADIUS: i16 = 13;
|
||||
const DIAGONAL: i16 = ((RADIUS as f32 * SQRT_2) / 2_f32) as i16;
|
||||
|
||||
fn star_small(center: Point, fg: Color, _bg: Color) {
|
||||
let r = Rect::from_center_and_size(center, Offset::uniform(SIZE_SMALL));
|
||||
rect_fill(r, fg);
|
||||
}
|
||||
|
||||
fn star_medium(center: Point, fg: Color, bg: Color) {
|
||||
let r = Rect::from_center_and_size(center, Offset::uniform(SIZE_MEDIUM));
|
||||
rect_fill_rounded1(r, fg, bg);
|
||||
}
|
||||
|
||||
fn star_large(center: Point, fg: Color, bg: Color) {
|
||||
let r = Rect::from_center_and_size(center, Offset::uniform(SIZE_LARGE));
|
||||
rect_fill_rounded(r, fg, bg, 2);
|
||||
}
|
||||
|
||||
pub fn loader_starry_indeterminate(
|
||||
progress: u16,
|
||||
y_offset: i16,
|
||||
fg_color: Color,
|
||||
bg_color: Color,
|
||||
icon: Option<(Icon, Color)>,
|
||||
) {
|
||||
let area = Rect::from_center_and_size(screen().center(), Offset::uniform(LOADER_OUTER as _))
|
||||
.translate(Offset::y(y_offset));
|
||||
|
||||
rect_fill(area, bg_color);
|
||||
|
||||
let coords = [
|
||||
Point::new(area.center().x, area.center().y - RADIUS),
|
||||
Point::new(area.center().x + DIAGONAL, area.center().y - DIAGONAL),
|
||||
Point::new(area.center().x + RADIUS, area.center().y),
|
||||
Point::new(area.center().x + DIAGONAL, area.center().y + DIAGONAL),
|
||||
Point::new(area.center().x, area.center().y + RADIUS),
|
||||
Point::new(area.center().x - DIAGONAL, area.center().y + DIAGONAL),
|
||||
Point::new(area.center().x - RADIUS, area.center().y),
|
||||
Point::new(area.center().x - DIAGONAL, area.center().y - DIAGONAL),
|
||||
];
|
||||
|
||||
let big_idx = (progress / 125) as usize % 8;
|
||||
|
||||
for (i, c) in coords.iter().enumerate() {
|
||||
if i == big_idx {
|
||||
star_large(*c, fg_color, bg_color);
|
||||
} else if (big_idx + 1) % 8 == i || (big_idx - 1) % 8 == i {
|
||||
star_medium(*c, fg_color, bg_color);
|
||||
} else {
|
||||
star_small(*c, fg_color, bg_color);
|
||||
}
|
||||
}
|
||||
|
||||
if let Some((icon, color)) = icon {
|
||||
icon.draw(area.center(), CENTER, color, bg_color);
|
||||
}
|
||||
}
|
Loading…
Reference in new issue