Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Default dcc save path & and show remaining time #792

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Unreleased

Added:

- Time remaining is now displayed during file transfers

Changed:

- [file_transfer.save_directory] is now default download path for transfers. If set, files will be downloaded there by default. Otherwise, you'll be prompted to choose a location.

# 2025.2 (2025-02-20)

Added:
Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ rodio = "0.19.0"
strum = { version = "0.26.3", features = ["derive"] }
tokio-stream = { version = "0.1.16", features = ["fs"] }
url = "2.5.0"
humantime = "2.1.0"

# change to 1.2.0 when it is released https://github.com/frewsxcv/rust-dark-light/issues/38
dark-light = { git = "https://github.com/frewsxcv/rust-dark-light", rev = "3eb3e93dd0fa30733c3e93082dd9517fb580ae95" }
Expand Down
6 changes: 3 additions & 3 deletions book/src/configuration/file_transfer.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ File transfer configuration options.

## `save_directory`

Default directory to open when prompted to save a file.
Default directory to save files in. If not set, user will see a file dialog.

```toml
# Type: string
# Values: any string
# Default: "$HOME/Downloads"
# Default: not set

[file_transfer]
save_directory = "$HOME/Downloads"
save_directory = "/Users/halloy/Downloads"
```

## `passive`
Expand Down
12 changes: 4 additions & 8 deletions data/src/config/file_transfer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ use serde::Deserialize;

#[derive(Debug, Clone, Deserialize)]
pub struct FileTransfer {
/// Directory opened when prompted to save a file
#[serde(default = "default_save_directory")]
pub save_directory: PathBuf,
/// Default directory to save files in. If not set, user will see a file dialog.
#[serde(default)]
pub save_directory: Option<PathBuf>,
/// If true, act as the "client" for the transfer. Requires the remote user act as the server.
#[serde(default = "default_passive")]
pub passive: bool,
Expand All @@ -19,7 +19,7 @@ pub struct FileTransfer {
impl Default for FileTransfer {
fn default() -> Self {
Self {
save_directory: default_save_directory(),
save_directory: None,
passive: default_passive(),
timeout: default_timeout(),
server: None,
Expand All @@ -35,10 +35,6 @@ fn default_timeout() -> u64 {
60 * 5
}

fn default_save_directory() -> PathBuf {
dirs_next::download_dir().unwrap_or(PathBuf::from("/tmp/"))
}

#[derive(Debug, Clone)]
pub struct Server {
/// Address advertised to the remote user to connect to
Expand Down
57 changes: 41 additions & 16 deletions src/buffer/file_transfers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,18 +70,27 @@ impl FileTransfers {
match message {
Message::Approve(id) => {
if let Some(transfer) = file_transfers.get(&id).cloned() {
let save_directory = config.file_transfer.save_directory.clone();
return Task::perform(
async move {
rfd::AsyncFileDialog::new()
.set_directory(save_directory)
.set_file_name(transfer.filename)
.save_file()
.await
.map(|handle| handle.path().to_path_buf())
},
move |path| Message::SavePathSelected(id, path),
);
match &config.file_transfer.save_directory {
Some(save_directory) => {
let file_save_directory = save_directory.join(transfer.filename);
return Task::done(Message::SavePathSelected(
id,
Some(file_save_directory),
));
}
None => {
return Task::perform(
async move {
rfd::AsyncFileDialog::new()
.set_file_name(transfer.filename)
.save_file()
.await
.map(|handle| handle.path().to_path_buf())
},
move |path| Message::SavePathSelected(id, path),
)
}
}
}
}
Message::SavePathSelected(id, path) => {
Expand All @@ -99,6 +108,8 @@ impl FileTransfers {
}

mod transfer_row {
use std::time::Duration;

use super::Message;
use bytesize::ByteSize;
use data::file_transfer::{self, FileTransfer};
Expand Down Expand Up @@ -160,13 +171,25 @@ mod transfer_row {
transferred,
elapsed,
} => {
let transfer_speed = if elapsed.as_secs() == 0 {
let transfer_speed_and_remaining_time = if elapsed.as_secs() == 0 {
String::default()
} else {
let bytes_per_second = *transferred / elapsed.as_secs();
let transfer_speed = ByteSize::b(bytes_per_second);

format!("({transfer_speed}/s)")
let remaining_bytes = transfer.size.saturating_sub(*transferred);
let remaining_time = if bytes_per_second > 0 {
let estimated_seconds = remaining_bytes / bytes_per_second;
let readable_time_left =
humantime::format_duration(Duration::from_secs(estimated_seconds))
.to_string();

format!("| {readable_time_left}")
} else {
String::default()
};

format!("({transfer_speed}/s) {remaining_time}")
};

let transferred = ByteSize::b(*transferred);
Expand All @@ -178,8 +201,10 @@ mod transfer_row {

container(
column![
text(format!("{transferred} of {file_size} {transfer_speed}"))
.style(theme::text::secondary),
text(format!(
"{transferred} of {file_size} {transfer_speed_and_remaining_time}"
))
.style(theme::text::secondary),
progress_bar
]
.spacing(0),
Expand Down
16 changes: 6 additions & 10 deletions src/screen/dashboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -302,16 +302,12 @@ impl Dashboard {
);
}
buffer::user_context::Event::SendFile(server, nick) => {
let starting_directory =
config.file_transfer.save_directory.clone();

return (
Task::batch(vec![
task,
Task::perform(
async move {
rfd::AsyncFileDialog::new()
.set_directory(starting_directory)
.pick_file()
.await
.map(|handle| {
Expand Down Expand Up @@ -737,11 +733,11 @@ impl Dashboard {
command_bar::Configuration::OpenCacheDirectory => {
let _ = open::that_detached(environment::cache_dir());
(Task::none(), None)
},
}
command_bar::Configuration::OpenDataDirectory => {
let _ = open::that_detached(environment::data_dir());
(Task::none(), None)
},
}
command_bar::Configuration::OpenWebsite => {
let _ = open::that_detached(environment::WIKI_WEBSITE);
(Task::none(), None)
Expand Down Expand Up @@ -774,7 +770,9 @@ impl Dashboard {
}
},
command_bar::Command::Window(command) => match command {
command_bar::Window::ToggleFullscreen => (window::toggle_fullscreen(), None),
command_bar::Window::ToggleFullscreen => {
(window::toggle_fullscreen(), None)
}
},
};

Expand Down Expand Up @@ -951,9 +949,7 @@ impl Dashboard {
None,
);
}
ToggleFullscreen => {
return (window::toggle_fullscreen(), None)
},
ToggleFullscreen => return (window::toggle_fullscreen(), None),
}
}
Message::FileTransfer(update) => {
Expand Down