Skip to content

Commit b21526d

Browse files
committed
refactor(export dialog): replace adw::Toast with adw::AlertDialog, add more context
1 parent a71a399 commit b21526d

1 file changed

Lines changed: 49 additions & 6 deletions

File tree

src/dialogs/exportable_apps_dialog.rs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -365,14 +365,57 @@ impl ExportableAppsDialog {
365365
reaction!(task.status(), move |status: crate::models::TaskStatus| {
366366
if status == crate::models::TaskStatus::Failed {
367367
let error_ref = task.error();
368-
let error_msg = if let Some(err) = error_ref.as_ref() {
369-
format!("Failed to export '{}': {}", binary_name_clone, err)
368+
let heading = format!("{} '{}'", gettext("Failed to export"), binary_name_clone);
369+
370+
let (error_body, extra_child) = if let Some(err) = error_ref.as_ref() {
371+
if let Some(crate::backends::distrobox::Error::CommandFailed {
372+
stderr, ..
373+
}) = err.downcast_ref::<crate::backends::distrobox::Error>()
374+
{
375+
let label = gtk::Label::builder()
376+
.label(stderr.trim())
377+
.wrap(true)
378+
.margin_start(12)
379+
.margin_end(12)
380+
.margin_top(12)
381+
.margin_bottom(12)
382+
.selectable(true)
383+
.build();
384+
label.add_css_class("monospace");
385+
386+
let scroll = gtk::ScrolledWindow::builder()
387+
.child(&label)
388+
.min_content_height(120)
389+
.max_content_height(350)
390+
.propagate_natural_height(true)
391+
.min_content_width(300)
392+
.build();
393+
scroll.add_css_class("card");
394+
395+
(
396+
gettext("DistroShelf failed to export the binary because:"),
397+
Some(scroll.upcast::<gtk::Widget>()),
398+
)
399+
} else {
400+
(format!("{}", err), None)
401+
}
370402
} else {
371-
format!("Failed to export '{}'", binary_name_clone)
403+
(gettext("Unknown error occurred"), None)
372404
};
373-
let toast = adw::Toast::new(&error_msg);
374-
toast.set_timeout(5);
375-
this.imp().toast_overlay.add_toast(toast);
405+
406+
let dialog = adw::AlertDialog::builder()
407+
.heading(&heading)
408+
.body(&error_body)
409+
.close_response("close")
410+
.default_response("close")
411+
.build();
412+
413+
if let Some(child) = extra_child {
414+
dialog.set_extra_child(Some(&child));
415+
}
416+
417+
dialog.add_response("close", &gettext("Close"));
418+
dialog.present(Some(&this));
376419
}
377420
});
378421
}

0 commit comments

Comments
 (0)