Use selection list instead of date picker for loading
This commit is contained in:
parent
72829730e6
commit
cc6dc16380
1 changed files with 78 additions and 5 deletions
83
src/main.rs
83
src/main.rs
|
|
@ -727,7 +727,7 @@ struct Report {
|
||||||
earnings_2: f64,
|
earnings_2: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Hash)]
|
||||||
struct ReportDate {
|
struct ReportDate {
|
||||||
pub year: u64,
|
pub year: u64,
|
||||||
pub month: u8,
|
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 {
|
impl Application for Glaurung {
|
||||||
type Message = Message;
|
type Message = Message;
|
||||||
type Theme = Theme;
|
type Theme = Theme;
|
||||||
|
|
@ -1148,11 +1223,9 @@ impl Application for Glaurung {
|
||||||
title: "Set report date",
|
title: "Set report date",
|
||||||
on_pick: Message::SetDate,
|
on_pick: Message::SetDate,
|
||||||
}))
|
}))
|
||||||
.push(component(DatePicker {
|
.push(component(ReportPicker {
|
||||||
label: "Load",
|
|
||||||
confirm: "Load",
|
|
||||||
title: "Load archived report",
|
|
||||||
on_pick: Message::Load,
|
on_pick: Message::Load,
|
||||||
|
reports: self.archive.keys().copied().collect(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if let Some(&last) = self.archive.keys().next_back() {
|
if let Some(&last) = self.archive.keys().next_back() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue