use crate::{Id, sys};
#[derive(Debug)]
pub struct BasicSelection {
raw: *mut sys::ImGuiSelectionBasicStorage,
}
impl BasicSelection {
pub fn new() -> Self {
unsafe {
let ptr = sys::ImGuiSelectionBasicStorage_ImGuiSelectionBasicStorage();
if ptr.is_null() {
panic!("ImGuiSelectionBasicStorage_ImGuiSelectionBasicStorage() returned null");
}
Self { raw: ptr }
}
}
pub fn len(&self) -> usize {
unsafe {
let size = (*self.raw).Size;
if size <= 0 { 0 } else { size as usize }
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn clear(&mut self) {
unsafe {
sys::ImGuiSelectionBasicStorage_Clear(self.raw);
}
}
pub fn contains(&self, id: Id) -> bool {
unsafe { sys::ImGuiSelectionBasicStorage_Contains(self.raw, id.raw()) }
}
pub fn set_selected(&mut self, id: Id, selected: bool) {
unsafe {
sys::ImGuiSelectionBasicStorage_SetItemSelected(self.raw, id.raw(), selected);
}
}
pub fn iter(&self) -> BasicSelectionIter<'_> {
BasicSelectionIter {
storage: self,
it: std::ptr::null_mut(),
}
}
pub(crate) fn as_raw(&self) -> *mut sys::ImGuiSelectionBasicStorage {
self.raw
}
}
impl Default for BasicSelection {
fn default() -> Self {
Self::new()
}
}
impl Drop for BasicSelection {
fn drop(&mut self) {
unsafe {
if !self.raw.is_null() {
sys::ImGuiSelectionBasicStorage_destroy(self.raw);
self.raw = std::ptr::null_mut();
}
}
}
}
pub struct BasicSelectionIter<'a> {
storage: &'a BasicSelection,
it: *mut std::os::raw::c_void,
}
impl<'a> Iterator for BasicSelectionIter<'a> {
type Item = Id;
fn next(&mut self) -> Option<Self::Item> {
unsafe {
let mut out_id: sys::ImGuiID = 0;
let has_next = sys::ImGuiSelectionBasicStorage_GetNextSelectedItem(
self.storage.as_raw(),
&mut self.it,
&mut out_id,
);
if has_next {
Some(Id::from(out_id))
} else {
None
}
}
}
}