list.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use crate::types::{NodeId, NodeInfo};
  2. use std::collections::HashMap;
  3. use tui::widgets::ListState;
  4. #[derive(Clone)]
  5. pub struct StatefulList {
  6. pub state: ListState,
  7. pub nodes: HashMap<NodeId, NodeInfo>,
  8. }
  9. impl StatefulList {
  10. pub fn new(nodes: HashMap<NodeId, NodeInfo>) -> StatefulList {
  11. StatefulList { state: ListState::default(), nodes }
  12. }
  13. pub fn next(&mut self) {
  14. let i = match self.state.selected() {
  15. Some(i) => {
  16. if i >= self.nodes.len() - 1 {
  17. 0
  18. } else {
  19. i + 1
  20. }
  21. }
  22. None => 0,
  23. };
  24. self.state.select(Some(i));
  25. }
  26. pub fn previous(&mut self) {
  27. let i = match self.state.selected() {
  28. Some(i) => {
  29. if i == 0 {
  30. self.nodes.len() - 1
  31. } else {
  32. i - 1
  33. }
  34. }
  35. None => 0,
  36. };
  37. self.state.select(Some(i));
  38. }
  39. pub fn unselect(&mut self) {
  40. self.state.select(None);
  41. }
  42. }