use super::{Drawable, SharedEvent, SharedEventHandle, SharedEventListener};
use crate::Error;
use crate::quartz_core::Drawable as LayerDrawable;
use std::time::Duration;
pub struct SharedEventNotificationRegistration {
_inner: metal_rust_ffi::SharedEventNotificationRegistration,
}
impl Drawable {
pub fn present(&self) -> Result<(), Error> {
self.inner.present().map_err(Error::from_ffi)
}
pub fn present_after_minimum_duration(&self, duration: f64) -> Result<(), Error> {
self.inner
.present_after_minimum_duration(duration)
.map_err(Error::from_ffi)
}
pub fn present_at_time(&self, presentation_time: f64) -> Result<(), Error> {
self.inner
.present_at_time(presentation_time)
.map_err(Error::from_ffi)
}
pub fn validated_presented_time(&self) -> Result<f64, Error> {
self.inner
.validated_presented_time()
.map_err(Error::from_ffi)
}
pub fn on_presented(
&self,
handler: impl FnOnce(Drawable) + Send + 'static,
) -> Result<(), Error> {
self.inner
.on_presented(move |inner| handler(Drawable::from_ffi(inner)))
.map_err(Error::from_ffi)
}
}
impl LayerDrawable {
pub fn drawable_id(&self) -> Result<usize, Error> {
self.inner.drawable_id().map_err(Error::from_ffi)
}
pub fn present(&self) -> Result<(), Error> {
self.inner.present().map_err(Error::from_ffi)
}
pub fn present_after_minimum_duration(&self, duration: f64) -> Result<(), Error> {
self.inner
.present_after_minimum_duration(duration)
.map_err(Error::from_ffi)
}
pub fn present_at_time(&self, presentation_time: f64) -> Result<(), Error> {
self.inner
.present_at_time(presentation_time)
.map_err(Error::from_ffi)
}
pub fn presented_time(&self) -> Result<f64, Error> {
self.inner.presented_time().map_err(Error::from_ffi)
}
pub fn on_presented(
&self,
handler: impl FnOnce(LayerDrawable) + Send + 'static,
) -> Result<(), Error> {
self.inner
.on_presented(move |inner| handler(LayerDrawable { inner }))
.map_err(Error::from_ffi)
}
}
impl SharedEventListener {
pub fn shared() -> Result<Self, Error> {
metal_rust_ffi::__private::objects::metal::SharedEventListener::shared()
.map(Self::from_ffi)
.map_err(Error::from_ffi)
}
}
impl SharedEvent {
pub fn new_shared_event_handle(&self) -> Result<SharedEventHandle, Error> {
self.inner
.new_shared_event_handle()
.map(SharedEventHandle::from_ffi)
.map_err(Error::from_ffi)
}
pub fn wait_until_signaled_value(&self, value: u64, timeout: Duration) -> Result<bool, Error> {
self.inner
.wait_until_signaled_value(value, timeout)
.map_err(Error::from_ffi)
}
pub fn notify_at(
&self,
listener: &SharedEventListener,
value: u64,
handler: impl FnOnce(u64) + Send + 'static,
) -> Result<(), Error> {
self.inner
.notify_at(&listener.inner, value, handler)
.map_err(Error::from_ffi)
}
pub fn notify_values(
&self,
listener: &SharedEventListener,
values: &[u64],
handler: impl Fn(u64) + Send + Sync + 'static,
) -> Result<SharedEventNotificationRegistration, Error> {
self.inner
.notify_values(&listener.inner, values, handler)
.map(|_inner| SharedEventNotificationRegistration { _inner })
.map_err(Error::from_ffi)
}
}