mirror of
https://github.com/veeso/termscp.git
synced 2025-12-07 09:36:00 -08:00
Transfer states
This commit is contained in:
@@ -383,16 +383,16 @@ impl FileTransferActivity {
|
||||
/// Draw progress popup
|
||||
pub(super) fn draw_popup_progress(&self, text: String) -> Gauge {
|
||||
// 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
|
||||
_ => {
|
||||
let elapsed_secs: u64 = self.transfer_started.elapsed().as_secs();
|
||||
let elapsed_secs: u64 = self.transfer.started.elapsed().as_secs();
|
||||
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)
|
||||
}
|
||||
};
|
||||
let label = format!("{:.2}% - ETA {}", self.transfer_progress, eta);
|
||||
let label = format!("{:.2}% - ETA {}", self.transfer.progress, eta);
|
||||
Gauge::default()
|
||||
.block(Block::default().borders(Borders::ALL).title(text))
|
||||
.gauge_style(
|
||||
@@ -402,7 +402,7 @@ impl FileTransferActivity {
|
||||
.add_modifier(Modifier::BOLD),
|
||||
)
|
||||
.label(label)
|
||||
.ratio(self.transfer_progress / 100.0)
|
||||
.ratio(self.transfer.progress / 100.0)
|
||||
}
|
||||
|
||||
/// ### draw_popup_wait
|
||||
|
||||
@@ -81,6 +81,6 @@ impl FileTransferActivity {
|
||||
} else if prog < 0.0 {
|
||||
prog = 0.0;
|
||||
}
|
||||
self.transfer_progress = prog;
|
||||
self.transfer.progress = prog;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 is the data holder for the file transfer activity
|
||||
@@ -224,8 +261,7 @@ pub struct FileTransferActivity {
|
||||
input_field: InputField, // Current selected input mode
|
||||
input_txt: String, // Input text
|
||||
choice_opt: DialogYesNoOption, // Dialog popup selected option
|
||||
transfer_progress: f64, // Current write/read progress (percentage)
|
||||
transfer_started: Instant, // Instant when progress has started
|
||||
transfer: TransferStates, // Transfer states
|
||||
}
|
||||
|
||||
impl FileTransferActivity {
|
||||
@@ -254,8 +290,7 @@ impl FileTransferActivity {
|
||||
input_field: InputField::Explorer,
|
||||
input_txt: String::new(),
|
||||
choice_opt: DialogYesNoOption::Yes,
|
||||
transfer_progress: 0.0,
|
||||
transfer_started: Instant::now(),
|
||||
transfer: TransferStates::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@ use super::{FileTransferActivity, FsEntry, InputMode, LogLevel, PopupType};
|
||||
|
||||
use std::io::{Read, Seek, Write};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::time::Instant;
|
||||
use tui::style::Color;
|
||||
|
||||
impl FileTransferActivity {
|
||||
@@ -155,8 +154,8 @@ impl FileTransferActivity {
|
||||
"Uploading \"{}\"",
|
||||
file_name
|
||||
)));
|
||||
// Set started time
|
||||
self.transfer_started = Instant::now();
|
||||
// Reset transfer states
|
||||
self.transfer.reset();
|
||||
let mut last_progress_val: f64 = 0.0;
|
||||
while total_bytes_written < file_size {
|
||||
// Read till you can
|
||||
@@ -212,10 +211,10 @@ impl FileTransferActivity {
|
||||
// Increase progress
|
||||
self.set_progress(total_bytes_written, file_size);
|
||||
// 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
|
||||
self.draw();
|
||||
last_progress_val = self.transfer_progress;
|
||||
last_progress_val = self.transfer.progress;
|
||||
}
|
||||
}
|
||||
// Finalize stream
|
||||
@@ -407,8 +406,8 @@ impl FileTransferActivity {
|
||||
file_name
|
||||
)));
|
||||
let mut total_bytes_written: usize = 0;
|
||||
// Set started time
|
||||
self.transfer_started = Instant::now();
|
||||
// Reset transfer states
|
||||
self.transfer.reset();
|
||||
// Write local file
|
||||
let mut last_progress_val: f64 = 0.0;
|
||||
while total_bytes_written < file.size {
|
||||
@@ -466,10 +465,10 @@ impl FileTransferActivity {
|
||||
// Set progress
|
||||
self.set_progress(total_bytes_written, file.size);
|
||||
// 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
|
||||
self.draw();
|
||||
last_progress_val = self.transfer_progress;
|
||||
last_progress_val = self.transfer.progress;
|
||||
}
|
||||
}
|
||||
// Finalize stream
|
||||
|
||||
Reference in New Issue
Block a user