Use selection list instead of date picker for loading

This commit is contained in:
traxys 2023-11-21 21:39:01 +01:00
parent 72829730e6
commit cc6dc16380

View file

@ -727,7 +727,7 @@ struct Report {
earnings_2: f64,
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Hash)]
struct ReportDate {
pub year: u64,
pub month: u8,
@ -926,6 +926,81 @@ impl EditState {
}
}
#[derive(Clone, Copy, Debug)]
enum ReportPickerMsg {
Open,
Close,
Pick,
Select(ReportDate),
}
struct ReportPicker<F> {
reports: Vec<ReportDate>,
on_pick: F,
}
#[derive(Default)]
struct ReportPickerState {
modal: bool,
pick: Option<ReportDate>,
}
impl<M, F> iced::widget::Component<M, Renderer> for ReportPicker<F>
where
F: FnMut(ReportDate) -> M,
{
type State = ReportPickerState;
type Event = ReportPickerMsg;
fn update(&mut self, state: &mut Self::State, event: Self::Event) -> Option<M> {
match event {
ReportPickerMsg::Open => {
state.modal = true;
}
ReportPickerMsg::Close => {
state.modal = false;
state.pick = None;
}
ReportPickerMsg::Pick => {
if let Some(r) = state.pick.take() {
state.modal = false;
return Some((self.on_pick)(r));
}
}
ReportPickerMsg::Select(o) => {
state.pick = Some(o);
}
}
None
}
fn view(&self, state: &Self::State) -> iced_aw::Element<'_, Self::Event, Renderer> {
let underlay = button("Load").on_press(ReportPickerMsg::Open);
let overlay = match state.modal {
true => Some(
card(
text("Load report"),
column![
selection_list(&self.reports, |_, v| ReportPickerMsg::Select(v))
.height(Length::Shrink),
button(text("Load")).on_press(ReportPickerMsg::Pick)
]
.spacing(5.),
)
.max_width(300.0)
.on_close(ReportPickerMsg::Close),
),
false => None,
};
modal(underlay, overlay)
.backdrop(ReportPickerMsg::Close)
.on_esc(ReportPickerMsg::Close)
.into()
}
}
impl Application for Glaurung {
type Message = Message;
type Theme = Theme;
@ -1148,11 +1223,9 @@ impl Application for Glaurung {
title: "Set report date",
on_pick: Message::SetDate,
}))
.push(component(DatePicker {
label: "Load",
confirm: "Load",
title: "Load archived report",
.push(component(ReportPicker {
on_pick: Message::Load,
reports: self.archive.keys().copied().collect(),
}));
if let Some(&last) = self.archive.keys().next_back() {