diff --git a/crates/musicus/res/ui/medium_editor.ui b/crates/musicus/res/ui/medium_editor.ui index a07b16c..00acda4 100644 --- a/crates/musicus/res/ui/medium_editor.ui +++ b/crates/musicus/res/ui/medium_editor.ui @@ -165,5 +165,77 @@ + + + error + + + vertical + + + false + false + + + Error + + + + + + + dialog-error-symbolic + Error + + + Try again + true + true + center + center + + + + + + + + + + + disc_error + + + vertical + + + false + false + + + Error + + + + + + + action-unavailable-symbolic + Error + + + Cancel + true + true + center + center + + + + + + + + diff --git a/crates/musicus/src/import/medium_editor.rs b/crates/musicus/src/import/medium_editor.rs index cef745a..c2b1027 100644 --- a/crates/musicus/src/import/medium_editor.rs +++ b/crates/musicus/src/import/medium_editor.rs @@ -22,6 +22,8 @@ pub struct MediumEditor { done: gtk::Image, name_entry: gtk::Entry, publish_switch: gtk::Switch, + status_page: libadwaita::StatusPage, + disc_status_page: libadwaita::StatusPage, track_set_list: Rc, track_sets: RefCell>, } @@ -42,6 +44,10 @@ impl Screen>, ()> for MediumEditor { get_widget!(builder, gtk::Switch, publish_switch); get_widget!(builder, gtk::Button, add_button); get_widget!(builder, gtk::Frame, frame); + get_widget!(builder, libadwaita::StatusPage, status_page); + get_widget!(builder, gtk::Button, try_again_button); + get_widget!(builder, libadwaita::StatusPage, disc_status_page); + get_widget!(builder, gtk::Button, cancel_button); let list = List::new(); frame.set_child(Some(&list.widget)); @@ -55,6 +61,8 @@ impl Screen>, ()> for MediumEditor { done, name_entry, publish_switch, + status_page, + disc_status_page, track_set_list: list, track_sets: RefCell::new(Vec::new()), }); @@ -69,10 +77,10 @@ impl Screen>, ()> for MediumEditor { this.widget.set_visible_child_name("loading"); spawn!(@clone this, async move { match this.save().await { - Ok(_) => (), + Ok(_) => this.handle.pop(Some(())), Err(err) => { - // TODO: Display errors. - println!("{:?}", err); + this.status_page.set_description(Some(&err.to_string())); + this.widget.set_visible_child_name("error"); } } }); @@ -118,11 +126,19 @@ impl Screen>, ()> for MediumEditor { row.upcast() })); + try_again_button.connect_clicked(clone!(@weak this => move |_| { + this.widget.set_visible_child_name("content"); + })); + + cancel_button.connect_clicked(clone!(@weak this => move |_| { + this.handle.pop(None); + })); + spawn!(@clone this, async move { match this.source.copy().await { - Err(error) => { - // TODO: Present error. - println!("Failed to copy source: {}", error); + Err(err) => { + this.disc_status_page.set_description(Some(&err.to_string())); + this.widget.set_visible_child_name("disc_error"); }, Ok(_) => { this.done_stack.set_visible_child(&this.done);