Add buttons to interract with last month
This commit is contained in:
parent
78647a59e5
commit
140e70616a
1 changed files with 67 additions and 16 deletions
83
src/main.rs
83
src/main.rs
|
|
@ -11,7 +11,7 @@ use iced::{
|
||||||
font, subscription, theme,
|
font, subscription, theme,
|
||||||
widget::{
|
widget::{
|
||||||
button, column, component, horizontal_rule, horizontal_space, row, rule, scrollable, text,
|
button, column, component, horizontal_rule, horizontal_space, row, rule, scrollable, text,
|
||||||
text_input,
|
text_input, Row,
|
||||||
},
|
},
|
||||||
window, Alignment, Application, Command, Event, Length, Renderer, Settings, Theme,
|
window, Alignment, Application, Command, Event, Length, Renderer, Settings, Theme,
|
||||||
};
|
};
|
||||||
|
|
@ -635,6 +635,7 @@ enum Message {
|
||||||
EditEarings2(f64),
|
EditEarings2(f64),
|
||||||
SetDate(ReportDate),
|
SetDate(ReportDate),
|
||||||
Load(ReportDate),
|
Load(ReportDate),
|
||||||
|
InitFrom(ReportDate),
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Glaurung {
|
struct Glaurung {
|
||||||
|
|
@ -670,6 +671,24 @@ struct ReportDate {
|
||||||
pub month: u8,
|
pub month: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl std::ops::Add<u64> for ReportDate {
|
||||||
|
type Output = Self;
|
||||||
|
|
||||||
|
fn add(self, rhs: u64) -> Self::Output {
|
||||||
|
let mut new_month = self.month + (rhs % 12) as u8;
|
||||||
|
let mut new_year = self.year + rhs / 12;
|
||||||
|
if new_month > 12 {
|
||||||
|
new_month -= 12;
|
||||||
|
new_year += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Self {
|
||||||
|
year: new_year,
|
||||||
|
month: new_month,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for ReportDate {
|
impl std::fmt::Display for ReportDate {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "{}-{}", self.year, self.month)
|
write!(f, "{}-{}", self.year, self.month)
|
||||||
|
|
@ -754,6 +773,18 @@ impl Glaurung {
|
||||||
self.earnings_2 = report.earnings_2;
|
self.earnings_2 = report.earnings_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn init_from(&mut self, report: Report) {
|
||||||
|
self.recurring = report.recurring;
|
||||||
|
self.savings = report.savings;
|
||||||
|
self.earnings_1 = 0.;
|
||||||
|
self.earnings_2 = 0.;
|
||||||
|
self.variable = report
|
||||||
|
.variable
|
||||||
|
.into_keys()
|
||||||
|
.map(|k| (k, Default::default()))
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
|
||||||
fn report(&self) -> Report {
|
fn report(&self) -> Report {
|
||||||
Report {
|
Report {
|
||||||
savings: self.savings.clone(),
|
savings: self.savings.clone(),
|
||||||
|
|
@ -872,6 +903,11 @@ impl Application for Glaurung {
|
||||||
self.date = Some(d);
|
self.date = Some(d);
|
||||||
self.load(self.archive.get(&d).cloned().unwrap_or_default());
|
self.load(self.archive.get(&d).cloned().unwrap_or_default());
|
||||||
}
|
}
|
||||||
|
Message::InitFrom(d) => {
|
||||||
|
if let Some(report) = self.archive.get(&d) {
|
||||||
|
self.init_from(report.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Command::none()
|
Command::none()
|
||||||
|
|
@ -986,6 +1022,35 @@ impl Application for Glaurung {
|
||||||
None => "No month set".to_string(),
|
None => "No month set".to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut save_buttons = Row::new();
|
||||||
|
|
||||||
|
if let Some(&last) = self.archive.keys().next_back() {
|
||||||
|
let next_month = last + 1;
|
||||||
|
save_buttons = save_buttons.push(
|
||||||
|
button(text(&format!("Archive as {next_month}")))
|
||||||
|
.on_press(Message::SetDate(next_month)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
save_buttons = save_buttons
|
||||||
|
.push(component(DatePicker {
|
||||||
|
label: "Archive",
|
||||||
|
confirm: "Archive",
|
||||||
|
title: "Set report date",
|
||||||
|
on_pick: Message::SetDate,
|
||||||
|
}))
|
||||||
|
.push(component(DatePicker {
|
||||||
|
label: "Load",
|
||||||
|
confirm: "Load",
|
||||||
|
title: "Load archived report",
|
||||||
|
on_pick: Message::Load,
|
||||||
|
}));
|
||||||
|
|
||||||
|
if let Some(&last) = self.archive.keys().next_back() {
|
||||||
|
save_buttons = save_buttons
|
||||||
|
.push(button(text("Init from last month")).on_press(Message::InitFrom(last)));
|
||||||
|
}
|
||||||
|
|
||||||
scrollable(
|
scrollable(
|
||||||
column![
|
column![
|
||||||
text(date).size(TEXT_H1),
|
text(date).size(TEXT_H1),
|
||||||
|
|
@ -1039,21 +1104,7 @@ impl Application for Glaurung {
|
||||||
on_add: Message::AddSaving,
|
on_add: Message::AddSaving,
|
||||||
}),
|
}),
|
||||||
per_person,
|
per_person,
|
||||||
row![
|
save_buttons.spacing(5),
|
||||||
component(DatePicker {
|
|
||||||
label: "Archive",
|
|
||||||
confirm: "Archive",
|
|
||||||
title: "Set report date",
|
|
||||||
on_pick: Message::SetDate
|
|
||||||
}),
|
|
||||||
component(DatePicker {
|
|
||||||
label: "Load",
|
|
||||||
confirm: "Load",
|
|
||||||
title: "Load archived report",
|
|
||||||
on_pick: Message::Load
|
|
||||||
})
|
|
||||||
]
|
|
||||||
.spacing(5)
|
|
||||||
]
|
]
|
||||||
.align_items(Alignment::Center)
|
.align_items(Alignment::Center)
|
||||||
.padding(15),
|
.padding(15),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue