#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct SelectData {
selected: Vec<bool>,
open: bool,
}
impl SelectData {
pub fn new(selected: Vec<bool>) -> Self {
Self {
selected,
open: false,
}
}
pub fn resize(&mut self, len: usize) {
self.selected.resize(len, false);
}
pub fn len(&self) -> usize {
self.selected.len()
}
pub fn is_empty(&self) -> bool {
self.selected.is_empty()
}
pub fn is_selected(&self, index: usize) -> bool {
self.selected.get(index).copied().unwrap_or(false)
}
pub fn selected_index(&self) -> Option<usize> {
self.selected.iter().position(|selected| *selected)
}
pub fn set_selected(&mut self, index: usize, selected: bool) -> bool {
match self.selected.get_mut(index) {
Some(entry) if *entry != selected => {
*entry = selected;
true
}
_ => false,
}
}
pub fn select_only(&mut self, index: usize) -> bool {
if index >= self.selected.len() {
return false;
}
let mut changed = false;
for (i, entry) in self.selected.iter_mut().enumerate() {
let want = i == index;
changed |= *entry != want;
*entry = want;
}
changed
}
pub fn clear_selection(&mut self) -> bool {
let mut changed = false;
for entry in self.selected.iter_mut() {
changed |= *entry;
*entry = false;
}
changed
}
pub fn is_open(&self) -> bool {
self.open
}
pub fn set_open(&mut self, open: bool) {
self.open = open;
}
}