mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
map: made View data structure and cleaned up
This commit is contained in:
@@ -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};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
//}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user