diff options
Diffstat (limited to 'src/gui/app.rs')
-rw-r--r-- | src/gui/app.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/gui/app.rs b/src/gui/app.rs new file mode 100644 index 0000000..ebaceb3 --- /dev/null +++ b/src/gui/app.rs @@ -0,0 +1,76 @@ +use gtk4 as gtk; + +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>, + pub repeated_events: Vec<Event>, + pub today: NaiveDate, + pub start_date: NaiveDate, + pub end_date: NaiveDate, + pub tx: Sender<Msg>, +} + +impl App { + pub fn new(conn: Rc<Connection>, app: >k::Application, tx: Sender<Msg>) -> 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_repeated_between(&conn, start_date, end_date).unwrap_or_default(); + let repeated_events = db::list_repeated(&conn).unwrap_or_default(); + + let grid = calendar::create( + tx.clone(), + today, + start_date, + end_date, + &events, + &repeated_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 { + conn, + window, + grid, + events, + repeated_events, + today, + start_date, + end_date, + tx, + } + } +} |