use tachyonfx::{fx, Interpolation, Motion}; use crate::page::Page; use crate::state::ui::UiState; use crate::state::Modal; use crate::theme; #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] pub enum FxId { #[default] PageTransition, } pub fn tick_effects(ui: &mut UiState, page: Page) { if !ui.show_title && ui.prev_show_title { ui.effects.borrow_mut().add_unique_effect( FxId::PageTransition, fx::coalesce((200, Interpolation::QuadOut)), ); } ui.prev_show_title = ui.show_title; let modal_open = !matches!(ui.modal, Modal::None); if modal_open && !ui.prev_modal_open { let bg = theme::get().ui.bg; *ui.modal_fx.borrow_mut() = Some(fx::fade_from_fg(bg, (50, Interpolation::QuadOut))); } ui.prev_modal_open = modal_open; if page != ui.prev_page { let direction = page_direction(ui.prev_page, page); let bg = theme::get().ui.bg; ui.effects.borrow_mut().add_unique_effect( FxId::PageTransition, fx::sweep_in(direction, 10, 0, bg, (200, Interpolation::QuadOut)), ); ui.prev_page = page; } } fn page_direction(from: Page, to: Page) -> Motion { let (fc, fr) = from.grid_pos(); let (tc, tr) = to.grid_pos(); if tc > fc { Motion::LeftToRight } else if tc < fc { Motion::RightToLeft } else if tr > fr { Motion::UpToDown } else { Motion::DownToUp } }