use gtk4 as gtk; use async_channel::Sender; use chrono::{Datelike, NaiveDate, Weekday}; use gtk::glib::signal::Inhibit; use gtk::prelude::*; use rusqlite::Connection; use std::rc::Rc; use crate::app::calendar; use crate::app::update::Msg; use crate::{db, model::event::Event}; pub struct App { pub window: Rc, pub grid: gtk::Grid, pub events: Vec, pub today: NaiveDate, pub start_date: NaiveDate, pub tx: Sender, } impl App { pub fn new(conn: Rc, app: >k::Application, tx: Sender) -> 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 events = db::list(&conn).unwrap_or(vec![]); let grid = calendar::create(tx.clone(), &today, &start_date, &events); window.set_child(Some(&grid)); window.connect_close_request(move |window| { if let Some(application) = window.application() { application.remove_window(window); } Inhibit(false) }); Self { window, grid, events, today, start_date, tx, } } }