1use euclid::RigidTransform3D;
6use profile_traits::generic_callback::GenericCallback as ProfileGenericCallback;
7use serde::{Deserialize, Serialize};
8
9use crate::{
10 ApiSpace, BaseSpace, Frame, InputFrame, InputId, InputSource, SelectEvent, SelectKind,
11};
12
13#[derive(Clone, Debug, Serialize, Deserialize)]
14#[expect(clippy::large_enum_variant)]
15pub enum Event {
16 AddInput(InputSource),
18 RemoveInput(InputId),
20 UpdateInput(InputId, InputSource),
22 SessionEnd,
24 VisibilityChange(Visibility),
26 Select(InputId, SelectKind, SelectEvent, Frame),
28 InputChanged(InputId, InputFrame),
30 ReferenceSpaceChanged(BaseSpace, RigidTransform3D<f32, ApiSpace, ApiSpace>),
32}
33
34#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
35pub enum Visibility {
36 Visible,
38 VisibleBlurred,
40 Hidden,
42}
43
44pub enum EventBuffer {
47 Buffered(Vec<Event>),
48 Sink(ProfileGenericCallback<Event>),
49}
50
51impl Default for EventBuffer {
52 fn default() -> Self {
53 EventBuffer::Buffered(vec![])
54 }
55}
56
57impl EventBuffer {
58 pub fn callback(&mut self, event: Event) {
59 match *self {
60 EventBuffer::Buffered(ref mut events) => events.push(event),
61 EventBuffer::Sink(ref dest) => {
62 let _ = dest.send(event);
63 },
64 }
65 }
66
67 pub fn upgrade(&mut self, dest: ProfileGenericCallback<Event>) {
68 if let EventBuffer::Buffered(ref mut events) = *self {
69 for event in events.drain(..) {
70 let _ = dest.send(event);
71 }
72 }
73 *self = EventBuffer::Sink(dest)
74 }
75}