Răsfoiți Sursa

map: added View

lunar-mining 4 ani în urmă
părinte
comite
2247bae55c
1 a modificat fișierele cu 83 adăugiri și 0 ștergeri
  1. 83 0
      bin/map/src/view.rs

+ 83 - 0
bin/map/src/view.rs

@@ -0,0 +1,83 @@
+use crate::model::NodeInfo;
+use tui::widgets::ListState;
+
+#[derive(Clone)]
+pub struct View {
+    pub id_list: IdListView,
+    pub info_list: InfoListView,
+}
+
+impl View {
+    pub fn new(id_list: IdListView, info_list: InfoListView) -> View {
+        View { id_list, info_list }
+    }
+}
+
+#[derive(Clone)]
+pub struct IdListView {
+    pub state: ListState,
+    pub node_id: Vec<String>,
+}
+
+impl IdListView {
+    pub fn new(node_id: Vec<String>) -> IdListView {
+        IdListView { state: ListState::default(), node_id }
+    }
+    pub fn next(&mut self) {
+        let i = match self.state.selected() {
+            Some(i) => {
+                if i >= self.node_id.len() - 1 {
+                    0
+                } else {
+                    i + 1
+                }
+            }
+            None => 0,
+        };
+        self.state.select(Some(i));
+    }
+
+    pub fn previous(&mut self) {
+        let i = match self.state.selected() {
+            Some(i) => {
+                if i == 0 {
+                    self.node_id.len() - 1
+                } else {
+                    i - 1
+                }
+            }
+            None => 0,
+        };
+        self.state.select(Some(i));
+    }
+
+    pub fn unselect(&mut self) {
+        self.state.select(None);
+    }
+}
+
+#[derive(Clone)]
+pub struct InfoListView {
+    pub index: usize,
+    pub infos: Vec<NodeInfo>,
+}
+
+impl InfoListView {
+    pub fn new(infos: Vec<NodeInfo>) -> InfoListView {
+        let index = 0;
+
+        InfoListView { index, infos }
+    }
+
+    pub async fn next(&mut self) {
+        self.index = (self.index + 1) % self.infos.len();
+    }
+
+    pub async fn previous(&mut self) {
+        if self.index > 0 {
+            self.index -= 1;
+        } else {
+            self.index = self.infos.len() - 1;
+        }
+    }
+}