use std::cell::{Ref, RefCell};
use promkit_core::{Pane, PaneFactory};
#[derive(Clone)]
pub struct Snapshot<R: PaneFactory + Clone> {
init: R,
before: RefCell<R>,
after: R,
}
impl<R: PaneFactory + Clone + 'static> PaneFactory for Snapshot<R> {
fn create_pane(&self, width: u16, height: u16) -> Pane {
*self.before.borrow_mut() = self.after.clone();
self.after.create_pane(width, height)
}
}
impl<R: PaneFactory + Clone + 'static> Snapshot<R> {
pub fn new(renderer: R) -> Self {
Self {
init: renderer.clone(),
before: RefCell::new(renderer.clone()),
after: renderer,
}
}
pub fn init(&self) -> &R {
&self.init
}
pub fn borrow_before(&self) -> Ref<R> {
self.before.borrow()
}
pub fn after(&self) -> &R {
&self.after
}
pub fn after_mut(&mut self) -> &mut R {
&mut self.after
}
pub fn reset_after_to_init(&mut self) {
self.after = self.init.clone();
}
}