use chrono::{Local, NaiveDate}; use eframe::{ egui::{self, Slider, Window}, epaint::Color32, }; use egui_datepicker::DatePicker; use crate::{AppState, roll::Roll}; pub struct NewRollWindow { id: String, name: String, desc: String, date: NaiveDate, exps: u8, show_id_req_err: bool, } impl Default for NewRollWindow { fn default() -> Self { Self { id: String::new(), name: String::new(), desc: String::new(), date: Local::now().date_naive(), exps: 24, show_id_req_err: false, } } } impl NewRollWindow { pub fn draw(&mut self, ctx: &egui::Context, app_state: &mut AppState) -> bool { let mut close_unclicked = true; let mut close_window = false; Window::new("New Roll") .open(&mut close_unclicked) .show(ctx, |ui| { ui.horizontal(|ui| { let label = ui.label("ID: "); ui.text_edit_singleline(&mut self.id).labelled_by(label.id); }); ui.horizontal(|ui| { let label = ui.label("Name: "); ui.text_edit_singleline(&mut self.name) .labelled_by(label.id); }); let desc_label = ui.label("Description: "); ui.text_edit_multiline(&mut self.desc) .labelled_by(desc_label.id); ui.horizontal(|ui| { let label = ui.label("Date: "); ui.add( DatePicker::new("new_roll_date", &mut self.date) .sunday_first(true) .highlight_weekend(false), ) .labelled_by(label.id); }); ui.horizontal(|ui| { let label = ui.label("Num exposures: "); ui.add(Slider::new(&mut self.exps, 1..=50).step_by(1.0)) .labelled_by(label.id); }); if ui.button("Submit").clicked() { if self.id.is_empty() { self.show_id_req_err = true; } else { app_state.rolls.push(Roll::new( self.id.clone(), self.name.clone(), self.desc.clone(), self.date, self.exps, )); close_window = true; } } if self.show_id_req_err { ui.colored_label(Color32::DARK_RED, "Error: ID required"); } }); !close_unclicked || close_window } }