Display top level section information

This commit is contained in:
Jaby Blubb 2023-08-20 09:15:24 +02:00
parent f89eb8eb7e
commit e3fc41fce3
1 changed files with 93 additions and 43 deletions

View File

@ -70,21 +70,42 @@ enum SectionMode {
LowerSection, LowerSection,
} }
impl SectionMode { impl ID for SectionMode {
pub fn get_id(&self) -> usize { fn get_id(&self) -> usize {
match self { *self as usize
SectionMode::UpperSection => 0,
SectionMode::LowerSection => 1,
}
} }
} }
struct SectionSelection { impl Default for SectionMode {
mode: SectionMode, fn default() -> Self {
SectionMode::UpperSection
}
}
#[derive(Copy, Clone)]
enum ListSectionMode {
TopSection,
Section,
}
impl ID for ListSectionMode {
fn get_id(&self) -> usize {
*self as usize
}
}
impl Default for ListSectionMode {
fn default() -> Self {
ListSectionMode::TopSection
}
}
struct DualSelection<T:ID> {
mode: T,
id: [usize; 2] id: [usize; 2]
} }
impl SectionSelection { impl<T:ID + Copy> DualSelection<T> {
fn increment(&mut self, max: usize) { fn increment(&mut self, max: usize) {
let cur_id = &mut self.id[self.mode.get_id()]; let cur_id = &mut self.id[self.mode.get_id()];
let new_selection = *cur_id + 1; let new_selection = *cur_id + 1;
@ -101,7 +122,7 @@ impl SectionSelection {
} }
fn decrement(&mut self, max: usize) { fn decrement(&mut self, max: usize) {
let cur_id = &mut self.id[self.mode.get_id()]; let cur_id = &mut self.id[self.mode.get_id()%2];
let new_selection = *cur_id - 1; let new_selection = *cur_id - 1;
*cur_id = { *cur_id = {
@ -115,7 +136,7 @@ impl SectionSelection {
} }
} }
fn switch_section_to(&mut self, section_mode: SectionMode) { fn switch_section_to(&mut self, section_mode: T) {
self.mode = section_mode; self.mode = section_mode;
} }
@ -123,38 +144,47 @@ impl SectionSelection {
self.mode.get_id() self.mode.get_id()
} }
fn get_selection_for(&self, section_mode: SectionMode) -> usize { fn get_selection_for(&self, section_mode: T) -> usize {
self.id[section_mode.get_id()] self.id[section_mode.get_id()]
} }
fn get_current_selection(&self) -> usize { fn get_current_selection(&self) -> ListState {
self.get_selection_for(self.mode) let mut state = ListState::default();
state.select(Some(self.get_selection_for(self.mode)));
state
} }
} }
impl Default for SectionSelection { impl<T:ID + Default> Default for DualSelection<T> {
fn default() -> Self { fn default() -> Self {
Self{mode: SectionMode::UpperSection, id: [0, 0]} Self{mode: T::default(), id: [0, 0]}
} }
} }
trait ID {
fn get_id(&self) -> usize;
}
pub struct ConsoleUI { pub struct ConsoleUI {
data: ConsoleUIData, data: ConsoleUIData,
rx: EventReceiver, rx: EventReceiver,
terminal: Terminal, terminal: Terminal,
console_size: Rect, console_size: Rect,
menu_selection: MenuSelection, menu_selection: MenuSelection,
section_selection: SectionSelection, section_selection: DualSelection<SectionMode>,
list_section_selection: DualSelection<ListSectionMode>,
} }
impl ConsoleUI { impl ConsoleUI {
pub fn new(rx: EventReceiver, terminal: Terminal) -> ConsoleUI { pub fn new(rx: EventReceiver, terminal: Terminal) -> ConsoleUI {
ConsoleUI{data: ConsoleUIData::default(), rx, terminal, console_size: Rect::default(), menu_selection: MenuSelection::Stats, section_selection: SectionSelection::default()} ConsoleUI{data: ConsoleUIData::default(), rx, terminal, console_size: Rect::default(), menu_selection: MenuSelection::Stats, section_selection: DualSelection::default(), list_section_selection: DualSelection::default()}
} }
pub fn update_data(&mut self, memory_map: &MemoryMap) -> Result<(), Error> { pub fn update_data(&mut self, memory_map: &MemoryMap) -> Result<(), Error> {
self.data = ConsoleUIData::from(memory_map)?; self.data = ConsoleUIData::from(memory_map)?;
self.section_selection = SectionSelection::default(); self.section_selection = DualSelection::default();
self.list_section_selection = DualSelection::default();
Ok(()) Ok(())
} }
@ -249,10 +279,10 @@ impl ConsoleUI {
frame.render_widget(menu_bar, main_layout[0]); frame.render_widget(menu_bar, main_layout[0]);
match self.menu_selection { match self.menu_selection {
MenuSelection::Stats => { MenuSelection::Stats => {
Self::render_stats(frame, main_layout[1], &self.section_selection, &mut self.data); Self::render_stats(frame, main_layout[1], &self.section_selection, &self.data);
}, },
MenuSelection::List => { MenuSelection::List => {
Self::render_list(frame, main_layout[1]); Self::render_list(frame, main_layout[1], &self.list_section_selection, &self.data);
}, },
MenuSelection::Quit => { MenuSelection::Quit => {
Self::render_quit(frame, main_layout[1]); Self::render_quit(frame, main_layout[1]);
@ -292,8 +322,19 @@ impl ConsoleUI {
} }
} }
fn update_list(&mut self, _key: KeyEvent) -> Option<UIState> { fn update_list(&mut self, key: KeyEvent) -> Option<UIState> {
None let length = self.data.section_info.len() - 1;
match key.code {
KeyCode::Down => {
self.list_section_selection.increment(length);
return Some(UIState::Render);
},
KeyCode::Up => {
self.list_section_selection.decrement(length);
return Some(UIState::Render);
},
_ => None
}
} }
fn update_quit(&mut self, key: KeyEvent) -> Option<UIState> { fn update_quit(&mut self, key: KeyEvent) -> Option<UIState> {
@ -303,7 +344,7 @@ impl ConsoleUI {
} }
} }
fn render_stats(frame: &mut ConsoleFrame, layout: Rect, section_selection: &SectionSelection, data: &mut ConsoleUIData) { fn render_stats(frame: &mut ConsoleFrame, layout: Rect, section_selection: &DualSelection<SectionMode>, data: &ConsoleUIData) {
const HIGHLIGHT_COLOR:[Color;2] = [Color::Cyan, Color::Red]; const HIGHLIGHT_COLOR:[Color;2] = [Color::Cyan, Color::Red];
let layout = Layout::default().direction(Direction::Vertical).constraints([ let layout = Layout::default().direction(Direction::Vertical).constraints([
Constraint::Length(3), Constraint::Length(3),
@ -322,16 +363,13 @@ impl ConsoleUI {
let first_mem_gauge = Self::create_mem_gauge_from(&data.section_info[section_selection.get_selection_for(SectionMode::UpperSection)], "a", HIGHLIGHT_COLOR[0]); let first_mem_gauge = Self::create_mem_gauge_from(&data.section_info[section_selection.get_selection_for(SectionMode::UpperSection)], "a", HIGHLIGHT_COLOR[0]);
let second_mem_gauge = Self::create_mem_gauge_from(&data.section_info[section_selection.get_selection_for(SectionMode::LowerSection)], "s", HIGHLIGHT_COLOR[1]); let second_mem_gauge = Self::create_mem_gauge_from(&data.section_info[section_selection.get_selection_for(SectionMode::LowerSection)], "s", HIGHLIGHT_COLOR[1]);
let mut list_state = ListState::default();
frame.render_stateful_widget(content_list, layout[0], &mut section_selection.get_current_selection());
list_state.select(Some(section_selection.get_current_selection()));
frame.render_stateful_widget(content_list, layout[0], &mut list_state);
frame.render_widget(first_mem_gauge, layout[1]); frame.render_widget(first_mem_gauge, layout[1]);
frame.render_widget(second_mem_gauge, layout[2]); frame.render_widget(second_mem_gauge, layout[2]);
} }
fn render_list(frame: &mut ConsoleFrame, layout: Rect) { fn render_list(frame: &mut ConsoleFrame, layout: Rect, section_selection: &DualSelection<ListSectionMode>, data: &ConsoleUIData) {
let (info_layout, list_layout) = { let (info_layout, list_layout) = {
let layout = Layout::default().direction(Direction::Vertical).constraints([ let layout = Layout::default().direction(Direction::Vertical).constraints([
Constraint::Min(5), Constraint::Min(5),
@ -343,19 +381,31 @@ impl ConsoleUI {
Constraint::Percentage(50) Constraint::Percentage(50)
]).split(layout[0])) ]).split(layout[0]))
}; };
let text = Paragraph::new("Schwimmflügel") let section_list = List::new(data.section_info.iter().skip(1).map(|section| {
ListItem::new(section.name.clone())
}).collect::<Vec<_>>()).style(Style::default().fg(Color::White))
.block(Block::default()
.borders(Borders::ALL)
.style(Style::default().fg(Color::White)) .style(Style::default().fg(Color::White))
.alignment(Alignment::Center) .border_type(BorderType::Plain)
.title("Section")
)
.highlight_style(Style::default().bg(Color::White));
let top_section = &data.section_info[section_selection.get_selection_for(ListSectionMode::TopSection) + 1];
let info_text = Paragraph::new(format!("Name: {}", top_section.name))
.style(Style::default().fg(Color::White))
.alignment(Alignment::Left)
.block(Block::default() .block(Block::default()
.borders(Borders::ALL) .borders(Borders::ALL)
.style(Style::default().fg(Color::White)) .style(Style::default().fg(Color::White))
.border_type(BorderType::Plain).title("Wuffi") .border_type(BorderType::Plain).title("Information")
); );
frame.render_widget(text.clone(), info_layout); frame.render_widget(info_text, info_layout);
frame.render_widget(text.clone(), list_layout[0]); frame.render_stateful_widget(section_list, list_layout[0], &mut section_selection.get_current_selection());
frame.render_widget(text, list_layout[1]); //frame.render_widget(text, list_layout[1]);
} }
fn render_quit(frame: &mut ConsoleFrame, layout: Rect) { fn render_quit(frame: &mut ConsoleFrame, layout: Rect) {