aboutsummaryrefslogtreecommitdiff
path: root/src/gui/app.rs
blob: 8cd709681a65c96ea6a2f694403f556a09437195 (plain)
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use gtk4 as gtk;

use anyhow::Result;
use async_channel::Sender;
use chrono::{Datelike, Duration, NaiveDate, Weekday};
use gtk::glib::signal::Inhibit;
use gtk::prelude::*;
use rusqlite::Connection;
use std::rc::Rc;

use crate::gui::calendar;
use crate::gui::update::Msg;
use crate::{db, model::event::Event};

pub struct App {
    pub conn: Rc<Connection>,
    pub window: Rc<gtk::ApplicationWindow>,
    pub grid: gtk::Grid,
    pub events: Vec<Event>, // TODO: use Hashmap to have fast access to events by id ?
    pub recurring_events: Vec<Event>, // TODO: use Hashmap to have fast access to events by id ?
    pub today: NaiveDate,
    pub start_date: NaiveDate,
    pub end_date: NaiveDate,
    pub tx: Sender<Msg>,
}

impl App {
    pub fn new(conn: Rc<Connection>, app: &gtk::Application, tx: Sender<Msg>) -> Result<Self> {
        let window = Rc::new(
            gtk::ApplicationWindow::builder()
                .application(app)
                .title("Calendar")
                .default_width(800)
                .default_height(600)
                .visible(true)
                .build(),
        );

        let today = chrono::offset::Local::today().naive_utc();
        let start_date =
            NaiveDate::from_isoywd(today.year(), today.iso_week().week(), Weekday::Mon);
        let end_date = start_date + Duration::days(7 * 4 - 1);

        let events = db::list_non_recurring_between(&conn, start_date, end_date)?;
        let recurring_events = db::list_recurring(&conn)?;

        let grid = calendar::create(
            tx.clone(),
            today,
            start_date,
            end_date,
            &events,
            &recurring_events,
        );

        window.set_child(Some(&grid));

        window.connect_close_request(move |window| {
            if let Some(application) = window.application() {
                application.remove_window(window);
            }
            Inhibit(false)
        });

        Ok(Self {
            conn,
            window,
            grid,
            events,
            recurring_events,
            today,
            start_date,
            end_date,
            tx,
        })
    }
}