From: Olaf Wintermann Date: Sun, 19 Apr 2026 18:55:20 +0000 (+0200) Subject: fix wrong type when creating a getvalue wrapper X-Git-Url: https://uap-core.de/gitweb/?a=commitdiff_plain;h=a7712224f14a3472fbd0c3884ec4356d0347052f;p=note.git fix wrong type when creating a getvalue wrapper --- diff --git a/application/src/main.rs b/application/src/main.rs index b68af8b..77dc750 100644 --- a/application/src/main.rs +++ b/application/src/main.rs @@ -14,7 +14,7 @@ struct App; struct TestData { i: i32, #[bind("list")] - list: UiList + list: UiList } #[ui_actions] diff --git a/ui-rs/src/ui/list.rs b/ui-rs/src/ui/list.rs index 94a3432..b878bce 100644 --- a/ui-rs/src/ui/list.rs +++ b/ui-rs/src/ui/list.rs @@ -1,10 +1,11 @@ #![allow(dead_code)] use crate::ui::ffi::{UiObject, UiListArgs, UiCallback, UiList}; -use crate::ui::{ffi, toolkit}; +use crate::ui::{ffi, toolkit, ui_list_get, ui_list_get_data}; use std::ffi::{c_char, c_int, c_void}; use std::ffi::CString; use std::marker::PhantomData; +use std::mem; use crate::ui::widget::{widget_typed_fn}; pub enum ListValue<'a> { @@ -243,7 +244,7 @@ impl<'a, T, E> ListViewBuilder<'a, T, E> { unsafe { let wrapper = Box::new(GetValueWrapper { callback: Box::new(f), is_table: false }); let ptr = self.obj.ctx.reg_box(wrapper); - ui_list_args_set_getvalue_func2(self.args, getvalue_wrapper::); + ui_list_args_set_getvalue_func2(self.args, getvalue_wrapper::); ui_list_args_set_getvalue_data(self.args, ptr as *mut c_void); } self.has_getvalue_func = true; @@ -421,7 +422,7 @@ impl<'a, T, E> TableViewBuilder<'a, T, E> { unsafe { let wrapper = Box::new(GetValueWrapper { callback: Box::new(f), is_table: true }); let ptr = self.obj.ctx.reg_box(wrapper); - ui_list_args_set_getvalue_func2(self.args, getvalue_wrapper::); + ui_list_args_set_getvalue_func2(self.args, getvalue_wrapper::); ui_list_args_set_getvalue_data(self.args, ptr as *mut c_void); } self.has_getvalue_func = true; diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index 024bbbb..982a351 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -417,7 +417,7 @@ extern "C" fn list_next(list: *mut ffi::UiList) -> *mut c_void { std::ptr::null_mut() } -extern "C" fn list_get(list: *mut ffi::UiList, index: c_int) -> *mut c_void { +extern "C" fn list_get(list: *const ffi::UiList, index: c_int) -> *mut c_void { unsafe { let data = ui_list_get_data(list); if !data.is_null() { @@ -432,7 +432,7 @@ extern "C" fn list_get(list: *mut ffi::UiList, index: c_int) -> *mut c_void { std::ptr::null_mut() } -extern "C" fn list_count(list: *mut ffi::UiList) -> c_int { +extern "C" fn list_count(list: *const ffi::UiList) -> c_int { unsafe { let data = ui_list_get_data(list); if !data.is_null() { @@ -447,6 +447,12 @@ extern "C" fn list_destroy(_ctx: *mut ffi::UiContext, _list: *mut ffi::UiList // noop } +pub unsafe fn ui_list_get<'a, T>(list: *const ffi::UiList, index: usize) -> Option<&'a T> { + let data = ui_list_get_data(list); + let ls = &*(data as *mut Vec); + ls.get(index) +} + /* -------------------------------- C functions -------------------------------- */ extern "C" { @@ -481,8 +487,8 @@ type UiListInitFunc = extern "C" fn(*mut ffi::UiContext, *mut ffi::UiList, *mut type UiListDestroyFunc = extern "C" fn(*mut ffi::UiContext, *mut ffi::UiList, *mut c_void); type UiListFirstFunc = extern "C" fn(*mut ffi::UiList) -> *mut c_void; type UiListNextFunc = extern "C" fn(*mut ffi::UiList) -> *mut c_void; -type UiListGetFunc = extern "C" fn(*mut ffi::UiList, c_int) -> *mut c_void; -type UiListCountFunc = extern "C" fn(*mut ffi::UiList) -> c_int; +type UiListGetFunc = extern "C" fn(*const ffi::UiList, c_int) -> *mut c_void; +type UiListCountFunc = extern "C" fn(*const ffi::UiList) -> c_int; extern "C" { fn ui_list_new2(ctx: *mut ffi::UiContext, name: *const c_char, init: UiListInitFunc, userdata: *mut c_void) -> *mut ffi::UiList; @@ -494,7 +500,7 @@ extern "C" { fn ui_list_class_set_data(list: *mut ffi::UiList, data: *mut c_void); fn ui_list_class_set_iter(list: *mut ffi::UiList, iter: *mut c_void); - fn ui_list_get_data(list: *mut ffi::UiList) -> *mut c_void; + pub fn ui_list_get_data(list: *const ffi::UiList) -> *mut c_void; fn ui_list_get_iter(list: *mut ffi::UiList) -> *mut c_void; fn ui_list_set_iter(list: *mut ffi::UiList, iter: *mut c_void);