Skip to main content

gitkit_cli/tui/
state.rs

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        // putting in struct so i dont forget new pages from the payload struct
24        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, // todo add ctrl + c as quit
56            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}