1use crossterm::event::{KeyCode, KeyEvent};
2
3use crate::git::kit::KitRepo;
4use crate::metrics::cadence::{CadenceData, CadencePage};
5
6use crate::error::Result;
7use crate::metrics::silo::{SiloData, SiloPage};
8use crate::tui::page::{HomeData, HomePage, Page};
9use crate::worker::DataPayload;
10
11pub struct TuiState {
12 pub is_quit: bool,
13 pub loading: bool,
14 pub refresh: bool,
15 pub active_page: Page,
16 pub home: HomePage,
17 pub cadence: CadencePage,
18 pub silo: SiloPage,
19}
20
21impl TuiState {
22 pub fn new(repo: &KitRepo) -> Result<TuiState> {
23 let data = DataPayload {
25 cadence_data: CadenceData::new(repo),
26 home_data: HomeData::new(repo),
27 silo_data: SiloData::new(repo),
28 };
29
30 Ok(TuiState {
31 is_quit: false,
32 loading: false,
33 refresh: false,
34 active_page: Page::default(),
35 home: HomePage::new(data.home_data),
36 cadence: CadencePage::new(data.cadence_data),
37 silo: SiloPage::new(data.silo_data),
38 })
39 }
40
41 pub fn refresh(&mut self, payload: DataPayload) {
42 self.home = HomePage::new(payload.home_data);
43 self.cadence = CadencePage::new(payload.cadence_data);
44 self.silo = SiloPage::new(payload.silo_data);
45
46 self.loading = false;
47 self.refresh = false;
48 }
49 pub fn next_tab(&mut self) {
50 self.active_page = self.active_page.next();
51 }
52
53 pub fn handle_key_event(&mut self, key: KeyEvent, repo: &KitRepo) {
54 match key.code {
55 KeyCode::Char('q') => self.is_quit = true, KeyCode::Tab => self.next_tab(),
57 _ => match self.active_page {
58 Page::Cadence => self.cadence.handle_key(key, repo),
59 Page::Silo => self.silo.handle_key(key, repo),
60 Page::Home => self.home.handle_key(key, repo, &mut self.refresh),
61 },
62 }
63 }
64
65 pub fn get_binds(&self) -> Vec<(&str, &str)> {
66 match self.active_page {
67 Page::Home => {
68 vec![("Tab", "Next"), ("q", "quit")]
69 }
70 Page::Cadence => {
71 vec![
72 ("Tab", "Next"),
73 ("(k,⇧)/(j,⇩)", "up/down"),
74 ("⏎", "Select"),
75 ("q", "quit"),
76 ]
77 }
78 Page::Silo => {
79 vec![
80 ("Tab", "Next"),
81 ("(k,⇧)/(j,⇩)", "up/down"),
82 ("(SHIFT + k)/(shift + j)", "5 (up/down)"),
83 ("g/G", "top/bottom"),
84 ("q", "quit"),
85 ]
86 }
87 }
88 }
89}