From 14159d54e1629770025e0a8431f60d01b69afc02 Mon Sep 17 00:00:00 2001 From: yggverse Date: Fri, 17 Jan 2025 00:52:31 +0200 Subject: [PATCH] handle undefined mime type errors with download status page, optional rename constructors from `new` to `build` --- src/app/browser/window/tab/item/page.rs | 14 ++++++++++++- .../tab/item/page/client/driver/gemini.rs | 2 ++ .../tab/item/page/client/response/failure.rs | 20 ++++++++++++++++--- .../browser/window/tab/item/page/content.rs | 10 +++++----- .../tab/item/page/content/status/identity.rs | 2 +- .../tab/item/page/content/status/loading.rs | 2 +- .../tab/item/page/content/status/mime.rs | 14 +++++++++---- 7 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/app/browser/window/tab/item/page.rs b/src/app/browser/window/tab/item/page.rs index 48f2f63b..d3bb35bb 100644 --- a/src/app/browser/window/tab/item/page.rs +++ b/src/app/browser/window/tab/item/page.rs @@ -235,7 +235,7 @@ impl Page { }, Response::Failure(failure) => match failure { Failure::Status { message } - | Failure::Mime { message } + | Failure::Error { message } => { // Update widget let status_page = content.to_status_failure(); @@ -245,6 +245,18 @@ impl Page { status.replace(Status::Failure { time: now() }); 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 browser_action.update.activate(Some(&id)); } diff --git a/src/app/browser/window/tab/item/page/client/driver/gemini.rs b/src/app/browser/window/tab/item/page/client/driver/gemini.rs index 698b5165..f33ccf3e 100644 --- a/src/app/browser/window/tab/item/page/client/driver/gemini.rs +++ b/src/app/browser/window/tab/item/page/client/driver/gemini.rs @@ -85,6 +85,8 @@ pub fn handle( }) } mime => callback(Response::Failure(Failure::Mime { + base, + mime: mime.to_string(), message: format!("Content type `{mime}` yet not supported"), })), } // @TODO handle `None` diff --git a/src/app/browser/window/tab/item/page/client/response/failure.rs b/src/app/browser/window/tab/item/page/client/response/failure.rs index 1549237a..3417086e 100644 --- a/src/app/browser/window/tab/item/page/client/response/failure.rs +++ b/src/app/browser/window/tab/item/page/client/response/failure.rs @@ -1,5 +1,19 @@ +use gtk::glib::Uri; + +/// Failure type for client `Response` pub enum Failure { - Status { message: String }, - Mime { message: String }, - Error { message: String }, + Status { + 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, + }, } diff --git a/src/app/browser/window/tab/item/page/content.rs b/src/app/browser/window/tab/item/page/content.rs index 50eeccd8..b7a0b8f2 100644 --- a/src/app/browser/window/tab/item/page/content.rs +++ b/src/app/browser/window/tab/item/page/content.rs @@ -10,7 +10,7 @@ use adw::StatusPage; use gtk::{ gdk::Paintable, gio::{Cancellable, File}, - glib::{GString, Uri}, + glib::Uri, prelude::{BoxExt, IsA, WidgetExt}, Box, Orientation, }; @@ -77,10 +77,10 @@ impl Content { pub fn to_status_mime( &self, mime: &str, - download: Option<(Rc, GString)>, + download: Option<(&Rc, &Uri)>, ) -> StatusPage { self.clean(); - let status = status::mime::new(mime, download); + let status = status::mime::build(mime, download); self.g_box.append(&status); status } @@ -90,7 +90,7 @@ impl Content { /// * action removes previous children component from `Self` pub fn to_status_identity(&self) -> StatusPage { 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); status } @@ -100,7 +100,7 @@ impl Content { /// * action removes previous children component from `Self` pub fn to_status_loading(&self, show_with_delay: Option) -> StatusPage { self.clean(); - let status = status::loading::new(show_with_delay); + let status = status::loading::build(show_with_delay); self.g_box.append(&status); status } diff --git a/src/app/browser/window/tab/item/page/content/status/identity.rs b/src/app/browser/window/tab/item/page/content/status/identity.rs index a821062f..2b68bd71 100644 --- a/src/app/browser/window/tab/item/page/content/status/identity.rs +++ b/src/app/browser/window/tab/item/page/content/status/identity.rs @@ -13,7 +13,7 @@ const DEFAULT_BUTTON_CLASS: &str = "suggested-action"; /// Create new default preset for `Identity` /// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html) -pub fn new(action: Rc) -> StatusPage { +pub fn build(action: Rc) -> StatusPage { // Init certificate selection let button = &Button::builder() .css_classes([DEFAULT_BUTTON_CLASS]) diff --git a/src/app/browser/window/tab/item/page/content/status/loading.rs b/src/app/browser/window/tab/item/page/content/status/loading.rs index 37000a0a..e341f712 100644 --- a/src/app/browser/window/tab/item/page/content/status/loading.rs +++ b/src/app/browser/window/tab/item/page/content/status/loading.rs @@ -11,7 +11,7 @@ const DEFAULT_TITLE: &str = "Loading.."; /// Create new default preset for loading /// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html) -pub fn new(show_with_delay: Option) -> StatusPage { +pub fn build(show_with_delay: Option) -> StatusPage { // Init spinner component let spinner = Spinner::builder() .width_request(SPINNER_SIZE) diff --git a/src/app/browser/window/tab/item/page/content/status/mime.rs b/src/app/browser/window/tab/item/page/content/status/mime.rs index 82889a60..b37fd1b1 100644 --- a/src/app/browser/window/tab/item/page/content/status/mime.rs +++ b/src/app/browser/window/tab/item/page/content/status/mime.rs @@ -1,11 +1,11 @@ use super::TabAction; use adw::StatusPage; -use gtk::{glib::GString, prelude::ButtonExt, Align, Button}; +use gtk::{glib::Uri, prelude::ButtonExt, Align, Button}; use std::rc::Rc; /// Create new default `GObject` preset for mime issue /// [StatusPage](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.StatusPage.html) -pub fn new(mime: &str, download: Option<(Rc, GString)>) -> StatusPage { +pub fn build(mime: &str, download: Option<(&Rc, &Uri)>) -> StatusPage { let status_page = StatusPage::builder() .description(format!("Content type `{mime}` not supported!")) .icon_name("dialog-question-symbolic") @@ -20,8 +20,14 @@ pub fn new(mime: &str, download: Option<(Rc, GString)>) -> StatusPage .tooltip_text("Download as file to open with external application") .build(); - button.connect_clicked(move |_| { - action.load.activate(Some(request.as_str()), true); + button.connect_clicked({ + 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));