update totals on loading

This commit is contained in:
yggverse 2024-10-29 19:20:25 +02:00
parent 1d03e98b89
commit 6447b2279f
3 changed files with 34 additions and 23 deletions

View file

@ -457,7 +457,7 @@ impl Page {
None => title.clone(), None => title.clone(),
}; };
// Make input form // Toggle input form variant
match header.status() { match header.status() {
ClientStatus::SensitiveInput => ClientStatus::SensitiveInput =>
input.set_new_sensitive( input.set_new_sensitive(
@ -546,7 +546,7 @@ impl Page {
ClientMime::ImageJpeg | ClientMime::ImageWebp ClientMime::ImageJpeg | ClientMime::ImageWebp
) => { ) => {
// Final image size unknown, show loading widget // Final image size unknown, show loading widget
content.set_status_loading( let status = content.set_status_loading(
Some(&gformat!("Loading..")), Some(&gformat!("Loading..")),
None None
); );
@ -559,9 +559,11 @@ impl Page {
Priority::DEFAULT, Priority::DEFAULT,
0x400, // 1024 bytes per chunk, optional step for images download tracking 0x400, // 1024 bytes per chunk, optional step for images download tracking
0xA00000, // 10M bytes max to prevent memory overflow if server play with promises @TODO optional? 0xA00000, // 10M bytes max to prevent memory overflow if server play with promises @TODO optional?
move |(_, _total)| { move |(_, total)| {
// Update loading progress // Update loading progress
// description = gformat!("{total}"); status.set_description(
Some(&gformat!("Download: {total} bytes"))
);
}, },
move |result| match result { move |result| match result {
Ok(memory_input_stream) => { Ok(memory_input_stream) => {
@ -695,10 +697,12 @@ impl Page {
} }
); );
}, },
None => content.set_status_failure( None => {
Some(&"Oops"), content.set_status_failure(
Some(&"Could not parse redirect meta") Some(&"Oops"),
), Some(&"Could not parse redirect meta")
);
},
} }
action_update.activate(Some(&id)); action_update.activate(Some(&id));

View file

@ -34,27 +34,23 @@ impl Content {
// Actions // Actions
pub fn set_image(&self, buffer: &Pixbuf) { pub fn set_image(&self, buffer: &Pixbuf) {
self.clean(); self.clean();
let image = Image::new_from_pixbuf(buffer); let image = Image::new_from_pixbuf(buffer);
self.gobject.append(image.gobject()); self.gobject.append(image.gobject());
} }
pub fn set_status_failure(&self, title: Option<&str>, description: Option<&str>) { pub fn set_status_failure(&self, title: Option<&str>, description: Option<&str>) -> Status {
self.clean(); self.clean();
let status = Status::new_failure(title, description);
let status_default = Status::new_failure(title, description); self.gobject.append(status.gobject());
status
self.gobject.append(status_default.gobject());
} }
/// Loading placeholder /// Loading placeholder
pub fn set_status_loading(&self, title: Option<&str>, description: Option<&str>) { pub fn set_status_loading(&self, title: Option<&str>, description: Option<&str>) -> Status {
self.clean(); self.clean();
let status = Status::new_loading(title, description);
let status_default = Status::new_loading(title, description); self.gobject.append(status.gobject());
status
self.gobject.append(status_default.gobject());
} }
/// Default reading widget for [Gemtext](https://geminiprotocol.net/docs/gemtext.gmi), /// Default reading widget for [Gemtext](https://geminiprotocol.net/docs/gemtext.gmi),

View file

@ -13,22 +13,33 @@ pub struct Status {
impl Status { impl Status {
// Constructors // Constructors
/// Create new default failure component /// Create new failure preset
///
/// Useful as placeholder widget for error handlers
pub fn new_failure(title: Option<&str>, description: Option<&str>) -> Self { pub fn new_failure(title: Option<&str>, description: Option<&str>) -> Self {
Self { Self {
gobject: Failure::new(title, description).gobject().clone(), gobject: Failure::new(title, description).gobject().clone(),
} }
} }
/// Create new default loading component /// Create new loading preset
/// ///
/// Useful as the placeholder widget for async operations /// Useful as placeholder widget for async operations
pub fn new_loading(title: Option<&str>, description: Option<&str>) -> Self { pub fn new_loading(title: Option<&str>, description: Option<&str>) -> Self {
Self { Self {
gobject: Loading::new(title, description).gobject().clone(), gobject: Loading::new(title, description).gobject().clone(),
} }
} }
// Setters
/// Set new description for status component
///
/// Useful for loading widgets to update byte totals and other dynamically changed information
pub fn set_description(&self, description: Option<&str>) {
self.gobject.set_description(description);
}
// Getters // Getters
pub fn gobject(&self) -> &StatusPage { pub fn gobject(&self) -> &StatusPage {