#![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> {
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;
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;
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() {
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() {
// 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" {
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;
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);