Extract roll view window to seperate file
This commit is contained in:
parent
d0c8ac405c
commit
4dc64031b4
114
src/main.rs
114
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<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
|
||||
}
|
||||
|
104
src/new_roll.rs
104
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
|
||||
}
|
||||
}
|
||||
|
||||
|
100
src/roll_view.rs
Normal file
100
src/roll_view.rs
Normal 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
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user