From 2247bae55c62c2da3fd2ec314c4f11520a17e056 Mon Sep 17 00:00:00 2001 From: lunar-mining Date: Sat, 12 Feb 2022 11:33:02 +0100 Subject: [PATCH] map: added View --- bin/map/src/view.rs | 83 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 bin/map/src/view.rs diff --git a/bin/map/src/view.rs b/bin/map/src/view.rs new file mode 100644 index 000000000..b9dd1df6c --- /dev/null +++ b/bin/map/src/view.rs @@ -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, +} + +impl IdListView { + pub fn new(node_id: Vec) -> 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, +} + +impl InfoListView { + pub fn new(infos: Vec) -> 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; + } + } +}