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
|
/// 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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user