flux-tui 0.5.0

Fast and lightweight Terminal UI drawing library
Documentation
use super::*;

#[derive(Default)]
pub enum ListEnumeration {
	#[default]
	None,
	Dash,
	Bullet,
	Numerical,
	Literal,
}

//TODO
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);
	}
}