use euclid::RigidTransform3D;
use profile_traits::generic_callback::GenericCallback as ProfileGenericCallback;
use serde::{Deserialize, Serialize};
use crate::{
ApiSpace, BaseSpace, Frame, InputFrame, InputId, InputSource, SelectEvent, SelectKind,
};
#[derive(Clone, Debug, Serialize, Deserialize)]
#[expect(clippy::large_enum_variant)]
pub enum Event {
AddInput(InputSource),
RemoveInput(InputId),
UpdateInput(InputId, InputSource),
SessionEnd,
VisibilityChange(Visibility),
Select(InputId, SelectKind, SelectEvent, Frame),
InputChanged(InputId, InputFrame),
ReferenceSpaceChanged(BaseSpace, RigidTransform3D<f32, ApiSpace, ApiSpace>),
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub enum Visibility {
Visible,
VisibleBlurred,
Hidden,
}
pub enum EventBuffer {
Buffered(Vec<Event>),
Sink(ProfileGenericCallback<Event>),
}
impl Default for EventBuffer {
fn default() -> Self {
EventBuffer::Buffered(vec![])
}
}
impl EventBuffer {
pub fn callback(&mut self, event: Event) {
match *self {
EventBuffer::Buffered(ref mut events) => events.push(event),
EventBuffer::Sink(ref dest) => {
let _ = dest.send(event);
},
}
}
pub fn upgrade(&mut self, dest: ProfileGenericCallback<Event>) {
if let EventBuffer::Buffered(ref mut events) = *self {
for event in events.drain(..) {
let _ = dest.send(event);
}
}
*self = EventBuffer::Sink(dest)
}
}