88 lines
2.9 KiB
Rust
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);
|
|
}
|
|
} |