#![allow(dead_code)]
-use std::ffi::{c_char, c_int, CStr, CString};
+use std::ffi::{c_char, c_int, c_void, CStr, CString};
use crate::ui::ffi;
use std::marker::PhantomData;
+pub trait UiContext {
+ fn get_context(&self) -> *mut ffi::UiContext;
+
+ fn list<T>(&self) -> UiList<T> {
+ let ctx = self.get_context();
+
+ let v: Vec<T> = Vec::new();
+ let mut b = Box::new(v);
+ let data = b.as_mut_ptr();
+
+ unsafe {
+ UiList {
+ ptr: ui_list_new2(ctx, std::ptr::null_mut(), list_init::<T>, data as *mut c_void),
+ data: b
+ }
+ }
+ }
+}
+
pub struct UiObject<T> {
pub ptr: *mut ffi::UiObject,
pub _data: PhantomData<T>
}
+
pub struct UiText {
pub ptr: *mut ffi::UiText
}
pub ptr: *mut ffi::UiDouble
}
+pub struct UiList<T> {
+ pub ptr: *mut ffi::UiList,
+ data: Box<Vec<T>>
+}
+
+impl<T> UiList<T> {
+ pub fn data(&mut self) -> &mut Vec<T> {
+ self.data.as_mut()
+ }
+}
+
+
extern "C" {
fn ui_init(appname: *const c_char, argc: c_int, argv: *const *const c_char);
}
}
}
+
+
+/* -------------------------------- List -------------------------------- */
+
+/*
+ * UiList init func, that is used by ui_list_new2
+ */
+extern "C" fn list_init<T>(_ctx: *mut ffi::UiContext, list: *mut ffi::UiList, data: *mut c_void) {
+ unsafe {
+ ui_list_class_set_data(list, data);
+ ui_list_class_set_first(list, list_first::<T>);
+ ui_list_class_set_next(list, list_next::<T>);
+ ui_list_class_set_get(list, list_get::<T>);
+ ui_list_class_set_count(list, list_count::<T>);
+ }
+}
+
+extern "C" fn list_first<T>(list: *mut ffi::UiList) -> *mut c_void {
+ unsafe {
+ let data = ui_list_get_data(list);
+ if !data.is_null() {
+ let ls = &*(data as *mut Vec<T>);
+ if ls.len() > 0 {
+ let iter = 1;
+ ui_list_set_iter(list, iter as *mut c_void);
+ return ls.as_ptr() as *mut c_void
+ }
+ }
+ std::ptr::null_mut()
+ }
+}
+
+extern "C" fn list_next<T>(list: *mut ffi::UiList) -> *mut c_void {
+ unsafe {
+ let data = ui_list_get_data(list);
+ let iter = ui_list_get_iter(list);
+
+ if !data.is_null() {
+ let ls = &*(data as *mut Vec<T>);
+ let mut index = 0;
+ if !iter.is_null() {
+ index = iter as usize;
+ }
+
+ if index < ls.len() {
+ let value = ls.as_ptr().add(index);
+ index += 1;
+ ui_list_set_iter(list, index as *mut c_void);
+ return value as *mut c_void;
+ }
+ }
+ }
+ std::ptr::null_mut()
+}
+
+extern "C" fn list_get<T>(list: *mut ffi::UiList, index: c_int) -> *mut c_void {
+ unsafe {
+ let data = ui_list_get_data(list);
+ if !data.is_null() {
+ let ls = &*(data as *mut Vec<T>);
+ let i = index as usize;
+ if i < ls.len() {
+ let value = ls.as_ptr().add(i);
+ return value as *mut c_void;
+ }
+ }
+ }
+ std::ptr::null_mut()
+}
+
+extern "C" fn list_count<T>(list: *mut ffi::UiList) -> c_int {
+ unsafe {
+ let data = ui_list_get_data(list);
+ if !data.is_null() {
+ let ls = &*(data as *mut Vec<T>);
+ return ls.len() as c_int;
+ }
+ 0
+ }
+}
+
+type UiListInitFunc = extern "C" fn(*mut ffi::UiContext, *mut ffi::UiList, *mut c_void);
+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;
+
+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_first(list: *mut ffi::UiList, func: UiListFirstFunc);
+ fn ui_list_class_set_next(list: *mut ffi::UiList, func: UiListNextFunc);
+ fn ui_list_class_set_get(list: *mut ffi::UiList, func: UiListGetFunc);
+ fn ui_list_class_set_count(list: *mut ffi::UiList, func: UiListCountFunc);
+ 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;
+ 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);
+}