use super::types::SectionedSelection;
impl Default for SectionedSelection {
fn default() -> Self {
Self::new()
}
}
impl SectionedSelection {
pub fn new() -> Self {
Self {
section: 0,
item: 0,
collapsed: std::collections::HashMap::new(),
}
}
pub fn next(&mut self, section_sizes: &[usize]) {
if section_sizes.is_empty() {
return;
}
let current_section_size = section_sizes.get(self.section).copied().unwrap_or(0);
if current_section_size == 0 || self.item >= current_section_size - 1 {
self.section = (self.section + 1) % section_sizes.len();
self.item = 0;
} else {
self.item += 1;
}
}
pub fn prev(&mut self, section_sizes: &[usize]) {
if section_sizes.is_empty() {
return;
}
if self.item == 0 {
if self.section == 0 {
self.section = section_sizes.len() - 1;
} else {
self.section -= 1;
}
let prev_section_size = section_sizes.get(self.section).copied().unwrap_or(0);
self.item = prev_section_size.saturating_sub(1);
} else {
self.item -= 1;
}
}
pub fn next_section(&mut self, section_count: usize) {
if section_count > 0 {
self.section = (self.section + 1) % section_count;
self.item = 0;
}
}
pub fn prev_section(&mut self, section_count: usize) {
if section_count > 0 {
if self.section == 0 {
self.section = section_count - 1;
} else {
self.section -= 1;
}
self.item = 0;
}
}
pub fn toggle_section(&mut self) {
let collapsed = self.collapsed.entry(self.section).or_insert(false);
*collapsed = !*collapsed;
}
pub fn is_section_collapsed(&self, section: usize) -> bool {
self.collapsed.get(§ion).copied().unwrap_or(false)
}
pub fn collapse_section(&mut self, section: usize) {
self.collapsed.insert(section, true);
}
pub fn expand_section(&mut self, section: usize) {
self.collapsed.insert(section, false);
}
pub fn expand_all(&mut self) {
self.collapsed.clear();
}
pub fn collapse_all(&mut self, section_count: usize) {
for i in 0..section_count {
self.collapsed.insert(i, true);
}
}
pub fn get(&self) -> (usize, usize) {
(self.section, self.item)
}
pub fn set(&mut self, section: usize, item: usize) {
self.section = section;
self.item = item;
}
pub fn reset(&mut self) {
self.section = 0;
self.item = 0;
}
}