handle undefined mime type errors with download status page, optional rename constructors from new to build

This commit is contained in:
yggverse 2025-01-17 00:52:31 +02:00
parent fe5eeb04f9
commit 14159d54e1
7 changed files with 49 additions and 15 deletions

View File

@ -235,7 +235,7 @@ impl Page {
}, },
Response::Failure(failure) => match failure { Response::Failure(failure) => match failure {
Failure::Status { message } Failure::Status { message }
| Failure::Mime { message }
| Failure::Error { message } => { | Failure::Error { message } => {
// Update widget // Update widget
let status_page = content.to_status_failure(); let status_page = content.to_status_failure();
@ -245,6 +245,18 @@ impl Page {
status.replace(Status::Failure { time: now() }); status.replace(Status::Failure { time: now() });
title.replace(status_page.title()); title.replace(status_page.title());
// Update window
browser_action.update.activate(Some(&id));
}
Failure::Mime { base, mime, message } => {
// Update widget
let status_page = content.to_status_mime(&mime, Some((&tab_action, &base)));
status_page.set_description(Some(&message));
// Update meta
status.replace(Status::Failure { time: now() });
title.replace(status_page.title());
// Update window // Update window
browser_action.update.activate(Some(&id)); browser_action.update.activate(Some(&id));
} }

View File

@ -85,6 +85,8 @@ pub fn handle(
}) })
} }
mime => callback(Response::Failure(Failure::Mime { mime => callback(Response::Failure(Failure::Mime {
base,
mime: mime.to_string(),
message: format!("Content type `{mime}` yet not supported"), message: format!("Content type `{mime}` yet not supported"),
})), })),
} // @TODO handle `None` } // @TODO handle `None`

View File

@ -1,5 +1,19 @@
use gtk::glib::Uri;
/// Failure type for client `Response`
pub enum Failure { pub enum Failure {
Status { message: String }, Status {
Mime { message: String }, message: String,
Error { message: String }, },
/// This failure type provides `base` member to build Download page
/// for the constructed request [Uri](https://docs.gtk.org/glib/struct.Uri.html)
Mime {
base: Uri,
mime: String,
message: String,
},
/// Common error type
Error {
message: String,
},
} }

View File

@ -10,7 +10,7 @@ use adw::StatusPage;
use gtk::{ use gtk::{
gdk::Paintable, gdk::Paintable,
gio::{Cancellable, File}, gio::{Cancellable, File},
glib::{GString, Uri}, glib::Uri,
prelude::{BoxExt, IsA, WidgetExt}, prelude::{BoxExt, IsA, WidgetExt},
Box, Orientation, Box, Orientation,
}; };
@ -77,10 +77,10 @@ impl Content {
pub fn to_status_mime( pub fn to_status_mime(
&self, &self,
mime: &str, mime: &str,
download: Option<(Rc<TabAction>, GString)>, download: Option<(&Rc<TabAction>, &Uri)>,
) -> StatusPage { ) -> StatusPage {
self.clean(); self.clean();
let status = status::mime::new(mime, download); let status = status::mime::build(mime, download);
self.g_box.append(&status); self.g_box.append(&status);
status status
} }
@ -90,7 +90,7 @@ impl Content {
/// * action removes previous children component from `Self` /// * action removes previous children component from `Self`
pub fn to_status_identity(&self) -> StatusPage { pub fn to_status_identity(&self) -> StatusPage {
self.clean(); self.clean();
let status = status::identity::new(self.tab_action.clone()); let status = status::identity::build(self.tab_action.clone());
self.g_box.append(&status); self.g_box.append(&status);
status status
} }
@ -100,7 +100,7 @@ impl Content {
/// * action removes previous children component from `Self` /// * action removes previous children component from `Self`
pub fn to_status_loading(&self, show_with_delay: Option<Duration>) -> StatusPage { pub fn to_status_loading(&self, show_with_delay: Option<Duration>) -> StatusPage {
self.clean(); self.clean();
let status = status::loading::new(show_with_delay); let status = status::loading::build(show_with_delay);
self.g_box.append(&status); self.g_box.append(&status);
status status
} }

View File

@ -13,7 +13,7 @@ const DEFAULT_BUTTON_CLASS: &str = "suggested-action";
/// Create new default preset for `Identity` /// Create new default preset for `Identity`
/// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html) /// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html)
pub fn new(action: Rc<Action>) -> StatusPage { pub fn build(action: Rc<Action>) -> StatusPage {
// Init certificate selection // Init certificate selection
let button = &Button::builder() let button = &Button::builder()
.css_classes([DEFAULT_BUTTON_CLASS]) .css_classes([DEFAULT_BUTTON_CLASS])

View File

@ -11,7 +11,7 @@ const DEFAULT_TITLE: &str = "Loading..";
/// Create new default preset for loading /// Create new default preset for loading
/// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html) /// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html)
pub fn new(show_with_delay: Option<Duration>) -> StatusPage { pub fn build(show_with_delay: Option<Duration>) -> StatusPage {
// Init spinner component // Init spinner component
let spinner = Spinner::builder() let spinner = Spinner::builder()
.width_request(SPINNER_SIZE) .width_request(SPINNER_SIZE)

View File

@ -1,11 +1,11 @@
use super::TabAction; use super::TabAction;
use adw::StatusPage; use adw::StatusPage;
use gtk::{glib::GString, prelude::ButtonExt, Align, Button}; use gtk::{glib::Uri, prelude::ButtonExt, Align, Button};
use std::rc::Rc; use std::rc::Rc;
/// Create new default `GObject` preset for mime issue /// Create new default `GObject` preset for mime issue
/// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html) /// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html)
pub fn new(mime: &str, download: Option<(Rc<TabAction>, GString)>) -> StatusPage { pub fn build(mime: &str, download: Option<(&Rc<TabAction>, &Uri)>) -> StatusPage {
let status_page = StatusPage::builder() let status_page = StatusPage::builder()
.description(format!("Content type `{mime}` not supported!")) .description(format!("Content type `{mime}` not supported!"))
.icon_name("dialog-question-symbolic") .icon_name("dialog-question-symbolic")
@ -20,8 +20,14 @@ pub fn new(mime: &str, download: Option<(Rc<TabAction>, GString)>) -> StatusPage
.tooltip_text("Download as file to open with external application") .tooltip_text("Download as file to open with external application")
.build(); .build();
button.connect_clicked(move |_| { button.connect_clicked({
action.load.activate(Some(request.as_str()), true); let action = action.clone();
let request = request.clone();
move |_| {
action
.load
.activate(Some(&format!("download:{}", request.to_string())), true);
}
}); });
status_page.set_child(Some(&button)); status_page.set_child(Some(&button));