aura-gui 0.2.2

UI nativa acelerada por GPU para escritorio, Android e iOS, en un solo crate: estilo tipo Tailwind, componentes, sombras, animaciones y agentes de IA. Reposo a cero. Licencia AGPL-3.0 o comercial.
//! Foco de teclado: qué elemento recibe las pulsaciones.

/// Identificador del elemento enfocable.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct FocusId(u64);

/// Se guarda en el estado de la vista y se pasa a `Div::track_focus`.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct FocusHandle {
    pub id: FocusId,
}

#[derive(Default)]
pub struct FocusState {
    next_id: u64,
    focused: Option<FocusId>,
    /// Ruta desde la raíz hasta el elemento enfocado, calculada en el último frame.
    path: Vec<FocusId>,
}

impl FocusState {
    pub fn new_handle(&mut self) -> FocusHandle {
        self.next_id += 1;
        FocusHandle { id: FocusId(self.next_id) }
    }

    pub fn focus(&mut self, handle: &FocusHandle) {
        self.focused = Some(handle.id);
    }

    pub fn blur(&mut self) {
        self.focused = None;
    }

    pub fn focused(&self) -> Option<FocusId> {
        self.focused
    }

    pub fn is_focused(&self, handle: &FocusHandle) -> bool {
        self.focused == Some(handle.id)
    }

    /// `true` si el foco está en `handle` o en algún descendiente suyo.
    pub fn contains_focus(&self, handle: &FocusHandle) -> bool {
        self.path.contains(&handle.id)
    }

    pub fn set_path(&mut self, path: Vec<FocusId>) {
        self.path = path;
    }
}