diff options
author | Joris | 2022-02-26 18:57:55 +0100 |
---|---|---|
committer | Joris | 2022-02-26 18:57:55 +0100 |
commit | f9f49285c5ecc76d3edfb0a54ffab53c2e296d7f (patch) | |
tree | f77f9b625446de7f0b9de1553fc52d702c4cbc69 /src/app/form | |
parent | 2d80413609130f1c121dcae39a150a27dd9f02ea (diff) |
Apply linter advices
Diffstat (limited to 'src/app/form')
-rw-r--r-- | src/app/form/mod.rs | 124 | ||||
-rw-r--r-- | src/app/form/repetition.rs | 151 |
2 files changed, 0 insertions, 275 deletions
diff --git a/src/app/form/mod.rs b/src/app/form/mod.rs deleted file mode 100644 index 9cb6ba7..0000000 --- a/src/app/form/mod.rs +++ /dev/null @@ -1,124 +0,0 @@ -mod repetition; - -use gtk4 as gtk; - -use gtk::glib; -use gtk::prelude::*; - -use crate::{ - app::{update, update::Msg, App}, - db, - model::{event, event::Event}, -}; - -pub async fn show(app: &App, event: Event, is_new: bool) { - let dialog = gtk::Dialog::builder() - .transient_for(&*app.window) - .modal(true) - .title(if is_new { "Ajouter" } else { "Modifier" }) - .css_classes(vec!["g-Form".to_string()]) - .build(); - - let content_area = dialog.content_area(); - - let lines = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .build(); - content_area.append(&lines); - - let columns = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .build(); - columns.add_css_class("g-Form__Columns"); - lines.append(&columns); - - // First column - - let column1 = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .build(); - column1.add_css_class("g-Form__Inputs"); - columns.append(&column1); - - let name = entry(&event.name); - column1.append(&label("Événement")); - column1.append(&name); - - let date = entry(&event.date.format(event::DATE_FORMAT).to_string()); - column1.append(&label("Jour")); - column1.append(&date); - - let start = entry( - &event - .start - .map(event::pprint_time) - .unwrap_or("".to_string()), - ); - column1.append(&label("Début")); - column1.append(&start); - - let end = entry(&event.end.map(event::pprint_time).unwrap_or("".to_string())); - column1.append(&label("Fin")); - column1.append(&end); - - // Second column - - let repetition_model = repetition::view(&event); - columns.append(&repetition_model.view); - - // Buttons - - let button = gtk::Button::builder() - .label(if is_new { "Créer" } else { "Modifier" }) - .margin_bottom(10) - .build(); - lines.append(&button); - let conn = app.conn.clone(); - let tx = app.tx.clone(); - button.connect_clicked(glib::clone!(@weak dialog, @strong event => move |_| { - let repetition = repetition::validate(&repetition_model).clone(); - match event::validate(event.id, date.buffer().text(), name.buffer().text(), start.buffer().text(), end.buffer().text(), repetition) { - Some(new) => { - match if is_new { db::insert(&conn, &new) } else { db::update(&conn, &new) } { - Ok(_) => { - let msg = if is_new { Msg::AddEvent { new } } else { Msg::UpdateEvent { old: event.clone(), new } }; - update::send(tx.clone(), msg); - dialog.close() - }, - Err(err) => eprintln!("Error when upserting event: {err}") - } - }, - None => eprintln!("Event is not valid: {event:?}") - } - })); - - if !is_new { - let button = gtk::Button::builder().label("Supprimer").build(); - lines.append(&button); - let conn = app.conn.clone(); - let tx = app.tx.clone(); - button.connect_clicked(glib::clone!(@weak dialog => move |_| { - match db::delete(&conn, &event.id) { - Ok(_) => { - update::send(tx.clone(), Msg::DeleteEvent { event: event.clone() }); - dialog.close() - }, - Err(_) => () - } - })); - } - - 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() -} diff --git a/src/app/form/repetition.rs b/src/app/form/repetition.rs deleted file mode 100644 index 87c8d84..0000000 --- a/src/app/form/repetition.rs +++ /dev/null @@ -1,151 +0,0 @@ -use gtk4 as gtk; - -use chrono::{Weekday, Weekday::*}; -use gtk::prelude::*; - -use crate::{ - model::event::Event, - model::{ - repetition, - repetition::{DayOfMonth, Repetition}, - }, -}; - -static WEEKDAYS_STR: [&str; 7] = [ - "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche", -]; - -static WEEKDAYS: [Weekday; 7] = [Mon, Tue, Wed, Thu, Fri, Sat, Sun]; - -pub struct Model { - pub view: gtk::Box, - no_radio: gtk::CheckButton, - day_interval_radio: gtk::CheckButton, - day_interval_entry: gtk::Entry, - monthly_radio: gtk::CheckButton, - monthly_entry: gtk::Entry, - first_day_radio: gtk::CheckButton, - first_day_dropdown: gtk::DropDown, - yearly_radio: gtk::CheckButton, -} - -pub fn view(event: &Event) -> Model { - let view = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .build(); - view.add_css_class("g-Form__Inputs"); - - view.append(&label("Répétition")); - - let no_radio = gtk::CheckButton::builder() - .label("Non") - .active(event.repetition.is_none()) - .build(); - view.append(&no_radio); - - let default = match event.repetition { - Some(Repetition::Daily { period }) => period.to_string(), - _ => "".to_string(), - }; - let day_interval_entry = gtk::Entry::builder().text(&default).build(); - let (day_interval_box, day_interval_radio) = radio_input( - &no_radio, - !default.is_empty(), - &day_interval_entry, - "Interval de jours", - ); - view.append(&day_interval_box); - - let default = match event.repetition { - Some(Repetition::Monthly { - day: DayOfMonth::Day { day }, - }) => day.to_string(), - _ => "".to_string(), - }; - let monthly_entry = gtk::Entry::builder().text(&default).build(); - let (monthly_box, monthly_radio) = - radio_input(&no_radio, !default.is_empty(), &monthly_entry, "Mensuel"); - view.append(&monthly_box); - - let (active, default) = match event.repetition { - Some(Repetition::Monthly { - day: DayOfMonth::Weekday { weekday }, - }) => (true, weekday), - _ => (false, Mon), - }; - let first_day_dropdown = gtk::DropDown::from_strings(&WEEKDAYS_STR); - first_day_dropdown - .set_selected(WEEKDAYS.iter().position(|d| d == &default).unwrap_or(0) as u32); - let (first_day_of_month_box, first_day_radio) = - radio_input(&no_radio, active, &first_day_dropdown, "1er jour du mois"); - view.append(&first_day_of_month_box); - - let yearly_radio = gtk::CheckButton::builder() - .group(&no_radio) - .label("Annuel") - .active(event.repetition == Some(Repetition::Yearly)) - .build(); - view.append(&yearly_radio); - - Model { - view, - no_radio, - day_interval_radio, - day_interval_entry, - monthly_radio, - monthly_entry, - first_day_radio, - first_day_dropdown, - yearly_radio, - } -} - -fn radio_input( - radio_group: &impl IsA<gtk::CheckButton>, - active: bool, - input: &impl IsA<gtk::Widget>, - text: &str, -) -> (gtk::Box, gtk::CheckButton) { - let radio_box = gtk::Box::builder().build(); - let radio = gtk::CheckButton::builder() - .group(radio_group) - .label(text) - .active(active) - .build(); - radio_box.append(&radio); - input.add_css_class("g-Form__RadioInput"); - radio_box.append(input); - (radio_box, radio) -} - -fn label(text: &str) -> gtk::Label { - gtk::Label::builder() - .label(text) - .halign(gtk::Align::Start) - .margin_bottom(5) - .build() -} - -pub fn validate(model: &Model) -> Option<Repetition> { - if model.no_radio.is_active() { - None - } else if model.day_interval_radio.is_active() { - repetition::validate_day(&model.day_interval_entry.buffer().text()) - .map(|d| Repetition::Daily { period: d }) - } else if model.monthly_radio.is_active() { - repetition::validate_day(&model.monthly_entry.buffer().text()).map(|d| { - Repetition::Monthly { - day: DayOfMonth::Day { day: d }, - } - }) - } else if model.first_day_radio.is_active() { - let weekday = WEEKDAYS[model.first_day_dropdown.selected() as usize]; - Some(Repetition::Monthly { - day: DayOfMonth::Weekday { weekday }, - }) - } else if model.yearly_radio.is_active() { - Some(Repetition::Yearly) - } else { - None - } -} |