Newer
Older
use crate::color::with_alpha;
use crate::egui::{InnerResponse, Ui};
const FADE_DURATION: f64 = 0.6;
/// Fade in some children, assuming the fading in started at [`fade_start`].
pub fn fade_in<R>(
ui: &mut Ui,
fade_start: f64,
add_contents: impl FnOnce(&mut Ui) -> R,
) -> InnerResponse<R> {
let since_transition = ui.ctx().input().time - fade_start;
let alpha = (since_transition * (1.0 / FADE_DURATION)).clamp(0.0, 1.0) as f32;
ui.ctx().request_repaint();
}
with_alpha(ui, alpha, |ui| add_contents(ui))
}
/// Like `fade_in` but provides alpha value for manual fading.
pub fn fade_in_manual<R>(
ui: &mut Ui,
fade_start: f64,
add_contents: impl FnOnce(&mut Ui, f32) -> R,
) -> R {
let since_transition = ui.ctx().input().time - fade_start;
let alpha = (since_transition * (1.0 / FADE_DURATION)).min(1.0) as f32;
if alpha < 1.0 {
// The fade isn't done yet, so schedule another render.
ui.ctx().request_repaint();
}
add_contents(ui, alpha)
}
/// Like `fade_in_manual` but provides alpha *decreases* over time.
pub fn fade_out_manual<R>(
ui: &mut Ui,
fade_start: f64,
add_contents: impl FnOnce(&mut Ui, f32) -> R,
) -> R {
fade_in_manual(ui, fade_start, |ui, alpha| add_contents(ui, 1.0 - alpha))
}