use std::collections::HashMap;
use std::sync::Mutex;
use cocoa::base::id;
use crate::error::{Error, Result};
#[derive(Clone, Copy, Debug)]
pub struct ViewHandle(usize);
impl ViewHandle {
pub fn new(view: id) -> Self {
Self(view as usize)
}
pub unsafe fn as_id(self) -> id {
self.0 as id
}
}
pub struct GlassViewEntry {
pub glass_view: ViewHandle,
pub tint_overlay: Option<ViewHandle>,
}
unsafe impl Send for GlassViewEntry {}
unsafe impl Sync for GlassViewEntry {}
pub struct GlassViewRegistry {
views: Mutex<HashMap<String, GlassViewEntry>>,
}
impl Default for GlassViewRegistry {
fn default() -> Self {
Self {
views: Mutex::new(HashMap::new()),
}
}
}
impl GlassViewRegistry {
pub fn contains(&self, label: &str) -> Result<bool> {
self.views
.lock()
.map(|views| views.contains_key(label))
.map_err(|_| Error::RegistryLockFailed)
}
pub fn insert(
&self,
label: String,
glass_view: ViewHandle,
tint_overlay: Option<ViewHandle>,
) -> Result<()> {
self.views
.lock()
.map(|mut views| {
views.insert(
label,
GlassViewEntry {
glass_view,
tint_overlay,
},
);
})
.map_err(|_| Error::RegistryLockFailed)
}
pub fn get(&self, label: &str) -> Result<Option<(ViewHandle, Option<ViewHandle>)>> {
self.views
.lock()
.map(|views| views.get(label).map(|e| (e.glass_view, e.tint_overlay)))
.map_err(|_| Error::RegistryLockFailed)
}
pub fn remove(&self, label: &str) -> Result<Option<(ViewHandle, Option<ViewHandle>)>> {
self.views
.lock()
.map(|mut views| views.remove(label).map(|e| (e.glass_view, e.tint_overlay)))
.map_err(|_| Error::RegistryLockFailed)
}
pub fn update_tint(&self, label: &str, tint: Option<ViewHandle>) -> Result<()> {
self.views
.lock()
.map(|mut views| {
if let Some(entry) = views.get_mut(label) {
entry.tint_overlay = tint;
}
})
.map_err(|_| Error::RegistryLockFailed)
}
}