cosmic/widget/table/model/
selection.rs
use super::{
Entity, Model,
category::{ItemCategory, ItemInterface},
};
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<Item: ItemInterface<Category>, Category: ItemCategory> Selectable
for Model<SingleSelect, Item, Category>
{
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<Item: ItemInterface<Category>, Category: ItemCategory> Model<SingleSelect, Item, Category> {
#[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<Item: ItemInterface<Category>, Category: ItemCategory> Selectable
for Model<MultiSelect, Item, Category>
{
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<Item: ItemInterface<Category>, Category: ItemCategory> Model<MultiSelect, Item, Category> {
pub fn deactivate(&mut self, id: Entity) {
Selectable::deactivate(self, id);
}
pub fn active(&self) -> impl Iterator<Item = Entity> + '_ {
self.selection.active.iter().copied()
}
}