use super::{Entity, Model};
use std::collections::HashSet;
pub trait Selectable {
fn activate(&mut self, id: Entity);
fn deactivate(&mut self, id: Entity);
fn is_active(&self, id: Entity) -> bool;
}
#[derive(Debug, Default)]
pub struct SingleSelect {
pub active: Entity,
}
impl Selectable for Model<SingleSelect> {
fn activate(&mut self, id: Entity) {
if !self.items.contains_key(id) {
return;
}
self.selection.active = id;
}
fn deactivate(&mut self, id: Entity) {
if id == self.selection.active {
self.selection.active = Entity::default();
}
}
fn is_active(&self, id: Entity) -> bool {
self.selection.active == id
}
}
impl Model<SingleSelect> {
#[must_use]
pub fn active_data<Data: 'static>(&self) -> Option<&Data> {
self.data(self.active())
}
#[must_use]
pub fn active_data_mut<Data: 'static>(&mut self) -> Option<&mut Data> {
self.data_mut(self.active())
}
pub fn deactivate(&mut self) {
Selectable::deactivate(self, Entity::default());
}
#[must_use]
pub fn active(&self) -> Entity {
self.selection.active
}
}
#[derive(Debug, Default)]
pub struct MultiSelect {
pub active: HashSet<Entity>,
}
impl Selectable for Model<MultiSelect> {
fn activate(&mut self, id: Entity) {
if !self.items.contains_key(id) {
return;
}
if !self.selection.active.insert(id) {
self.selection.active.remove(&id);
}
}
fn deactivate(&mut self, id: Entity) {
self.selection.active.remove(&id);
}
fn is_active(&self, id: Entity) -> bool {
self.selection.active.contains(&id)
}
}
impl Model<MultiSelect> {
pub fn deactivate(&mut self, id: Entity) {
Selectable::deactivate(self, id);
}
pub fn active(&self) -> impl Iterator<Item = Entity> + '_ {
self.selection.active.iter().copied()
}
}