aboutsummaryrefslogtreecommitdiff
path: root/src/app/update.rs
blob: 288ec51b71758238f48723a4ab0775906835afb2 (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
use gtk4 as gtk;

use async_channel::{Receiver, Sender};
use chrono::NaiveDate;
use gtk::prelude::*;
use rusqlite::Connection;
use std::rc::Rc;

use crate::app::calendar;
use crate::app::form;
use crate::app::utils;
use crate::app::App;
use crate::model::event::Event;

pub fn send(tx: Sender<Msg>, msg: Msg) {
    utils::spawn(async move {
        let _ = tx.send(msg).await;
    })
}

pub enum Msg {
    ShowAddForm { date: NaiveDate },
    AddEvent { event: Event },
}

pub async fn event_handler(conn: Rc<Connection>, rx: Receiver<Msg>, tx: Sender<Msg>, mut app: App) {
    while let Ok(msg) = rx.recv().await {
        match msg {
            Msg::ShowAddForm { date } => {
                form::dialog(Rc::clone(&conn), tx.clone(), Rc::clone(&app.window), date).await;
            }
            Msg::AddEvent { event } => {
                let date = event.date.clone();

                let d = date.signed_duration_since(app.start_date).num_days();

                app.events.push(event);

                let col = (d % 7) as i32;
                let row = 1 + (d / 7) as i32;

                app.grid.attach(
                    &calendar::day_entry(tx.clone(), &date, &app.today, &app.events),
                    col,
                    row,
                    1,
                    1,
                );
            }
        }
    }
}