Skip to main content

gitv_tui/ui/
layout.rs

1use ratatui::layout::{Rect, Spacing};
2use ratatui_macros::{horizontal, vertical};
3
4#[derive(Debug, Clone, Copy)]
5pub struct Layout {
6    pub status_bar: Rect,
7    pub mini_convo_preview: Rect,
8    pub main_content: Rect,
9    pub label_list: Rect,
10    pub text_search: Rect,
11    pub status_dropdown: Rect,
12    pub issue_preview: Rect,
13    pub label_search: Rect,
14    pub title_bar: Rect,
15}
16
17impl Layout {
18    pub fn new(area: Rect) -> Self {
19        let [title_bar, main, status_bar] = vertical![==1, *=1, ==1].areas(area);
20        let [left, right] = horizontal![==66%, *=1].areas(main);
21        let [mini_convo_preview, label_list, issue_preview] = vertical![==60%, *=1, *=1]
22            .spacing(Spacing::Overlap(1))
23            .areas(right);
24        let [text_search, bottom_search, main_content] = vertical![==3, ==3, *=1].areas(left);
25        let [label_search, status_dropdown] = horizontal![*=1, ==30%].areas(bottom_search);
26        Self {
27            status_dropdown,
28            mini_convo_preview,
29            title_bar,
30            status_bar,
31            main_content,
32            label_list,
33            label_search,
34            text_search,
35            issue_preview,
36        }
37    }
38
39    pub fn fullscreen(area: Rect) -> Self {
40        Self {
41            mini_convo_preview: area,
42            status_bar: area,
43            main_content: area,
44            label_list: area,
45            text_search: area,
46            status_dropdown: area,
47            issue_preview: area,
48            label_search: area,
49            title_bar: area,
50        }
51    }
52
53    pub fn areas(&self) -> [Rect; 4] {
54        [
55            self.title_bar,
56            self.main_content,
57            self.label_list,
58            self.issue_preview,
59        ]
60    }
61}