Skip to content
Snippets Groups Projects
fade_in.rs 1.35 KiB
Newer Older
use crate::color::with_alpha;
use crate::egui::{InnerResponse, Ui};

const FADE_DURATION: f64 = 0.6;

Finn Bear's avatar
Finn Bear committed
/// 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;
Finn Bear's avatar
Finn Bear committed
    let alpha = (since_transition * (1.0 / FADE_DURATION)).clamp(0.0, 1.0) as f32;
    if alpha < 1.0 {
Finn Bear's avatar
Finn Bear committed
        // The fade isn't done yet, so schedule another render.
        ui.ctx().request_repaint();
    }
    with_alpha(ui, alpha, |ui| add_contents(ui))
}
Finn Bear's avatar
Finn Bear committed

/// 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)
}
Finn Bear's avatar
Finn Bear committed

/// 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))
}