From 4dc64031b48bb847dff02836bcec1dcc0dc342c4 Mon Sep 17 00:00:00 2001 From: pjht Date: Tue, 30 May 2023 13:30:47 -0500 Subject: [PATCH] Extract roll view window to seperate file --- src/main.rs | 114 +++++------------------------------------------ src/new_roll.rs | 104 ++++++++++++++++++++++-------------------- src/roll_view.rs | 100 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 165 insertions(+), 153 deletions(-) create mode 100644 src/roll_view.rs diff --git a/src/main.rs b/src/main.rs index d189711..2551042 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,12 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release mod new_roll; +mod roll_view; -use eframe::{ - egui::{self, RichText, Window}, - epaint::Color32, -}; +use eframe::egui; use egui_datepicker::{Local, NaiveDate}; -use itertools::Itertools; use new_roll::NewRollWindow; +use roll_view::RollViewWindow; use serde::{Deserialize, Serialize}; fn main() -> Result<(), eframe::Error> { @@ -86,26 +84,10 @@ pub struct AppState { struct MyApp { state: AppState, - roll_views: Vec, + roll_views: Vec, new_roll_window: Option, } -struct RollViewState { - roll: usize, - confirm_delete: bool, - exp: u8, -} - -impl RollViewState { - fn new(roll: usize) -> Self { - Self { - roll, - confirm_delete: false, - exp: 0, - } - } -} - impl MyApp { fn new(cc: &eframe::CreationContext<'_>) -> Self { let rolls = eframe::get_value(cc.storage.unwrap(), "rolls").unwrap_or_else(|| { @@ -135,16 +117,18 @@ impl eframe::App for MyApp { ui.heading("Film Manager"); ui.label("Rolls:"); for (i, roll) in self.state.rolls.iter().enumerate() { - if ui.button(roll.short_str()).clicked() && self.roll_views.iter().find(|v| v.roll == i).is_none() { - self.roll_views.push(RollViewState::new(i)); + if ui.button(roll.short_str()).clicked() + && self.roll_views.iter().find(|v| v.roll() == i).is_none() + { + self.roll_views.push(RollViewWindow::new(i)); } } if ui.button("Add").clicked() && self.new_roll_window.is_none() { self.new_roll_window = Some(NewRollWindow::default()); } let mut to_close = Vec::new(); - for (i, roll_view_state) in self.roll_views.iter_mut().enumerate() { - if roll_view_window(ctx, roll_view_state, &mut self.state) { + for (i, roll_view_window) in self.roll_views.iter_mut().enumerate() { + if roll_view_window.draw(ctx, &mut self.state) { to_close.push(i); } } @@ -159,81 +143,3 @@ impl eframe::App for MyApp { }); } } - -fn roll_view_window( - ctx: &egui::Context, - win_state: &mut RollViewState, - app_state: &mut AppState, -) -> bool { - let mut open = true; - let window = - Window::new(format!("Roll {}", app_state.rolls[win_state.roll].id)).open(&mut open); - let deleted = window - .show(ctx, |ui| { - let roll = &mut app_state.rolls[win_state.roll]; - ui.label(format!("Name: {}", roll.name)); - ui.label(format!("Description: {}", roll.desc)); - ui.label(format!("Date: {}", roll.date.format("%Y-%m-%d"))); - ui.label("Exposures:"); - ui.horizontal_top(|ui| { - ui.vertical(|ui| { - for (i, chunk) in roll.exposures.iter().chunks(5).into_iter().enumerate() { - ui.horizontal(|ui| { - for (j, exp) in chunk.enumerate() { - let num = i * 5 + j; - let mut label = RichText::new(format!("{:02}", exp.num)); - if exp.printed { - if exp.damaged { - label = label.color(Color32::DARK_RED); - } else { - label = label.color(Color32::DARK_BLUE); - } - } - ui.selectable_value(&mut win_state.exp, num as u8, label); - } - }); - } - }); - ui.vertical(|ui| { - let exp = &mut roll.exposures[win_state.exp as usize]; - ui.checkbox(&mut exp.printed, "Printed"); - if !exp.printed { - exp.damaged = false; - } - if exp.printed { - ui.checkbox(&mut exp.damaged, "Damaged"); - } - }); - }); - if ui.button("Delete").clicked() { - win_state.confirm_delete = true; - } - if win_state.confirm_delete { - Window::new("Confirm delete") - .show(ctx, |ui| { - ui.heading(format!( - "Really delete roll {}?", - app_state.rolls[win_state.roll].id - )); - if ui.button("No").clicked() { - win_state.confirm_delete = false; - return false; - } - if ui.button("Yes").clicked() { - app_state.rolls.remove(win_state.roll); - return true; - } - false - }) - .unwrap() - .inner - .unwrap_or(false) - } else { - false - } - }) - .unwrap() - .inner - .unwrap_or(false); - !open || deleted -} diff --git a/src/new_roll.rs b/src/new_roll.rs index 5bea610..4b10767 100644 --- a/src/new_roll.rs +++ b/src/new_roll.rs @@ -1,5 +1,8 @@ -use chrono::{NaiveDate, Local}; -use eframe::{egui::{self, Window, Slider}, epaint::Color32}; +use chrono::{Local, NaiveDate}; +use eframe::{ + egui::{self, Slider, Window}, + epaint::Color32, +}; use egui_datepicker::DatePicker; use crate::{AppState, Roll}; @@ -28,55 +31,58 @@ impl Default for NewRollWindow { impl NewRollWindow { pub fn draw(&mut self, ctx: &egui::Context, app_state: &mut AppState) -> bool { - let mut open = true; - let close_req = Window::new("New Roll").open(&mut open).show(ctx, |ui| { - ui.horizontal(|ui| { - let label = ui.label("ID: "); - ui.text_edit_singleline(&mut self.id) + let mut open = true; + let close_req = Window::new("New Roll") + .open(&mut open) + .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("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, - )); - return true; + }); + 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, + )); + return true; + } } - } - if self.show_id_req_err { - ui.colored_label(Color32::DARK_RED, "Error: ID required"); - } - false - }).unwrap().inner.unwrap_or(false); + if self.show_id_req_err { + ui.colored_label(Color32::DARK_RED, "Error: ID required"); + } + false + }) + .unwrap() + .inner + .unwrap_or(false); !open || close_req } } - diff --git a/src/roll_view.rs b/src/roll_view.rs new file mode 100644 index 0000000..de7a682 --- /dev/null +++ b/src/roll_view.rs @@ -0,0 +1,100 @@ +use eframe::{ + egui::{self, RichText, Window}, + epaint::Color32, +}; +use itertools::Itertools; + +use crate::AppState; + +pub struct RollViewWindow { + roll: usize, + confirm_delete: bool, + exp: u8, +} + +impl RollViewWindow { + pub fn new(roll: usize) -> Self { + Self { + roll, + confirm_delete: false, + exp: 0, + } + } + + pub fn draw(&mut self, ctx: &egui::Context, app_state: &mut AppState) -> bool { + let mut open = true; + let window = Window::new(format!("Roll {}", app_state.rolls[self.roll].id)).open(&mut open); + let deleted = window + .show(ctx, |ui| { + let roll = &mut app_state.rolls[self.roll]; + ui.label(format!("Name: {}", roll.name)); + ui.label(format!("Description: {}", roll.desc)); + ui.label(format!("Date: {}", roll.date.format("%Y-%m-%d"))); + ui.label("Exposures:"); + ui.horizontal_top(|ui| { + ui.vertical(|ui| { + for (i, chunk) in roll.exposures.iter().chunks(5).into_iter().enumerate() { + ui.horizontal(|ui| { + for (j, exp) in chunk.enumerate() { + let num = i * 5 + j; + let mut label = RichText::new(format!("{:02}", exp.num)); + if exp.printed { + if exp.damaged { + label = label.color(Color32::DARK_RED); + } else { + label = label.color(Color32::DARK_BLUE); + } + } + ui.selectable_value(&mut self.exp, num as u8, label); + } + }); + } + }); + ui.vertical(|ui| { + let exp = &mut roll.exposures[self.exp as usize]; + ui.checkbox(&mut exp.printed, "Printed"); + if !exp.printed { + exp.damaged = false; + } + if exp.printed { + ui.checkbox(&mut exp.damaged, "Damaged"); + } + }); + }); + if ui.button("Delete").clicked() { + self.confirm_delete = true; + } + if self.confirm_delete { + Window::new("Confirm delete") + .show(ctx, |ui| { + ui.heading(format!( + "Really delete roll {}?", + app_state.rolls[self.roll].id + )); + if ui.button("No").clicked() { + self.confirm_delete = false; + return false; + } + if ui.button("Yes").clicked() { + app_state.rolls.remove(self.roll); + return true; + } + false + }) + .unwrap() + .inner + .unwrap_or(false) + } else { + false + } + }) + .unwrap() + .inner + .unwrap_or(false); + !open || deleted + } + + pub fn roll(&self) -> usize { + self.roll + } +}