]> uap-core.de Git - note.git/commitdiff
add UiDocProxy main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 22 May 2026 15:20:25 +0000 (17:20 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Fri, 22 May 2026 15:20:25 +0000 (17:20 +0200)
ui-rs/src/ui/toolkit.rs

index 162bdb845ad9e57bfd203e795e5882f13fac4c85..e615080722b9d4ab964e7ca20a88e1537e745b31 100644 (file)
@@ -157,10 +157,18 @@ impl<T: UiModel + UiActions> Drop for UiDoc<T> {
 }
 
 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();
@@ -360,6 +368,44 @@ impl<T> Drop for UiObjProxy<T> {
     }
 }
 
+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