map: made View data structure and cleaned up

This commit is contained in:
lunar-mining
2022-02-06 08:14:51 +01:00
parent 7244fb850a
commit cc895b2580
5 changed files with 40 additions and 103 deletions

View File

@@ -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};

View File

@@ -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;
}
_ => (),
}

View File

@@ -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);
}
}

View File

@@ -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);
//}

View File

@@ -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;