add optional download button for unknown mime types

This commit is contained in:
yggverse 2024-12-12 12:42:47 +02:00
parent 549c3fd946
commit f2dadee082
4 changed files with 39 additions and 12 deletions

View File

@ -679,7 +679,10 @@ impl Page {
},
mime => {
// Init children widget
let status = content.to_status_mime(mime);
let status = content.to_status_mime(
mime,
Some((tab_action.clone(), navigation.request.download()))
);
// Update page meta
meta.set_status(Status::Failure)

View File

@ -6,11 +6,11 @@ use image::Image;
use status::Status;
use text::Text;
use crate::app::browser::window::{tab::item::Action as TabAction, Action as WindowAction};
use super::{TabAction, WindowAction};
use gtk::{
gdk::Paintable,
gio::{Cancellable, File},
glib::Uri,
glib::{GString, Uri},
prelude::{BoxExt, IsA, WidgetExt},
Box, Orientation,
};
@ -74,9 +74,9 @@ impl Content {
/// Set new `content::Status` component for `Self` with new `status::Mime` issue preset
///
/// * action removes previous children component from `Self`
pub fn to_status_mime(&self, mime: &str) -> Status {
pub fn to_status_mime(&self, mime: &str, download: Option<(Rc<TabAction>, GString)>) -> Status {
self.clean();
let status = Status::new_mime(mime);
let status = Status::new_mime(mime, download);
self.gobject.append(status.gobject());
status
}

View File

@ -4,8 +4,12 @@ mod identity;
mod loading;
mod mime;
use super::TabAction;
use adw::StatusPage;
use gtk::gio::{Cancellable, File};
use gtk::{
gio::{Cancellable, File},
glib::GString,
};
use std::{rc::Rc, time::Duration};
pub struct Status {
@ -38,9 +42,9 @@ impl Status {
/// Create new mime issue preset
///
/// Useful as placeholder widget for mime issue handlers
pub fn new_mime(mime: &str) -> Self {
pub fn new_mime(mime: &str, download: Option<(Rc<TabAction>, GString)>) -> Self {
Self {
gobject: mime::new_gobject(mime),
gobject: mime::new_gobject(mime, download),
}
}

View File

@ -1,11 +1,31 @@
use super::TabAction;
use adw::StatusPage;
use gtk::{glib::GString, 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_gobject(mime: &str) -> StatusPage {
StatusPage::builder()
.title("Oops")
pub fn new_gobject(mime: &str, download: Option<(Rc<TabAction>, GString)>) -> StatusPage {
let status_page = StatusPage::builder()
.description(format!("Content type `{mime}` not supported!"))
.icon_name("dialog-question-symbolic")
.build()
.title("Oops")
.build();
if let Some((action, request)) = download {
let button = Button::builder()
.css_classes(["accent"])
.halign(Align::Center)
.label("Download")
.tooltip_text("Download as file to open with other application")
.build();
button.connect_clicked(move |_| {
action.load.activate(Some(request.as_str()), true);
});
status_page.set_child(Some(&button));
}
status_page
}