From 4d75823d1f824621b8eb752a90283de62e172b8c Mon Sep 17 00:00:00 2001 From: Olaf Wintermann Date: Thu, 16 Apr 2026 08:35:32 +0200 Subject: [PATCH] implement list selection functions --- ui-rs/src/ui/ffi.rs | 5 +++++ ui-rs/src/ui/toolkit.rs | 43 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/ui-rs/src/ui/ffi.rs b/ui-rs/src/ui/ffi.rs index 99eba46..c75f4a7 100644 --- a/ui-rs/src/ui/ffi.rs +++ b/ui-rs/src/ui/ffi.rs @@ -47,6 +47,11 @@ pub struct UiList { _private: [u8; 0], } +#[repr(C)] +pub struct UiListSelection { + _private: [u8; 0], +} + pub type UiCallback = Option; pub type UiDestructor = extern "C" fn(object: *mut c_void); diff --git a/ui-rs/src/ui/toolkit.rs b/ui-rs/src/ui/toolkit.rs index 1e7abb4..d550975 100644 --- a/ui-rs/src/ui/toolkit.rs +++ b/ui-rs/src/ui/toolkit.rs @@ -104,6 +104,41 @@ impl UiList { self.ptr = ui_list_new2(ctx.ptr, c_str, list_init::, data as *mut c_void); } } + + pub fn update(&mut self) { + unsafe { + ui_list_update(self.ptr); + } + } + + pub fn update_row(&mut self, row: i32) { + unsafe { + ui_list_update_row(self.ptr, row); + } + } + + pub fn selection(&mut self) -> Vec { + let mut sel = Vec::new(); + unsafe { + let selection = ui_list_get_selection_allocated(self.ptr); + let count = ui_list_selection_get_count(selection) as usize; + if count > 0 { + let indices = ui_list_selection_get_rows(selection); + sel.set_len(count as usize); + for i in 0..count { + sel.push(*indices.add(i) as i32); + } + } + ui_list_selection_free(selection); + } + sel + } + + pub fn set_selection(&mut self, sel: &Vec) { + unsafe { + ui_list_set_selected_indices(self.ptr, sel.as_ptr(), sel.len() as c_int); + } + } } @@ -313,4 +348,12 @@ extern "C" { 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); + + fn ui_list_update(list: *mut ffi::UiList); + fn ui_list_update_row(list: *mut ffi::UiList, row: c_int); + fn ui_list_get_selection_allocated(list: *mut ffi::UiList) -> *mut ffi::UiListSelection; + fn ui_list_set_selected_indices(list: *mut ffi::UiList, indices: *const c_int, len: c_int); + fn ui_list_selection_get_count(list: *mut ffi::UiListSelection) -> c_int; + fn ui_list_selection_get_rows(list: *mut ffi::UiListSelection) -> *const c_int; + fn ui_list_selection_free(list: *mut ffi::UiListSelection); } -- 2.47.3