From 1c296394682777d1a67cd0b614256ef0ac321a5e Mon Sep 17 00:00:00 2001 From: yggverse Date: Tue, 25 Mar 2025 21:19:48 +0200 Subject: [PATCH] add header string dump, reorganize size struct --- .../window/tab/item/client/driver/gemini.rs | 36 ++++++++------ .../tab/item/page/navigation/request/info.rs | 27 +++++------ .../page/navigation/request/info/dialog.rs | 47 +++++++++++++++---- .../item/page/navigation/request/info/size.rs | 5 -- 4 files changed, 72 insertions(+), 43 deletions(-) delete mode 100644 src/app/browser/window/tab/item/page/navigation/request/info/size.rs diff --git a/src/app/browser/window/tab/item/client/driver/gemini.rs b/src/app/browser/window/tab/item/client/driver/gemini.rs index 601aec1e..e588c978 100644 --- a/src/app/browser/window/tab/item/client/driver/gemini.rs +++ b/src/app/browser/window/tab/item/client/driver/gemini.rs @@ -183,8 +183,9 @@ fn handle( let mut i = page.navigation.request.info.borrow_mut(); i .add_event(event_name.to_string()) - .unset_mime() - .unset_size() + .set_header(None) + .set_mime(None) + .set_size(None) .commit(); page.navigation.request.update_secondary_icon(&i) @@ -216,8 +217,9 @@ fn handle( let mut i = page.navigation.request.info.borrow_mut(); i .add_event(EVENT_COMPLETED.to_string()) - .set_size(Some(input.as_bytes().len()), None) - .unset_mime() + .set_header(Some(input.as_str().to_string())) + .set_size(Some(input.as_bytes().len())) + .set_mime(None) .commit(); page.navigation.request.update_secondary_icon(&i); match input { @@ -332,8 +334,9 @@ fn handle( let mut i = page.navigation.request.info.borrow_mut(); i .add_event("Parsing".to_string()) - .set_mime(Some(mime)) - .set_size(Some(success.as_header_bytes().len()), Some(data.len())); + .set_header(Some(success.as_header_str().to_string())) + .set_size(Some(buffer.len())) + .set_mime(Some(mime)); let w = if matches!(*feature, Feature::Source) { page.content.to_text_source(data) } else { @@ -437,8 +440,9 @@ fn handle( let mut i = page.navigation.request.info.borrow_mut(); i .add_event(EVENT_COMPLETED.to_string()) + .set_header(Some(success.as_header_str().to_string())) .set_mime(Some(mime)) - .set_size(None, Some(buffer.byte_length())) + .set_size(Some(buffer.byte_length())) .commit(); page.navigation.request.update_secondary_icon(&i) } @@ -487,8 +491,9 @@ fn handle( let mut i = page.navigation.request.info.borrow_mut(); i .add_event(EVENT_COMPLETED.to_string()) + .set_header(Some(success.as_header_str().to_string())) .set_mime(Some(mime.to_string())) - .unset_size() + .set_size(None) .commit(); page.navigation.request.update_secondary_icon(&i) }, @@ -556,8 +561,9 @@ fn handle( let mut i = page.navigation.request.info.take(); i .add_event(EVENT_COMPLETED.to_string()) - .unset_mime() - .unset_size() + .set_header(Some(redirect.as_str().to_string())) + .set_mime(None) + .set_size(None) .commit(); page.navigation.request.info.replace(i.into_redirect()); @@ -579,8 +585,9 @@ fn handle( let mut i = page.navigation.request.info.borrow_mut(); i .add_event(EVENT_COMPLETED.to_string()) - .set_size(Some(certificate.as_bytes().len()), None) - .unset_mime() + .set_header(Some(certificate.as_str().to_string())) + .set_size(Some(certificate.as_bytes().len())) + .set_mime(None) .commit(); page.navigation.request.update_secondary_icon(&i); // update page content widget @@ -623,8 +630,9 @@ fn handle( let mut i = page.navigation.request.info.borrow_mut(); i.add_event(EVENT_COMPLETED.to_string()) .set_request(Some(uri.to_string())) - .unset_mime() - .unset_size() + .set_header(None) + .set_size(None) + .set_mime(None) .commit(); page.navigation.request.update_secondary_icon(&i) } diff --git a/src/app/browser/window/tab/item/page/navigation/request/info.rs b/src/app/browser/window/tab/item/page/navigation/request/info.rs index bb49d680..d457501f 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/info.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/info.rs @@ -1,13 +1,11 @@ mod dialog; mod event; -mod size; mod socket; use super::Profile; use dialog::Dialog; use event::Event; use gtk::{gio::SocketAddress, prelude::IsA}; -use size::Size; use socket::Socket; /// Common, shared `Page` information holder @@ -16,6 +14,9 @@ use socket::Socket; pub struct Info { /// Hold page events like connection phase and parsing time event: Vec, + /// Hold optional header string to dump it in the info dialog + /// and calculate total size + header: Option, /// Mark holder as deprecated on handle begin /// * useful on some driver does not update status properly is_deprecated: bool, @@ -27,7 +28,7 @@ pub struct Info { /// Key to relate data collected with the specific request request: Option, /// Hold size info - size: Size, + size: Option, /// Optional socket details /// * useful also for geo-location feature socket: Option, @@ -40,11 +41,12 @@ impl Info { pub fn new() -> Self { Self { event: Vec::with_capacity(50), // estimated max events quantity for all drivers + header: None, is_deprecated: false, mime: None, redirect: None, request: None, - size: Size::default(), + size: None, socket: None, } } @@ -89,13 +91,13 @@ impl Info { self } - pub fn set_mime(&mut self, mime: Option) -> &mut Self { - self.mime = mime; + pub fn set_header(&mut self, header: Option) -> &mut Self { + self.header = header; self } - pub fn unset_mime(&mut self) -> &mut Self { - self.mime = None; + pub fn set_mime(&mut self, mime: Option) -> &mut Self { + self.mime = mime; self } @@ -116,13 +118,8 @@ impl Info { self } - pub fn set_size(&mut self, header: Option, content: Option) -> &mut Self { - self.size = Size { content, header }; - self - } - - pub fn unset_size(&mut self) -> &mut Self { - self.size = Size::default(); + pub fn set_size(&mut self, size: Option) -> &mut Self { + self.size = size; self } diff --git a/src/app/browser/window/tab/item/page/navigation/request/info/dialog.rs b/src/app/browser/window/tab/item/page/navigation/request/info/dialog.rs index 52797ba9..cea4a690 100644 --- a/src/app/browser/window/tab/item/page/navigation/request/info/dialog.rs +++ b/src/app/browser/window/tab/item/page/navigation/request/info/dialog.rs @@ -1,7 +1,9 @@ use super::{Info, Profile}; use adw::{ ActionRow, PreferencesDialog, PreferencesGroup, PreferencesPage, - prelude::{ActionRowExt, PreferencesDialogExt, PreferencesGroupExt, PreferencesPageExt}, + prelude::{ + ActionRowExt, ExpanderRowExt, PreferencesDialogExt, PreferencesGroupExt, PreferencesPageExt, + }, }; use gtk::glib::gformat; @@ -37,11 +39,11 @@ impl Dialog for PreferencesDialog { g }); } // @TODO content language, header size, etc. - if info.size.header.is_some() || info.size.content.is_some() { + if info.size.is_some() || info.header.is_some() { p.add(&{ use crate::tool::Format; /// Common `ActionRow` widget pattern - fn r(title: &str, subtitle: &str) -> ActionRow { + fn r(title: &str, subtitle: String) -> ActionRow { ActionRow::builder() .css_classes(["property"]) .subtitle_selectable(true) @@ -53,18 +55,45 @@ impl Dialog for PreferencesDialog { let g = PreferencesGroup::builder().title("Size").build(); let mut i = 0; // count group members let mut t = 0; // count total size - if let Some(ref h) = info.size.header { + if let Some(ref h) = info.header { + let l = h.len(); i += 1; - t += h; - g.add(&r("Header", &h.bytes())) + t += l; + g.add(&{ + let e = adw::ExpanderRow::builder() + /* @TODO this class does not work with `ExpanderRow` + .css_classes(["property"]) */ + .enable_expansion(true) + .expanded(false) + .subtitle(l.bytes()) + .title_selectable(true) + .title("Header") + .build(); + e.add_row( + >k::Label::builder() + .css_classes(["dim-label", "caption"]) + .ellipsize(gtk::pango::EllipsizeMode::None) + .halign(gtk::Align::Start) + .label(h) + .margin_bottom(2) + .margin_end(12) + .margin_start(12) + .margin_top(14) + .selectable(true) + .valign(gtk::Align::Center) + .wrap(false) + .build(), // @TODO replace with `ActionRow` after fix empty subtitle issue + ); + e + }) } - if let Some(ref c) = info.size.content { + if let Some(ref c) = info.size { i += 1; t += c; - g.add(&r("Content", &c.bytes())) + g.add(&r("Content", c.bytes())) } if i > 1 && t > 0 { - g.add(&r("Total", &t.bytes())) + g.add(&r("Total", t.bytes())) } g }); diff --git a/src/app/browser/window/tab/item/page/navigation/request/info/size.rs b/src/app/browser/window/tab/item/page/navigation/request/info/size.rs deleted file mode 100644 index a8273873..00000000 --- a/src/app/browser/window/tab/item/page/navigation/request/info/size.rs +++ /dev/null @@ -1,5 +0,0 @@ -#[derive(Default)] -pub struct Size { - pub content: Option, - pub header: Option, -}