use gtk4 as gtk; use async_channel::Sender; use chrono::NaiveDate; use gtk::glib; use gtk::prelude::*; use rusqlite::Connection; use std::rc::Rc; use uuid::Uuid; use crate::{app::update, app::update::Msg, db, model::event}; pub async fn show( conn: Rc, tx: Sender, window: Rc, date: NaiveDate, ) { let dialog = gtk::Dialog::builder() .transient_for(&*window) .modal(true) .title("Ajouter") .css_classes(vec!["g-Form".to_string()]) .build(); let content_area = dialog.content_area(); let vbox = gtk::Box::builder() .orientation(gtk::Orientation::Vertical) .build(); vbox.add_css_class("g-Form__Inputs"); content_area.append(&vbox); let name = entry(""); vbox.append(&label("Événement")); vbox.append(&name); let date = entry(&date.format(event::DATE_FORMAT).to_string()); vbox.append(&label("Jour")); vbox.append(&date); let start = entry(""); vbox.append(&label("Début")); vbox.append(&start); let end = entry(""); vbox.append(&label("Fin")); vbox.append(&end); let button = gtk::Button::with_label("Créer"); vbox.append(&button); button.connect_clicked(glib::clone!(@weak dialog => move |_| { match event::validate(Uuid::new_v4(), date.buffer().text(), name.buffer().text(), start.buffer().text(), end.buffer().text()) { Some(event) => { match db::insert(&conn, &event) { Ok(_) => { update::send(tx.clone(), Msg::AddEvent { event: event }); dialog.close() }, Err(_) => () } }, None => () } })); dialog.run_future().await; } fn entry(text: &str) -> gtk::Entry { gtk::Entry::builder().text(text).margin_bottom(10).build() } fn label(text: &str) -> gtk::Label { gtk::Label::builder() .label(text) .halign(gtk::Align::Start) .margin_bottom(5) .build() }