Extract roll view window to seperate file

This commit is contained in:
pjht 2023-05-30 13:30:47 -05:00
parent d0c8ac405c
commit 4dc64031b4
Signed by: pjht
GPG Key ID: CA239FC6934E6F3A
3 changed files with 165 additions and 153 deletions

View File

@ -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<RollViewState>,
roll_views: Vec<RollViewWindow>,
new_roll_window: Option<NewRollWindow>,
}
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
}

View File

@ -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
}
}

100
src/roll_view.rs Normal file
View File

@ -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
}
}