extern crate alloc;
use alloc::{collections::VecDeque, rc::Rc};
use core::cell::RefCell;
use leptos::{expect_context, provide_context, use_context};
#[derive(Clone, Default, Debug)]
pub struct Frame {
pub x: i32,
pub y: i32,
pub width: i32,
pub height: i32,
}
#[derive(Clone, Default, Debug)]
pub struct SvgFrame {
pub width: i32,
pub height: i32,
pub client_width: i32,
pub client_height: i32,
}
#[derive(Clone, Default, Debug)]
pub struct Frames(VecDeque<Frame>);
pub type FramesRef = Rc<RefCell<Frames>>;
impl Frames {
pub fn push(&mut self, frame: Frame) {
self.0.push_back(frame);
}
pub fn pop(&mut self) -> Frame {
let frames = &mut self.0;
if frames.len() > 1 {
frames.pop_back().unwrap()
} else {
frames.back().unwrap().clone()
}
}
pub fn extend(&mut self, frames: impl IntoIterator<Item = Frame>) {
self.0.extend(frames);
}
}
pub fn provide_frame(frame: Frame) {
let frames: Option<FramesRef> = use_context();
if let Some(frames) = frames {
frames.borrow_mut().0.push_back(frame);
} else {
let frames = Frames([frame].into());
provide_context(Rc::new(RefCell::new(frames)));
}
}
pub fn use_frame() -> Frame {
let frames: FramesRef = expect_context();
let mut frames = frames.borrow_mut();
frames.pop()
}
pub fn use_frames() -> FramesRef {
expect_context()
}