فهرست منبع

map: made View data structure and cleaned up

lunar-mining 4 سال پیش
والد
کامیت
cc895b2580
5فایلهای تغییر یافته به همراه40 افزوده شده و 103 حذف شده
  1. 2 0
      bin/map/src/lib.rs
  2. 30 9
      bin/map/src/main.rs
  3. 0 56
      bin/map/src/notes/list.rs
  4. 0 30
      bin/map/src/old/node_info.rs
  5. 8 8
      bin/map/src/ui.rs

+ 2 - 0
bin/map/src/lib.rs

@@ -1,5 +1,7 @@
 pub mod model;
 pub mod ui;
+pub mod view;
 
 pub use model::{IdList, InfoList, Model, NodeInfo};
 pub use ui::ui;
+pub use view::{IdListView, InfoListView, View};

+ 30 - 9
bin/map/src/main.rs

@@ -18,7 +18,9 @@ use tui::{
 
 use map::{
     model::{IdList, InfoList, NodeInfo},
-    ui, Model,
+    ui,
+    view::{IdListView, InfoListView},
+    Model, View,
 };
 
 struct Map {
@@ -187,17 +189,36 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut model: Model) -> io
 
     terminal.clear()?;
 
-    model.id_list.state.select(Some(0));
+    //model.id_list.state.select(Some(0));
 
-    model.info_list.index = 0;
+    //model.info_list.index = 0;
+
+    let mut info_vec = Vec::new();
+
+    for info in model.info_list.infos.clone() {
+        info_vec.push(info)
+    }
+
+    let mut id_vec = Vec::new();
+
+    for id in model.id_list.node_id.clone() {
+        id_vec.push(id)
+    }
+
+    let id_list = IdListView::new(id_vec);
+    let info_list = InfoListView::new(info_vec);
+    let mut view = View::new(id_list, info_list);
+
+    view.id_list.state.select(Some(0));
+
+    view.info_list.index = 0;
 
     // acquire the mutex
     // let mut model = model.lock();
 
     loop {
-        // clone everything
         terminal.draw(|f| {
-            ui::ui(f, model.clone());
+            ui::ui(f, view.clone());
         })?;
         for k in asi.by_ref().keys() {
             match k.unwrap() {
@@ -206,12 +227,12 @@ async fn run_app<B: Backend>(terminal: &mut Terminal<B>, mut model: Model) -> io
                     return Ok(())
                 }
                 Key::Char('j') => {
-                    model.id_list.next();
-                    model.info_list.next().await;
+                    view.id_list.next();
+                    view.info_list.next().await;
                 }
                 Key::Char('k') => {
-                    model.id_list.previous();
-                    model.info_list.previous().await;
+                    view.id_list.previous();
+                    view.info_list.previous().await;
                 }
                 _ => (),
             }

+ 0 - 56
bin/map/src/notes/list.rs

@@ -1,56 +0,0 @@
-use crate::{
-    info::{NodeId, NodeInfo},
-    ui::render_selected,
-};
-use std::collections::HashMap;
-use tui::widgets::ListState;
-
-// TODO: make this just a list
-// hashmaps are owned by App
-#[derive(Clone)]
-pub struct StatefulList {
-    pub state: ListState,
-    pub nodes: NodeId,
-    //pub nodes: HashMap<NodeId, NodeInfo>,
-    //pub node_info: NodeInfo,
-    //pub index: HashMap<usize, NodeInfo>,
-    //pub node_info: InfoScreen,
-}
-
-impl StatefulList {
-    pub fn new(nodes: NodeId) -> StatefulList {
-        StatefulList { state: ListState::default(), nodes }
-    }
-
-    pub fn next(&mut self) {
-        let i = match self.state.selected() {
-            Some(i) => {
-                if i >= self.nodes.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.nodes.id.len() - 1
-                } else {
-                    i - 1
-                }
-            }
-            None => 0,
-        };
-        self.state.select(Some(i));
-    }
-
-    pub fn unselect(&mut self) {
-        self.state.select(None);
-    }
-}

+ 0 - 30
bin/map/src/old/node_info.rs

@@ -1,30 +0,0 @@
-//TODO: made node_id into a HashSet(u32)
-// wrap NodeInfo and NodeId in a Mutex
-
-pub type NodeId = u32;
-
-#[derive(Clone)]
-pub struct NodeInfo {
-    pub id: String,
-    pub connections: usize,
-    pub is_active: bool,
-    pub last_message: String,
-}
-
-impl NodeInfo {
-    pub fn new() -> NodeInfo {
-        let connections = 0;
-        let is_active = false;
-        NodeInfo { id: String::new(), connections, is_active, last_message: String::new() }
-    }
-}
-
-impl Default for NodeInfo {
-    fn default() -> Self {
-        Self::new()
-    }
-}
-
-//pub async fn add_seen(&self, id: u32) {
-//    self.privmsg_ids.lock().await.insert(id);
-//}

+ 8 - 8
bin/map/src/ui.rs

@@ -1,4 +1,4 @@
-use crate::model::Model;
+use crate::view::View;
 use async_std::sync::{Arc, Mutex};
 use tui::{
     backend::Backend,
@@ -9,14 +9,14 @@ use tui::{
     Frame,
 };
 
-pub fn ui<B: Backend>(f: &mut Frame<'_, B>, mut app: Model) {
+pub fn ui<B: Backend>(f: &mut Frame<'_, B>, mut view: View) {
     let slice = Layout::default()
         .direction(Direction::Horizontal)
         .margin(2)
         .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref())
         .split(f.size());
 
-    let nodes: Vec<ListItem> = app
+    let nodes: Vec<ListItem> = view
         .id_list
         .node_id
         .iter()
@@ -31,15 +31,15 @@ pub fn ui<B: Backend>(f: &mut Frame<'_, B>, mut app: Model) {
         .highlight_style(Style::default().fg(Color::LightCyan).add_modifier(Modifier::BOLD));
 
     // needs to be mutable. could
-    f.render_stateful_widget(nodes, slice[0], &mut app.id_list.state);
+    f.render_stateful_widget(nodes, slice[0], &mut view.id_list.state);
 
-    let index = app.info_list.index;
+    let index = view.info_list.index;
 
-    render_info(app, f, index, slice);
+    render_info(view, f, index, slice);
 }
 
-fn render_info<B: Backend>(app: Model, f: &mut Frame<'_, B>, index: usize, slice: Vec<Rect>) {
-    let info = &app.info_list.infos;
+fn render_info<B: Backend>(view: View, f: &mut Frame<'_, B>, index: usize, slice: Vec<Rect>) {
+    let info = &view.info_list.infos;
     let id = &info[index].id;
     let connections = info[index].connections;
     let is_active = info[index].is_active;