]> uap-core.de Git - note.git/commitdiff
fix wrong type when creating a getvalue wrapper main
authorOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 19 Apr 2026 18:55:20 +0000 (20:55 +0200)
committerOlaf Wintermann <olaf.wintermann@gmail.com>
Sun, 19 Apr 2026 18:55:20 +0000 (20:55 +0200)
application/src/main.rs
ui-rs/src/ui/list.rs
ui-rs/src/ui/toolkit.rs

index b68af8b0642869656943708fd0b69c8ed976bc73..77dc750cd59c393687a7212b1739c7fd748394a4 100644 (file)
@@ -14,7 +14,7 @@ struct App;
 struct TestData {
     i: i32,
     #[bind("list")]
-    list: UiList<usize>
+    list: UiList<i32>
 }
 
 #[ui_actions]
index 94a343229d50c6e343c88d5220a024bb30b00e71..b878bce80c73ca0dc9fc6b10f10fb56e50ff885f 100644 (file)
@@ -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::<T>);
+            ui_list_args_set_getvalue_func2(self.args, getvalue_wrapper::<E>);
             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::<T>);
+            ui_list_args_set_getvalue_func2(self.args, getvalue_wrapper::<E>);
             ui_list_args_set_getvalue_data(self.args, ptr as *mut c_void);
         }
         self.has_getvalue_func = true;
index 024bbbb5227ae731f5c8fb4769257791cdf96245..982a351f306db73b0697cfc76e2d5edd4fb86ae5 100644 (file)
@@ -417,7 +417,7 @@ extern "C" fn list_next<T>(list: *mut ffi::UiList) -> *mut c_void {
     std::ptr::null_mut()
 }
 
-extern "C" fn list_get<T>(list: *mut ffi::UiList, index: c_int) -> *mut c_void {
+extern "C" fn list_get<T>(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<T>(list: *mut ffi::UiList, index: c_int) -> *mut c_void {
     std::ptr::null_mut()
 }
 
-extern "C" fn list_count<T>(list: *mut ffi::UiList) -> c_int {
+extern "C" fn list_count<T>(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<T>(_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<T>);
+    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);