From cc895b2580547462df7309399519030db8dc152a Mon Sep 17 00:00:00 2001 From: lunar-mining Date: Sun, 6 Feb 2022 08:14:51 +0100 Subject: [PATCH] map: made View data structure and cleaned up --- bin/map/src/lib.rs | 2 ++ bin/map/src/main.rs | 39 +++++++++++++++++++------ bin/map/src/notes/list.rs | 56 ------------------------------------ bin/map/src/old/node_info.rs | 30 ------------------- bin/map/src/ui.rs | 16 +++++------ 5 files changed, 40 insertions(+), 103 deletions(-) delete mode 100644 bin/map/src/notes/list.rs delete mode 100644 bin/map/src/old/node_info.rs diff --git a/bin/map/src/lib.rs b/bin/map/src/lib.rs index c501b6a88..abe92bb36 100644 --- a/bin/map/src/lib.rs +++ b/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}; diff --git a/bin/map/src/main.rs b/bin/map/src/main.rs index 89d621932..b7c278fc2 100644 --- a/bin/map/src/main.rs +++ b/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(terminal: &mut Terminal, 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(terminal: &mut Terminal, 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; } _ => (), } diff --git a/bin/map/src/notes/list.rs b/bin/map/src/notes/list.rs deleted file mode 100644 index 6b74dc506..000000000 --- a/bin/map/src/notes/list.rs +++ /dev/null @@ -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, - //pub node_info: NodeInfo, - //pub index: HashMap, - //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); - } -} diff --git a/bin/map/src/old/node_info.rs b/bin/map/src/old/node_info.rs deleted file mode 100644 index 06ef3eb42..000000000 --- a/bin/map/src/old/node_info.rs +++ /dev/null @@ -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); -//} diff --git a/bin/map/src/ui.rs b/bin/map/src/ui.rs index 31607613e..5006dc184 100644 --- a/bin/map/src/ui.rs +++ b/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(f: &mut Frame<'_, B>, mut app: Model) { +pub fn ui(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 = app + let nodes: Vec = view .id_list .node_id .iter() @@ -31,15 +31,15 @@ pub fn ui(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(app: Model, f: &mut Frame<'_, B>, index: usize, slice: Vec) { - let info = &app.info_list.infos; +fn render_info(view: View, f: &mut Frame<'_, B>, index: usize, slice: Vec) { + let info = &view.info_list.infos; let id = &info[index].id; let connections = info[index].connections; let is_active = info[index].is_active;