Transfer states

This commit is contained in:
ChristianVisintin
2020-12-12 21:32:11 +01:00
parent 794dfb8cee
commit 3e72787625
4 changed files with 53 additions and 19 deletions

View File

@@ -383,16 +383,16 @@ impl FileTransferActivity {
/// Draw progress popup /// Draw progress popup
pub(super) fn draw_popup_progress(&self, text: String) -> Gauge { pub(super) fn draw_popup_progress(&self, text: String) -> Gauge {
// Calculate ETA // Calculate ETA
let eta: String = match self.transfer_progress as u64 { let eta: String = match self.transfer.progress as u64 {
0 => String::from("--:--"), // NOTE: would divide by 0 :D 0 => String::from("--:--"), // NOTE: would divide by 0 :D
_ => { _ => {
let elapsed_secs: u64 = self.transfer_started.elapsed().as_secs(); let elapsed_secs: u64 = self.transfer.started.elapsed().as_secs();
let eta: u64 = let eta: u64 =
((elapsed_secs * 100) / (self.transfer_progress as u64)) - elapsed_secs; ((elapsed_secs * 100) / (self.transfer.progress as u64)) - elapsed_secs;
format!("{:0width$}:{:0width$}", (eta / 60), (eta % 60), width = 2) format!("{:0width$}:{:0width$}", (eta / 60), (eta % 60), width = 2)
} }
}; };
let label = format!("{:.2}% - ETA {}", self.transfer_progress, eta); let label = format!("{:.2}% - ETA {}", self.transfer.progress, eta);
Gauge::default() Gauge::default()
.block(Block::default().borders(Borders::ALL).title(text)) .block(Block::default().borders(Borders::ALL).title(text))
.gauge_style( .gauge_style(
@@ -402,7 +402,7 @@ impl FileTransferActivity {
.add_modifier(Modifier::BOLD), .add_modifier(Modifier::BOLD),
) )
.label(label) .label(label)
.ratio(self.transfer_progress / 100.0) .ratio(self.transfer.progress / 100.0)
} }
/// ### draw_popup_wait /// ### draw_popup_wait

View File

@@ -81,6 +81,6 @@ impl FileTransferActivity {
} else if prog < 0.0 { } else if prog < 0.0 {
prog = 0.0; prog = 0.0;
} }
self.transfer_progress = prog; self.transfer.progress = prog;
} }
} }

View File

@@ -205,6 +205,43 @@ impl LogRecord {
} }
} }
/// ### TransferStates
///
/// TransferStates contains the states related to the transfer process
struct TransferStates {
pub progress: f64, // Current read/write progress (percentage)
pub started: Instant, // Instant the transfer process started
pub aborted: bool, // Describes whether the transfer process has been aborted
}
impl TransferStates {
/// ### new
///
/// Instantiates a new transfer states
pub fn new() -> TransferStates {
TransferStates {
progress: 0.0,
started: Instant::now(),
aborted: false,
}
}
/// ### reset
///
/// Re-intiialize transfer states
pub fn reset(&mut self) {
self.progress = 0.0;
self.started = Instant::now();
self.aborted = false;
}
}
impl Default for TransferStates {
fn default() -> Self {
Self::new()
}
}
/// ## FileTransferActivity /// ## FileTransferActivity
/// ///
/// FileTransferActivity is the data holder for the file transfer activity /// FileTransferActivity is the data holder for the file transfer activity
@@ -224,8 +261,7 @@ pub struct FileTransferActivity {
input_field: InputField, // Current selected input mode input_field: InputField, // Current selected input mode
input_txt: String, // Input text input_txt: String, // Input text
choice_opt: DialogYesNoOption, // Dialog popup selected option choice_opt: DialogYesNoOption, // Dialog popup selected option
transfer_progress: f64, // Current write/read progress (percentage) transfer: TransferStates, // Transfer states
transfer_started: Instant, // Instant when progress has started
} }
impl FileTransferActivity { impl FileTransferActivity {
@@ -254,8 +290,7 @@ impl FileTransferActivity {
input_field: InputField::Explorer, input_field: InputField::Explorer,
input_txt: String::new(), input_txt: String::new(),
choice_opt: DialogYesNoOption::Yes, choice_opt: DialogYesNoOption::Yes,
transfer_progress: 0.0, transfer: TransferStates::default(),
transfer_started: Instant::now(),
} }
} }
} }

View File

@@ -23,7 +23,6 @@ use super::{FileTransferActivity, FsEntry, InputMode, LogLevel, PopupType};
use std::io::{Read, Seek, Write}; use std::io::{Read, Seek, Write};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::time::Instant;
use tui::style::Color; use tui::style::Color;
impl FileTransferActivity { impl FileTransferActivity {
@@ -155,8 +154,8 @@ impl FileTransferActivity {
"Uploading \"{}\"", "Uploading \"{}\"",
file_name file_name
))); )));
// Set started time // Reset transfer states
self.transfer_started = Instant::now(); self.transfer.reset();
let mut last_progress_val: f64 = 0.0; let mut last_progress_val: f64 = 0.0;
while total_bytes_written < file_size { while total_bytes_written < file_size {
// Read till you can // Read till you can
@@ -212,10 +211,10 @@ impl FileTransferActivity {
// Increase progress // Increase progress
self.set_progress(total_bytes_written, file_size); self.set_progress(total_bytes_written, file_size);
// 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_progress - 1.0 { if last_progress_val < self.transfer.progress - 1.0 {
// Draw // Draw
self.draw(); self.draw();
last_progress_val = self.transfer_progress; last_progress_val = self.transfer.progress;
} }
} }
// Finalize stream // Finalize stream
@@ -407,8 +406,8 @@ impl FileTransferActivity {
file_name file_name
))); )));
let mut total_bytes_written: usize = 0; let mut total_bytes_written: usize = 0;
// Set started time // Reset transfer states
self.transfer_started = Instant::now(); self.transfer.reset();
// Write local file // Write local file
let mut last_progress_val: f64 = 0.0; let mut last_progress_val: f64 = 0.0;
while total_bytes_written < file.size { while total_bytes_written < file.size {
@@ -466,10 +465,10 @@ impl FileTransferActivity {
// Set progress // Set progress
self.set_progress(total_bytes_written, file.size); self.set_progress(total_bytes_written, file.size);
// 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_progress - 1.0 { if last_progress_val < self.transfer.progress - 1.0 {
// Draw // Draw
self.draw(); self.draw();
last_progress_val = self.transfer_progress; last_progress_val = self.transfer.progress;
} }
} }
// Finalize stream // Finalize stream