add header string dump, reorganize size struct

This commit is contained in:
yggverse 2025-03-25 21:19:48 +02:00
parent 22efd3ef9d
commit 1c29639468
4 changed files with 72 additions and 43 deletions

View file

@ -183,8 +183,9 @@ fn handle(
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i i
.add_event(event_name.to_string()) .add_event(event_name.to_string())
.unset_mime() .set_header(None)
.unset_size() .set_mime(None)
.set_size(None)
.commit(); .commit();
page.navigation.request.update_secondary_icon(&i) page.navigation.request.update_secondary_icon(&i)
@ -216,8 +217,9 @@ fn handle(
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_size(Some(input.as_bytes().len()), None) .set_header(Some(input.as_str().to_string()))
.unset_mime() .set_size(Some(input.as_bytes().len()))
.set_mime(None)
.commit(); .commit();
page.navigation.request.update_secondary_icon(&i); page.navigation.request.update_secondary_icon(&i);
match input { match input {
@ -332,8 +334,9 @@ fn handle(
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i i
.add_event("Parsing".to_string()) .add_event("Parsing".to_string())
.set_mime(Some(mime)) .set_header(Some(success.as_header_str().to_string()))
.set_size(Some(success.as_header_bytes().len()), Some(data.len())); .set_size(Some(buffer.len()))
.set_mime(Some(mime));
let w = if matches!(*feature, Feature::Source) { let w = if matches!(*feature, Feature::Source) {
page.content.to_text_source(data) page.content.to_text_source(data)
} else { } else {
@ -437,8 +440,9 @@ fn handle(
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_header(Some(success.as_header_str().to_string()))
.set_mime(Some(mime)) .set_mime(Some(mime))
.set_size(None, Some(buffer.byte_length())) .set_size(Some(buffer.byte_length()))
.commit(); .commit();
page.navigation.request.update_secondary_icon(&i) page.navigation.request.update_secondary_icon(&i)
} }
@ -487,8 +491,9 @@ fn handle(
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_header(Some(success.as_header_str().to_string()))
.set_mime(Some(mime.to_string())) .set_mime(Some(mime.to_string()))
.unset_size() .set_size(None)
.commit(); .commit();
page.navigation.request.update_secondary_icon(&i) page.navigation.request.update_secondary_icon(&i)
}, },
@ -556,8 +561,9 @@ fn handle(
let mut i = page.navigation.request.info.take(); let mut i = page.navigation.request.info.take();
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.unset_mime() .set_header(Some(redirect.as_str().to_string()))
.unset_size() .set_mime(None)
.set_size(None)
.commit(); .commit();
page.navigation.request.info.replace(i.into_redirect()); page.navigation.request.info.replace(i.into_redirect());
@ -579,8 +585,9 @@ fn handle(
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i i
.add_event(EVENT_COMPLETED.to_string()) .add_event(EVENT_COMPLETED.to_string())
.set_size(Some(certificate.as_bytes().len()), None) .set_header(Some(certificate.as_str().to_string()))
.unset_mime() .set_size(Some(certificate.as_bytes().len()))
.set_mime(None)
.commit(); .commit();
page.navigation.request.update_secondary_icon(&i); page.navigation.request.update_secondary_icon(&i);
// update page content widget // update page content widget
@ -623,8 +630,9 @@ fn handle(
let mut i = page.navigation.request.info.borrow_mut(); let mut i = page.navigation.request.info.borrow_mut();
i.add_event(EVENT_COMPLETED.to_string()) i.add_event(EVENT_COMPLETED.to_string())
.set_request(Some(uri.to_string())) .set_request(Some(uri.to_string()))
.unset_mime() .set_header(None)
.unset_size() .set_size(None)
.set_mime(None)
.commit(); .commit();
page.navigation.request.update_secondary_icon(&i) page.navigation.request.update_secondary_icon(&i)
} }

View file

@ -1,13 +1,11 @@
mod dialog; mod dialog;
mod event; mod event;
mod size;
mod socket; mod socket;
use super::Profile; use super::Profile;
use dialog::Dialog; use dialog::Dialog;
use event::Event; use event::Event;
use gtk::{gio::SocketAddress, prelude::IsA}; use gtk::{gio::SocketAddress, prelude::IsA};
use size::Size;
use socket::Socket; use socket::Socket;
/// Common, shared `Page` information holder /// Common, shared `Page` information holder
@ -16,6 +14,9 @@ use socket::Socket;
pub struct Info { pub struct Info {
/// Hold page events like connection phase and parsing time /// Hold page events like connection phase and parsing time
event: Vec<Event>, event: Vec<Event>,
/// Hold optional header string to dump it in the info dialog
/// and calculate total size
header: Option<String>,
/// Mark holder as deprecated on handle begin /// Mark holder as deprecated on handle begin
/// * useful on some driver does not update status properly /// * useful on some driver does not update status properly
is_deprecated: bool, is_deprecated: bool,
@ -27,7 +28,7 @@ pub struct Info {
/// Key to relate data collected with the specific request /// Key to relate data collected with the specific request
request: Option<String>, request: Option<String>,
/// Hold size info /// Hold size info
size: Size, size: Option<usize>,
/// Optional socket details /// Optional socket details
/// * useful also for geo-location feature /// * useful also for geo-location feature
socket: Option<Socket>, socket: Option<Socket>,
@ -40,11 +41,12 @@ impl Info {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
event: Vec::with_capacity(50), // estimated max events quantity for all drivers event: Vec::with_capacity(50), // estimated max events quantity for all drivers
header: None,
is_deprecated: false, is_deprecated: false,
mime: None, mime: None,
redirect: None, redirect: None,
request: None, request: None,
size: Size::default(), size: None,
socket: None, socket: None,
} }
} }
@ -89,13 +91,13 @@ impl Info {
self self
} }
pub fn set_mime(&mut self, mime: Option<String>) -> &mut Self { pub fn set_header(&mut self, header: Option<String>) -> &mut Self {
self.mime = mime; self.header = header;
self self
} }
pub fn unset_mime(&mut self) -> &mut Self { pub fn set_mime(&mut self, mime: Option<String>) -> &mut Self {
self.mime = None; self.mime = mime;
self self
} }
@ -116,13 +118,8 @@ impl Info {
self self
} }
pub fn set_size(&mut self, header: Option<usize>, content: Option<usize>) -> &mut Self { pub fn set_size(&mut self, size: Option<usize>) -> &mut Self {
self.size = Size { content, header }; self.size = size;
self
}
pub fn unset_size(&mut self) -> &mut Self {
self.size = Size::default();
self self
} }

View file

@ -1,7 +1,9 @@
use super::{Info, Profile}; use super::{Info, Profile};
use adw::{ use adw::{
ActionRow, PreferencesDialog, PreferencesGroup, PreferencesPage, ActionRow, PreferencesDialog, PreferencesGroup, PreferencesPage,
prelude::{ActionRowExt, PreferencesDialogExt, PreferencesGroupExt, PreferencesPageExt}, prelude::{
ActionRowExt, ExpanderRowExt, PreferencesDialogExt, PreferencesGroupExt, PreferencesPageExt,
},
}; };
use gtk::glib::gformat; use gtk::glib::gformat;
@ -37,11 +39,11 @@ impl Dialog for PreferencesDialog {
g g
}); });
} // @TODO content language, header size, etc. } // @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(&{ p.add(&{
use crate::tool::Format; use crate::tool::Format;
/// Common `ActionRow` widget pattern /// Common `ActionRow` widget pattern
fn r(title: &str, subtitle: &str) -> ActionRow { fn r(title: &str, subtitle: String) -> ActionRow {
ActionRow::builder() ActionRow::builder()
.css_classes(["property"]) .css_classes(["property"])
.subtitle_selectable(true) .subtitle_selectable(true)
@ -53,18 +55,45 @@ impl Dialog for PreferencesDialog {
let g = PreferencesGroup::builder().title("Size").build(); let g = PreferencesGroup::builder().title("Size").build();
let mut i = 0; // count group members let mut i = 0; // count group members
let mut t = 0; // count total size 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; i += 1;
t += h; t += l;
g.add(&r("Header", &h.bytes())) 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(
&gtk::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; i += 1;
t += c; t += c;
g.add(&r("Content", &c.bytes())) g.add(&r("Content", c.bytes()))
} }
if i > 1 && t > 0 { if i > 1 && t > 0 {
g.add(&r("Total", &t.bytes())) g.add(&r("Total", t.bytes()))
} }
g g
}); });

View file

@ -1,5 +0,0 @@
#[derive(Default)]
pub struct Size {
pub content: Option<usize>,
pub header: Option<usize>,
}