#[derive(Debug, Clone, PartialEq)]
pub struct PickerItem {
pub id: String,
pub label: String,
pub metadata: Option<String>, pub inspect_metadata: Option<String>, pub sort_key: Option<String>, }
#[derive(Debug, Clone, PartialEq)]
pub enum SortMode {
Date,
Name,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PickerState {
pub title: String,
pub items: Vec<PickerItem>,
pub selected: usize,
pub sort_mode: SortMode,
}
impl PickerState {
pub fn new<T: Into<String>>(title: T, items: Vec<PickerItem>, selected: usize) -> Self {
Self {
title: title.into(),
items,
selected,
sort_mode: SortMode::Date, }
}
pub fn selected_id(&self) -> Option<&str> {
self.items.get(self.selected).map(|i| i.id.as_str())
}
pub fn get_selected_item(&self) -> Option<&PickerItem> {
self.items.get(self.selected)
}
pub fn move_up(&mut self) {
if !self.items.is_empty() {
if self.selected == 0 {
self.selected = self.items.len() - 1;
} else {
self.selected -= 1;
}
}
}
pub fn move_down(&mut self) {
if !self.items.is_empty() {
self.selected = (self.selected + 1) % self.items.len();
}
}
pub fn move_to_start(&mut self) {
if !self.items.is_empty() {
self.selected = 0;
}
}
pub fn move_to_end(&mut self) {
if !self.items.is_empty() {
self.selected = self.items.len() - 1;
}
}
pub fn cycle_sort_mode(&mut self) {
self.sort_mode = match self.sort_mode {
SortMode::Date => SortMode::Name,
SortMode::Name => SortMode::Date,
};
}
pub fn get_selected_metadata(&self) -> Option<&str> {
self.items.get(self.selected)?.metadata.as_deref()
}
pub fn get_selected_inspect_metadata(&self) -> Option<&str> {
let item = self.items.get(self.selected)?;
item.inspect_metadata
.as_deref()
.or(item.metadata.as_deref())
}
}