list.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. use crate::types::{NodeId, NodeInfo};
  2. use std::collections::HashMap;
  3. use tui::widgets::ListState;
  4. #[derive(Clone)]
  5. pub struct NodeExtra {
  6. pub index: u32,
  7. pub noise: String,
  8. }
  9. impl NodeExtra {
  10. pub fn new() -> NodeExtra {
  11. let mut index = 0;
  12. let noise = Self::make_noise();
  13. NodeExtra { index, noise }
  14. }
  15. pub fn make_noise() -> String {
  16. String::new()
  17. }
  18. }
  19. #[derive(Clone)]
  20. pub struct StatefulList {
  21. pub state: ListState,
  22. pub nodes: HashMap<NodeId, NodeInfo>,
  23. pub nodex: NodeExtra,
  24. }
  25. impl StatefulList {
  26. pub fn new(nodes: HashMap<NodeId, NodeInfo>) -> StatefulList {
  27. StatefulList { state: ListState::default(), nodes, nodex: NodeExtra::new() }
  28. }
  29. pub fn next(&mut self) {
  30. let index = self.nodex.index;
  31. let i = match self.state.selected() {
  32. Some(i) => {
  33. if i >= self.nodes.len() - 1 {
  34. 0
  35. } else {
  36. i + 1
  37. }
  38. //index == i;
  39. }
  40. None => 0,
  41. };
  42. self.state.select(Some(i));
  43. }
  44. pub fn previous(&mut self) {
  45. let index = self.nodex.index;
  46. let i = match self.state.selected() {
  47. Some(i) => {
  48. if i == 0 {
  49. self.nodes.len() - 1
  50. } else {
  51. i - 1
  52. }
  53. //index == i;
  54. }
  55. None => 0,
  56. };
  57. self.state.select(Some(i));
  58. }
  59. pub fn unselect(&mut self) {
  60. self.state.select(None);
  61. }
  62. }