1extern crate alloc;
2
3use alloc::{collections::VecDeque, sync::Arc};
4use leptos::prelude::{expect_context, provide_context, use_context};
5use std::sync::Mutex;
6
7#[derive(Clone, Default, Debug)]
9pub struct Frame {
10 pub x: i32,
12 pub y: i32,
14 pub width: i32,
16 pub height: i32,
18}
19
20#[derive(Clone, Default, Debug)]
22pub struct SvgFrame {
23 pub width: i32,
25 pub height: i32,
27 pub client_width: i32,
29 pub client_height: i32,
31}
32
33#[derive(Clone, Default, Debug)]
35pub struct Frames(VecDeque<Frame>);
36
37pub type FramesRef = Arc<Mutex<Frames>>;
39
40impl Frames {
41 pub fn push(&mut self, frame: Frame) {
43 self.0.push_back(frame);
44 }
45
46 pub fn pop(&mut self) -> Frame {
48 let frames = &mut self.0;
49 if frames.len() > 1 {
50 frames.pop_back().unwrap()
51 } else {
52 frames.back().unwrap().clone()
53 }
54 }
55
56 pub fn extend(&mut self, frames: impl IntoIterator<Item = Frame>) {
58 self.0.extend(frames);
59 }
60}
61
62pub fn provide_frame(frame: Frame) {
64 let frames: Option<FramesRef> = use_context();
65 if let Some(frames) = frames {
66 frames.lock().unwrap().0.push_back(frame);
67 } else {
68 let frames = Frames([frame].into());
69 provide_context(Arc::new(Mutex::new(frames)));
70 }
71}
72
73pub fn use_frame() -> Frame {
75 let frames: FramesRef = expect_context();
76 let mut frames = frames.lock().unwrap();
77 frames.pop()
78}
79
80pub fn use_frames() -> FramesRef {
82 expect_context()
83}