aboutsummaryrefslogtreecommitdiffstats
path: root/src/app.rs
blob: 22bf543dda01766ea30263f2d07c95c17bf4ea16 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
pub struct App {
    cursive: cursive::Cursive,
}

impl App {
    pub fn new(budget: crate::ynab::Budget) -> Self {
        let mut app = cursive::Cursive::default();
        let term_width = app.screen_size().x;
        app.set_theme(Self::theme());
        app.add_global_callback('q', |s| s.quit());

        let mut layout = cursive::views::LinearLayout::vertical();
        layout.add_child(cursive::views::TextView::new(format!(
            "Budget: {} ({})\n{}",
            budget.name(),
            budget.id(),
            "=".repeat(term_width),
        )));

        layout.add_child(crate::views::TxnTables::new("txn_tables", &budget));

        app.set_user_data(budget);
        app.add_fullscreen_layer(layout);

        Self { cursive: app }
    }

    pub fn run(&mut self) {
        self.cursive.run();
    }

    fn theme() -> cursive::theme::Theme {
        let mut palette = cursive::theme::Palette::default();
        palette[cursive::theme::PaletteColor::Background] =
            cursive::theme::Color::TerminalDefault;
        palette[cursive::theme::PaletteColor::View] =
            cursive::theme::Color::TerminalDefault;
        palette[cursive::theme::PaletteColor::Primary] =
            cursive::theme::Color::TerminalDefault;
        cursive::theme::Theme {
            shadow: false,
            borders: cursive::theme::BorderStyle::Simple,
            palette,
        }
    }
}