aboutsummaryrefslogtreecommitdiff
path: root/src/app/form.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/form.rs')
-rw-r--r--src/app/form.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/app/form.rs b/src/app/form.rs
new file mode 100644
index 0000000..fc3dc83
--- /dev/null
+++ b/src/app/form.rs
@@ -0,0 +1,79 @@
+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 crate::{app::update, app::update::Msg, db, model::event};
+
+pub async fn dialog(
+ conn: Rc<Connection>,
+ tx: Sender<Msg>,
+ window: Rc<gtk::ApplicationWindow>,
+ 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(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()
+}