list.rs 998 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use tui::widgets::ListState;
  2. pub struct StatefulList<T> {
  3. pub state: ListState,
  4. pub items: Vec<T>,
  5. }
  6. impl<T> StatefulList<T> {
  7. pub fn with_items(items: Vec<T>) -> StatefulList<T> {
  8. StatefulList { state: ListState::default(), items }
  9. }
  10. pub fn next(&mut self) {
  11. let i = match self.state.selected() {
  12. Some(i) => {
  13. if i >= self.items.len() - 1 {
  14. 0
  15. } else {
  16. i + 1
  17. }
  18. }
  19. None => 0,
  20. };
  21. self.state.select(Some(i));
  22. }
  23. pub fn previous(&mut self) {
  24. let i = match self.state.selected() {
  25. Some(i) => {
  26. if i == 0 {
  27. self.items.len() - 1
  28. } else {
  29. i - 1
  30. }
  31. }
  32. None => 0,
  33. };
  34. self.state.select(Some(i));
  35. }
  36. pub fn unselect(&mut self) {
  37. self.state.select(None);
  38. }
  39. }