#![allow(dead_code)]
use std::ffi::{c_char, c_void, CStr, CString};
-use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText, UiRange};
+use crate::ui::{event, ffi, UiDouble, UiInteger, UiString, UiText, UiRange, ListSelection};
use crate::ui::ffi::{UiEvent};
pub struct Event<'a, T> {
TextValue(&'a mut UiText),
DoubleValue(&'a mut UiDouble),
RangeValue(&'a mut UiRange),
- ListSelection,
+ ListSelection(&'a ListSelection),
ListElement,
Dnd,
SubList,
TextValue(UiText),
DoubleValue(UiDouble),
RangeValue(UiRange),
- ListSelection,
+ ListSelection(ListSelection),
ListElement,
Dnd,
SubList,
let d: *mut ffi::UiRange = ptr.cast();
EventTypeData::RangeValue( UiRange { ptr: d } )
}
+ 8 => {
+ EventTypeData::ListSelection( ListSelection::from_ptr(ptr.cast()) )
+ }
_ => EventTypeData::Null
}
}
EventTypeData::TextValue(t) => EventType::TextValue( t ),
EventTypeData::DoubleValue(d) => EventType::DoubleValue( d ),
EventTypeData::RangeValue(r) => EventType::RangeValue( r ),
- EventTypeData::ListSelection => EventType::ListSelection,
+ EventTypeData::ListSelection(s) => EventType::ListSelection( s),
EventTypeData::ListElement => EventType::ListElement,
EventTypeData::Dnd => EventType::Dnd,
EventTypeData::SubList => EventType::SubList,
}
pub fn selection(&mut self) -> Vec<i32> {
- 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);
+ let selection = ListSelection {
+ ptr: ui_list_get_selection_allocated(self.ptr),
+ free: true
+ };
+ selection.selection()
}
- sel
}
pub fn set_selection(&mut self, sel: &Vec<i32>) {
}
}
+pub struct ListSelection {
+ pub ptr: *mut ffi::UiListSelection,
+ free: bool
+}
+
+impl ListSelection {
+ pub fn from_ptr(ptr: *mut ffi::UiListSelection) -> ListSelection {
+ ListSelection { ptr: ptr, free: false }
+ }
+
+ pub fn from_allocated(ptr: *mut ffi::UiListSelection) -> ListSelection {
+ ListSelection { ptr: ptr, free: true }
+ }
+
+ pub fn selection(&self) -> Vec<i32> {
+ let mut sel = Vec::new();
+ unsafe {
+ let count = ui_list_selection_get_count(self.ptr) as usize;
+ if count > 0 {
+ let indices = ui_list_selection_get_rows(self.ptr);
+ sel.set_len(count as usize);
+ for i in 0..count {
+ sel.push(*indices.add(i) as i32);
+ }
+ }
+ }
+ sel
+ }
+}
+
/* -------------------------------- SourceList -------------------------------- */
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_get_count(list: *const ffi::UiListSelection) -> c_int;
+ fn ui_list_selection_get_rows(list: *const ffi::UiListSelection) -> *const c_int;
fn ui_list_selection_free(list: *mut ffi::UiListSelection);
pub fn ui_list_append(list: *mut ffi::UiList, data: *mut c_void);