use super::*;
#[derive(Default)]
pub enum ListEnumeration {
#[default]
None,
Dash,
Bullet,
Numerical,
Literal,
}
pub struct ListView<T: PartialEq + 'static> {
base: WidgetBase,
items: Vec<DisplayValue<T>>,
enumeration: ListEnumeration,
}
impl<T: PartialEq> Default for ListView<T> {
fn default() -> Self {
Self {
base: WidgetBase::default(),
items: Vec::default(),
enumeration: ListEnumeration::default(),
}
}
}
impl<T: PartialEq> ListView<T> {
pub fn add_item(&mut self, item: DisplayValue<T>) {
self.items.push(item);
}
pub fn remove_item(&mut self, tab: &DisplayValue<T>) {
let idx = self.items.iter().position(|x| x.value() == tab.value());
if let Some(index) = idx {
self.items.remove(index);
}
}
}
impl<T: PartialEq> Window for ListView<T> {
fn render(&self, canvas: &mut crate::canvas::Canvas) {
let counter = usize::MIN;
for item in self.items.iter() {
let mut row = canvas.get_row_variable_width(0).unwrap();
match self.enumeration {
ListEnumeration::Bullet => row.add_grapheme(
Grapheme::from("•").unwrap(),
None,
None,
Style::default() as u8,
),
ListEnumeration::Dash => row.add_grapheme(
Grapheme::from("‒").unwrap(),
None,
None,
Style::default() as u8,
),
ListEnumeration::Literal => {
row.add_string("a", None, None, Style::default() as u8, None)
}
ListEnumeration::Numerical => {
row.add_string("1", None, None, Style::default() as u8, None)
}
ListEnumeration::None => Ok(()),
}
.ok();
}
}
fn is_enabled(&self) -> bool {
self.base.enabled
}
}
impl<T: PartialEq> WindowLayout for ListView<T> {
fn size(&self) -> Vector2D<Size> {
self.base.size
}
fn border(&self) -> BorderStyle {
self.base.border
}
fn alignment(&self) -> (HorizontalAlignment, VerticalAlignment) {
self.base.alignment
}
fn is_visible(&self) -> bool {
self.base.visibility
}
fn margin(&self) -> Thickness {
self.base.margin
}
}
impl<T: PartialEq> HasWindowUid for ListView<T> {
fn uid(&self) -> super::WindowUid {
self.base.uid
}
}
impl<T: PartialEq> Widget for ListView<T> {
fn set_alignment(&mut self, horizontal: HorizontalAlignment, vertical: VerticalAlignment) {
self.base.alignment = (horizontal, vertical);
}
fn set_visibility(&mut self, visibility: bool) {
self.base.visibility = visibility;
}
fn set_width(&mut self, width: Size) {
self.base.size.x = width;
}
fn set_height(&mut self, height: Size) {
self.base.size.y = height;
}
fn set_margin(&mut self, margin: Thickness) {
self.base.margin = margin;
}
fn set_border(&mut self, border: BorderStyle) {
self.base.border = border;
}
fn set_enabled_state(&mut self, is_enabled: bool) {
self.base.enabled = is_enabled;
}
fn set_width_constraint(&mut self, width: SizeConstraint) {
self.base.constraints.x = width;
self.evoke_changed_property(WindowProperty::Size);
}
fn set_height_constraint(&mut self, height: SizeConstraint) {
self.base.constraints.y = height;
self.evoke_changed_property(WindowProperty::Size);
}
}