halley-wl 0.3.0

Wayland backend and rendering implementation for the Halley Wayland compositor.
use std::time::Instant;

use crate::compositor::interaction::{NodeMoveAnim, PointerState};
use crate::compositor::root::Halley;

use super::curves::ease_in_out_cubic;

pub(crate) fn advance_node_move_anim(
    st: &mut Halley,
    ps: &mut PointerState,
    now: Instant,
) -> Option<halley_core::field::NodeId> {
    if ps.move_anim.is_empty() {
        return None;
    }
    let anims: Vec<NodeMoveAnim> = ps.move_anim.values().copied().collect();
    let mut finished: Vec<halley_core::field::NodeId> = Vec::new();
    let mut last_id: Option<halley_core::field::NodeId> = None;
    let now_ms = st.now_ms(now);
    for anim in anims {
        if crate::compositor::interaction::state::is_recently_resized_node(st, anim.node_id, now_ms)
        {
            finished.push(anim.node_id);
            continue;
        }
        let elapsed = now.saturating_duration_since(anim.started_at);
        let dur_s = anim.duration.as_secs_f32().max(0.000_1);
        let t = (elapsed.as_secs_f32() / dur_s).clamp(0.0, 1.0);
        let e = ease_in_out_cubic(t);
        let pos = halley_core::field::Vec2 {
            x: anim.from.x + (anim.to.x - anim.from.x) * e,
            y: anim.from.y + (anim.to.y - anim.from.y) * e,
        };
        let _ = st.carry_surface_non_overlap(anim.node_id, pos, false);
        if t >= 1.0 {
            finished.push(anim.node_id);
        }
        last_id = Some(anim.node_id);
    }
    for id in finished {
        ps.move_anim.remove(&id);
    }
    last_id
}