}
impl<T: UiModel + UiActions> UiDoc<T> {
+ fn from_ptr(ptr: *mut c_void) -> UiDoc<T> {
+ unsafe {
+ let ctx = UiContext { ptr: ui_document_context(ptr) };
+ ui_document_ref(ptr);
+ UiDoc::<T> { ctx: ctx, ptr: ptr, _marker: PhantomData }
+ }
+ }
+
pub fn new(mut data: T) -> UiDoc<T> {
unsafe {
let doc = ui_document_new(mem::size_of::<*mut T>());
- let ctx = UiContext { ptr: ui_document_context(doc) };
+ let ctx = UiContext::from_ptr(ui_document_context(doc));
data.init(&ctx);
let data_ptr = ctx.reg_box(Box::new(data)); // returns *mut T
let doc_storage: *mut *mut T = doc.cast();
}
}
+pub struct UiDocProxy<T: UiModel + UiActions> {
+ ptr: *mut c_void,
+ _data: PhantomData<T>
+}
+
+unsafe impl<T: UiModel + UiActions> Send for UiDocProxy<T> {}
+
+impl<T: UiModel + UiActions> UiDocProxy<T> {
+ fn from_ptr(ptr: *mut c_void) -> UiDocProxy<T> {
+ unsafe {
+ ui_document_ref(ptr);
+ }
+ UiDocProxy { ptr: ptr, _data: PhantomData }
+ }
+
+ pub fn call_mainthread<F>(self, f: F)
+ where F: FnOnce(&mut T) + Send + 'static {
+ call_mainthread(|| {
+ let doc: UiDoc<T> = UiDoc::from_ptr(self.ptr);
+ unsafe {
+ let data = doc.get_data_ptr();
+ f(&mut *data);
+ }
+ drop(self);
+ });
+ }
+}
+
+impl<T: UiModel + UiActions> Drop for UiDocProxy<T> {
+ fn drop(&mut self) {
+ unsafe {
+ ui_mainthread_document_unref(self.ptr);
+ }
+ }
+}
+
+
+
pub struct UiText {
pub ptr: *mut ffi::UiText