From: Olaf Wintermann Date: Fri, 22 May 2026 15:20:25 +0000 (+0200) Subject: add UiDocProxy X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=HEAD;p=note.git add UiDocProxy --- diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index 162bdb8..e615080 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -157,10 +157,18 @@ impl Drop for UiDoc { } impl UiDoc { + fn from_ptr(ptr: *mut c_void) -> UiDoc { + unsafe { + let ctx = UiContext { ptr: ui_document_context(ptr) }; + ui_document_ref(ptr); + UiDoc:: { ctx: ctx, ptr: ptr, _marker: PhantomData } + } + } + pub fn new(mut data: T) -> UiDoc { 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 Drop for UiObjProxy { } } +pub struct UiDocProxy { + ptr: *mut c_void, + _data: PhantomData +} + +unsafe impl Send for UiDocProxy {} + +impl UiDocProxy { + fn from_ptr(ptr: *mut c_void) -> UiDocProxy { + unsafe { + ui_document_ref(ptr); + } + UiDocProxy { ptr: ptr, _data: PhantomData } + } + + pub fn call_mainthread(self, f: F) + where F: FnOnce(&mut T) + Send + 'static { + call_mainthread(|| { + let doc: UiDoc = UiDoc::from_ptr(self.ptr); + unsafe { + let data = doc.get_data_ptr(); + f(&mut *data); + } + drop(self); + }); + } +} + +impl Drop for UiDocProxy { + fn drop(&mut self) { + unsafe { + ui_mainthread_document_unref(self.ptr); + } + } +} + + + pub struct UiText { pub ptr: *mut ffi::UiText