feat: update transfer loop to use unified TransferProgress

This commit is contained in:
Christian Visintin
2026-04-19 01:54:46 +05:30
parent 126e58503f
commit 0ddbf3b104
2 changed files with 42 additions and 34 deletions
@@ -37,8 +37,8 @@ impl FileTransferActivity {
fn transfer_completed_msg(&self, payload: &TransferPayload) -> String { fn transfer_completed_msg(&self, payload: &TransferPayload) -> String {
let transfer_stats = format!( let transfer_stats = format!(
"took {} seconds; at {}/s", "took {} seconds; at {}/s",
fmt_millis(self.transfer.partial.started().elapsed()), fmt_millis(self.transfer.progress.started.elapsed()),
ByteSize(self.transfer.partial.calc_bytes_per_second()), ByteSize(self.transfer.progress.calc_bytes_per_second()),
); );
match payload { match payload {
TransferPayload::File(file) => { TransferPayload::File(file) => {
@@ -88,7 +88,7 @@ impl FileTransferActivity {
// Reset states // Reset states
self.transfer.reset(); self.transfer.reset();
// Single file = 1 entry // Single file = 1 entry
self.transfer.full.init(1); self.transfer.progress.init(1);
// Mount progress bar // Mount progress bar
self.mount_progress_bar(format!("Uploading {}…", file.path.display())); self.mount_progress_bar(format!("Uploading {}…", file.path.display()));
// Get remote path // Get remote path
@@ -102,7 +102,7 @@ impl FileTransferActivity {
// Send // Send
let result = self.filetransfer_send_one(file, remote_path.as_path(), file_name); let result = self.filetransfer_send_one(file, remote_path.as_path(), file_name);
if result.is_ok() { if result.is_ok() {
self.transfer.full.increment(); self.transfer.progress.increment();
} }
// Umount progress bar // Umount progress bar
self.umount_progress_bar(); self.umount_progress_bar();
@@ -118,8 +118,9 @@ impl FileTransferActivity {
dst_name: Option<String>, dst_name: Option<String>,
) -> Result<(), String> { ) -> Result<(), String> {
self.transfer.reset(); self.transfer.reset();
self.transfer.progress.init(0);
if !entry.is_dir() { if !entry.is_dir() {
self.transfer.full.init(1); self.transfer.progress.set_files_total(1);
} }
self.mount_progress_bar(format!("Uploading {}…", entry.path().display())); self.mount_progress_bar(format!("Uploading {}…", entry.path().display()));
let result = self.filetransfer_send_recurse(entry, curr_remote_path, dst_name, true); let result = self.filetransfer_send_recurse(entry, curr_remote_path, dst_name, true);
@@ -135,7 +136,7 @@ impl FileTransferActivity {
// Reset states // Reset states
self.transfer.reset(); self.transfer.reset();
// Total = number of queue entries // Total = number of queue entries
self.transfer.full.init(entries.len()); self.transfer.progress.init(entries.len());
// Mount progress bar // Mount progress bar
self.mount_progress_bar(format!("Uploading {} entries…", entries.len())); self.mount_progress_bar(format!("Uploading {} entries…", entries.len()));
// Send each entry // Send each entry
@@ -149,7 +150,7 @@ impl FileTransferActivity {
result = r; result = r;
break; break;
} }
self.transfer.full.increment(); self.transfer.progress.increment();
} }
// Umount progress bar // Umount progress bar
self.umount_progress_bar(); self.umount_progress_bar();
@@ -203,7 +204,7 @@ impl FileTransferActivity {
match self.browser.local_pane_mut().fs.list_dir(entry.path()) { match self.browser.local_pane_mut().fs.list_dir(entry.path()) {
Ok(entries) => { Ok(entries) => {
if track_progress { if track_progress {
self.transfer.full.init(entries.len()); self.transfer.progress.set_files_total(entries.len());
} }
for entry in entries.iter() { for entry in entries.iter() {
if self.transfer.aborted() { if self.transfer.aborted() {
@@ -211,7 +212,7 @@ impl FileTransferActivity {
} }
self.filetransfer_send_recurse(entry, remote_path.as_path(), None, false)?; self.filetransfer_send_recurse(entry, remote_path.as_path(), None, false)?;
if track_progress { if track_progress {
self.transfer.full.increment(); self.transfer.progress.increment();
} }
} }
Ok(()) Ok(())
@@ -269,7 +270,7 @@ impl FileTransferActivity {
} }
Ok(_) => { Ok(_) => {
if track_progress { if track_progress {
self.transfer.full.increment(); self.transfer.progress.increment();
} }
Ok(()) Ok(())
} }
@@ -312,7 +313,9 @@ impl FileTransferActivity {
host_bridge.path().display() host_bridge.path().display()
), ),
); );
self.transfer.add_bytes(metadata.size as usize); self.transfer
.progress
.register_skipped_file(metadata.size as usize);
return Ok(()); return Ok(());
} }
// Upload file // Upload file
@@ -352,7 +355,8 @@ impl FileTransferActivity {
.map_err(TransferErrorReason::HostError) .map_err(TransferErrorReason::HostError)
.map(|x| x.metadata().size as usize)?; .map(|x| x.metadata().size as usize)?;
// Init transfer // Init transfer
self.transfer.partial.init(file_size); self.transfer.progress.register_file(file_size);
let file_started = Instant::now();
// Write remote file // Write remote file
let mut total_bytes_written: usize = 0; let mut total_bytes_written: usize = 0;
@@ -402,14 +406,13 @@ impl FileTransferActivity {
} }
}; };
// Increase progress // Increase progress
self.transfer.partial.update_progress(delta); self.transfer.progress.add_bytes(delta);
self.transfer.add_bytes(delta);
// Draw only if a significant progress has been made (performance improvement) // Draw only if a significant progress has been made (performance improvement)
if last_progress_val < self.transfer.partial.calc_progress() - 0.01 { if last_progress_val < self.transfer.progress.calc_progress() - 0.01 {
// Draw // Draw
self.update_progress_bar(format!("Uploading \"{file_name}\"…")); self.update_progress_bar(format!("Uploading \"{file_name}\"…"));
self.view(); self.view();
last_progress_val = self.transfer.partial.calc_progress(); last_progress_val = self.transfer.progress.calc_progress();
} }
} }
// Finalize stream // Finalize stream
@@ -438,8 +441,8 @@ impl FileTransferActivity {
"Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)", "Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)",
host.path.display(), host.path.display(),
remote.display(), remote.display(),
fmt_millis(self.transfer.partial.started().elapsed()), fmt_millis(file_started.elapsed()),
ByteSize(self.transfer.partial.calc_bytes_per_second()), ByteSize(self.transfer.progress.calc_bytes_per_second()),
), ),
); );
Ok(()) Ok(())
@@ -485,8 +488,9 @@ impl FileTransferActivity {
dst_name: Option<String>, dst_name: Option<String>,
) -> Result<(), String> { ) -> Result<(), String> {
self.transfer.reset(); self.transfer.reset();
self.transfer.progress.init(0);
if !entry.is_dir() { if !entry.is_dir() {
self.transfer.full.init(1); self.transfer.progress.set_files_total(1);
} }
self.mount_progress_bar(format!("Downloading {}…", entry.path().display())); self.mount_progress_bar(format!("Downloading {}…", entry.path().display()));
let result = self.filetransfer_recv_recurse(entry, host_path, dst_name, true); let result = self.filetransfer_recv_recurse(entry, host_path, dst_name, true);
@@ -503,13 +507,13 @@ impl FileTransferActivity {
// Reset states // Reset states
self.transfer.reset(); self.transfer.reset();
// Single file = 1 entry // Single file = 1 entry
self.transfer.full.init(1); self.transfer.progress.init(1);
// Mount progress bar // Mount progress bar
self.mount_progress_bar(format!("Downloading {}…", entry.path.display())); self.mount_progress_bar(format!("Downloading {}…", entry.path.display()));
// Receive // Receive
let result = self.filetransfer_recv_one(host_bridge_path, entry, entry.name()); let result = self.filetransfer_recv_one(host_bridge_path, entry, entry.name());
if result.is_ok() { if result.is_ok() {
self.transfer.full.increment(); self.transfer.progress.increment();
} }
// Umount progress bar // Umount progress bar
self.umount_progress_bar(); self.umount_progress_bar();
@@ -525,7 +529,7 @@ impl FileTransferActivity {
// Reset states // Reset states
self.transfer.reset(); self.transfer.reset();
// Total = number of queue entries // Total = number of queue entries
self.transfer.full.init(entries.len()); self.transfer.progress.init(entries.len());
// Mount progress bar // Mount progress bar
self.mount_progress_bar(format!("Downloading {} entries…", entries.len())); self.mount_progress_bar(format!("Downloading {} entries…", entries.len()));
// Receive each entry // Receive each entry
@@ -539,7 +543,7 @@ impl FileTransferActivity {
result = r; result = r;
break; break;
} }
self.transfer.full.increment(); self.transfer.progress.increment();
} }
// Umount progress bar // Umount progress bar
self.umount_progress_bar(); self.umount_progress_bar();
@@ -596,7 +600,7 @@ impl FileTransferActivity {
match self.browser.remote_pane_mut().fs.list_dir(entry.path()) { match self.browser.remote_pane_mut().fs.list_dir(entry.path()) {
Ok(entries) => { Ok(entries) => {
if track_progress { if track_progress {
self.transfer.full.init(entries.len()); self.transfer.progress.set_files_total(entries.len());
} }
for entry in entries.iter() { for entry in entries.iter() {
if self.transfer.aborted() { if self.transfer.aborted() {
@@ -609,7 +613,7 @@ impl FileTransferActivity {
false, false,
)?; )?;
if track_progress { if track_progress {
self.transfer.full.increment(); self.transfer.progress.increment();
} }
} }
Ok(()) Ok(())
@@ -688,7 +692,7 @@ impl FileTransferActivity {
Err(err.to_string()) Err(err.to_string())
} else { } else {
if track_progress { if track_progress {
self.transfer.full.increment(); self.transfer.progress.increment();
} }
Ok(()) Ok(())
} }
@@ -722,7 +726,9 @@ impl FileTransferActivity {
remote.path().display() remote.path().display()
), ),
); );
self.transfer.add_bytes(remote.metadata().size as usize); self.transfer
.progress
.register_skipped_file(remote.metadata().size as usize);
return Ok(()); return Ok(());
} }
@@ -755,7 +761,10 @@ impl FileTransferActivity {
) -> Result<(), TransferErrorReason> { ) -> Result<(), TransferErrorReason> {
let mut total_bytes_written: usize = 0; let mut total_bytes_written: usize = 0;
// Init transfer // Init transfer
self.transfer.partial.init(remote.metadata.size as usize); self.transfer
.progress
.register_file(remote.metadata.size as usize);
let file_started = Instant::now();
// Write host_bridge file // Write host_bridge file
let mut last_progress_val: f64 = 0.0; let mut last_progress_val: f64 = 0.0;
let mut last_input_event_fetch: Option<Instant> = None; let mut last_input_event_fetch: Option<Instant> = None;
@@ -801,14 +810,13 @@ impl FileTransferActivity {
} }
}; };
// Set progress // Set progress
self.transfer.partial.update_progress(delta); self.transfer.progress.add_bytes(delta);
self.transfer.add_bytes(delta);
// Draw only if a significant progress has been made (performance improvement) // Draw only if a significant progress has been made (performance improvement)
if last_progress_val < self.transfer.partial.calc_progress() - 0.01 { if last_progress_val < self.transfer.progress.calc_progress() - 0.01 {
// Draw // Draw
self.update_progress_bar(format!("Downloading \"{file_name}\"")); self.update_progress_bar(format!("Downloading \"{file_name}\""));
self.view(); self.view();
last_progress_val = self.transfer.partial.calc_progress(); last_progress_val = self.transfer.progress.calc_progress();
} }
} }
// If download was abrupted, return Error // If download was abrupted, return Error
@@ -847,8 +855,8 @@ impl FileTransferActivity {
"Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)", "Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)",
remote.path.display(), remote.path.display(),
host_bridge.display(), host_bridge.display(),
fmt_millis(self.transfer.partial.started().elapsed()), fmt_millis(file_started.elapsed()),
ByteSize(self.transfer.partial.calc_bytes_per_second()), ByteSize(self.transfer.progress.calc_bytes_per_second()),
), ),
); );