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; if alpha < 1.0 { // The fade isn't done yet, so schedule another render. 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)) }