map: added View

This commit is contained in:
lunar-mining
2022-02-12 11:33:02 +01:00
parent bba15e20d6
commit 2247bae55c

83
bin/map/src/view.rs Normal file
View File

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