baseview 0.1.1

Low-level windowing system geared towards making audio plugin UIs.
Documentation
mod keyboard;
mod view;
mod window;

use objc2::rc::Retained;
use objc2::Message;
use std::cell::RefCell;
pub use window::*;

pub struct RetainedCell<T> {
    inner: RefCell<Option<Retained<T>>>,
}

impl<T> RetainedCell<T> {
    pub const fn empty() -> Self {
        RetainedCell { inner: RefCell::new(None) }
    }

    pub const fn new(value: Retained<T>) -> Self {
        RetainedCell { inner: RefCell::new(Some(value)) }
    }

    pub const fn with(value: Option<Retained<T>>) -> Self {
        RetainedCell { inner: RefCell::new(value) }
    }

    pub fn take(&self) -> Option<Retained<T>> {
        self.inner.borrow_mut().take()
    }
}

impl<T: Message> RetainedCell<T> {
    pub fn get(&self) -> Option<Retained<T>> {
        (*self.inner.borrow()).as_ref().map(|inner| inner.retain())
    }

    pub fn set(&self, value: Retained<T>) {
        self.inner.replace(Some(value));
    }
}