tavern_keeper/src/app.rs

88 lines
2.9 KiB
Rust

use crossterm::event::{read, Event, KeyCode};
use tui::{Terminal, backend::Backend, Frame};
use crate::state::{self, GameState};
/**
* |........................|
* | Conversations/Selection|
* | |
* |........................|
* | Available Options |
* |........................|
*/
enum AppStatus {
Initial,
GuestSelection,
}
pub struct App<'a> {
state: GameState,
guest_list: Vec<tui::widgets::ListItem<'a>>,
guest_state: tui::widgets::ListState,
status: AppStatus,
}
impl<'a> App<'a> {
pub fn new(state: GameState) -> App<'a> {
App {
state: state,
guest_list: vec![],
guest_state: tui::widgets::ListState::default(),
status: AppStatus::Initial,
}
}
pub fn step(&mut self) -> bool {
match self.status {
AppStatus::Initial => {
// determine guests
self.guest_list = self.state.people.iter().map(|guest| {
tui::widgets::ListItem::new(guest.name.clone())
}).collect();
self.guest_state = tui::widgets::ListState::default();
self.guest_state.select(Some(0));
self.status = AppStatus::GuestSelection;
true
},
AppStatus::GuestSelection => {
match read() {
Ok(Event::Key(event)) => {
match event.code {
KeyCode::Up => {
let selected = self.guest_state.selected().unwrap();
if selected > 0 {
self.guest_state.select(Some(selected - 1));
}
},
KeyCode::Down => {
let selected = self.guest_state.selected().unwrap();
if selected < self.guest_list.len() - 1 {
self.guest_state.select(Some(selected + 1));
}
},
KeyCode::Esc => {
return false;
},
_ => {}
}
},
_ => {}
}
true
}
}
}
pub fn draw<B: Backend>(&mut self, f: &mut Frame<B>) {
let main_window = tui::widgets::List::new(self.guest_list.clone())
.block(tui::widgets::Block::default().title("Guests").borders(tui::widgets::Borders::ALL))
.style(tui::style::Style::default().fg(tui::style::Color::White))
.highlight_style(tui::style::Style::default().add_modifier(tui::style::Modifier::ITALIC))
.highlight_symbol(">>");
f.render_stateful_widget(main_window, f.size(), &mut self.guest_state);
}
}