Release v2.5.3.1-beta: smart Zstd compression, Blake3 delta-sync, multi-send, pause/resume, priority queue, and 4-part version parser
This commit is contained in:
+54
-10
@@ -391,7 +391,7 @@ impl ZeroSendApp {
|
||||
selected_peer_ids: HashSet::new(),
|
||||
queued_files: initial_files,
|
||||
transfers: Vec::new(),
|
||||
logs: vec!["⚡ ZeroSend v2.5.3-beta ready".to_string()],
|
||||
logs: vec!["⚡ ZeroSend v2.5.3.1-beta ready".to_string()],
|
||||
text_input: String::new(),
|
||||
analyzed_preview: analyze_text(""),
|
||||
recipient_pin: String::new(),
|
||||
@@ -3339,6 +3339,9 @@ impl ZeroSendApp {
|
||||
TransferState::Rejected => {
|
||||
ui.label(RichText::new("⛔ Передача отклонена").color(Color32::RED).size(12.0));
|
||||
}
|
||||
TransferState::Paused => {
|
||||
ui.label(RichText::new("⏸ На паузе").color(Color32::from_rgb(234, 179, 8)).strong().size(13.0));
|
||||
}
|
||||
TransferState::Canceled => {
|
||||
ui.label(RichText::new("🛑 Отменено").color(theme.text_muted).size(12.0));
|
||||
}
|
||||
@@ -3367,7 +3370,15 @@ impl ZeroSendApp {
|
||||
100
|
||||
};
|
||||
|
||||
let size_details = if t.state == TransferState::InProgress {
|
||||
let comp_info = if t.compressed_bytes > 0 && t.compressed_bytes < t.bytes_transferred {
|
||||
let saved_pct = ((t.bytes_transferred.saturating_sub(t.compressed_bytes) as f64 / t.bytes_transferred as f64) * 100.0) as u32;
|
||||
let ratio = t.bytes_transferred as f64 / t.compressed_bytes.max(1) as f64;
|
||||
format!(" • 🗜️ {:.1}x (сжато на {}%)", ratio, saved_pct)
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
||||
let size_details = if t.state == TransferState::InProgress || t.state == TransferState::Paused {
|
||||
let speed = t.speed_bps.max(1);
|
||||
let remaining_bytes = t.total_bytes.saturating_sub(t.bytes_transferred);
|
||||
let eta_secs = remaining_bytes / speed;
|
||||
@@ -3380,19 +3391,22 @@ impl ZeroSendApp {
|
||||
};
|
||||
|
||||
let speed_mb = (t.speed_bps as f64) / 1_048_576.0;
|
||||
let state_prefix = if t.state == TransferState::Paused { "⏸ На паузе • " } else { "" };
|
||||
format!(
|
||||
"{} / {} ({}%) • ⚡ {:.1} MB/s • {}",
|
||||
"{}{} / {} ({}%) • ⚡ {:.1} MB/s • {}{}",
|
||||
state_prefix,
|
||||
human_bytes(t.bytes_transferred as f64),
|
||||
human_bytes(t.total_bytes as f64),
|
||||
progress_pct,
|
||||
speed_mb,
|
||||
eta_str
|
||||
eta_str,
|
||||
comp_info
|
||||
)
|
||||
} else if is_done {
|
||||
if t.checksum_verified {
|
||||
format!("Доставлено • Размер: {} • 🛡️ SHA-256 Проверено", human_bytes(t.total_bytes as f64))
|
||||
format!("Доставлено • Размер: {}{} • 🛡️ SHA-256 Проверено", human_bytes(t.total_bytes as f64), comp_info)
|
||||
} else {
|
||||
format!("Доставлено • Размер: {}", human_bytes(t.total_bytes as f64))
|
||||
format!("Доставлено • Размер: {}{}", human_bytes(t.total_bytes as f64), comp_info)
|
||||
}
|
||||
} else {
|
||||
format!("Размер: {}", human_bytes(t.total_bytes as f64))
|
||||
@@ -3433,6 +3447,30 @@ impl ZeroSendApp {
|
||||
let _ = std::process::Command::new("explorer").arg(&target_file).spawn();
|
||||
}
|
||||
});
|
||||
} else if is_active || t.state == TransferState::Paused {
|
||||
ui.with_layout(Layout::right_to_left(Align::Center), |ui| {
|
||||
let client_c = self.client.clone();
|
||||
let s_id = t.session_id.clone();
|
||||
if t.state == TransferState::Paused {
|
||||
let resume_btn = Button::new(RichText::new("▶️ Продолжить").strong().color(Color32::WHITE))
|
||||
.fill(Color32::from_rgb(34, 197, 94))
|
||||
.rounding(Rounding::same(6.0));
|
||||
if ui.add(resume_btn).clicked() {
|
||||
tokio::spawn(async move {
|
||||
client_c.resume_transfer(&s_id).await;
|
||||
});
|
||||
}
|
||||
} else {
|
||||
let pause_btn = Button::new(RichText::new("⏸ Пауза").strong().color(Color32::WHITE))
|
||||
.fill(Color32::from_rgb(234, 179, 8))
|
||||
.rounding(Rounding::same(6.0));
|
||||
if ui.add(pause_btn).clicked() {
|
||||
tokio::spawn(async move {
|
||||
client_c.pause_transfer(&s_id).await;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -3952,13 +3990,18 @@ impl ZeroSendApp {
|
||||
.stroke(theme.stroke_border)
|
||||
.inner_margin(Margin::same(14.0))
|
||||
.show(ui, |ui| {
|
||||
// v2.5.3-beta
|
||||
// v2.5.3.1-beta
|
||||
ui.horizontal(|ui| {
|
||||
ui.label(RichText::new("v2.5.3-beta").strong().color(Color32::from_rgb(34, 197, 94)));
|
||||
ui.label(RichText::new("v2.5.3.1-beta").strong().color(Color32::from_rgb(34, 197, 94)));
|
||||
ui.label(RichText::new("(Текущая версия)").size(11.0).color(Color32::GRAY));
|
||||
});
|
||||
ui.label(" • ⚡ Потоковая передача папок: Zip-на-лету через tar.zst — папки стримятся напрямую без создания временных файлов на диске.");
|
||||
ui.label(" • 🗜️ Zstandard (Zstd) сжатие: Мгновенное сжатие уровня 1-3 в потоке — до 4-8x прирост скорости на 100Mбит и VPN-каналах.");
|
||||
ui.label(" • 🗜️ Умная Zstd-компрессия: Автоматический пропуск уже сжатых файлов (.jpg, .mp4, .zip, .rar...) и сжатие кода/текста/документов.");
|
||||
ui.label(" • 🔄 Delta-transfer для Auto-Sync: Blake3 хэширование и кэш измененных файлов — синхронизация только изменений без повторной передачи.");
|
||||
ui.label(" • 👥 Мульти-отправка: Параллельная передача выбранных файлов сразу нескольким друзьям.");
|
||||
ui.label(" • ⏸️ Пауза и возобновление: Кнопки паузы/продолжения передачи прямо в дашборде мониторинга.");
|
||||
ui.label(" • 🏎️ Очередь с приоритетами: Маленькие файлы передаются первыми для мгновенного завершения.");
|
||||
ui.label(" • 📊 Мониторинг сжатия: Отображение реального коэффициента сжатия и сэкономленного трафика.");
|
||||
ui.label(" • 🏷️ Умный парсер версий: Поддержка 4-значных номеров (2.5.3.1) и автоматическое определение Beta-релизов.");
|
||||
ui.add_space(8.0);
|
||||
ui.separator();
|
||||
ui.add_space(8.0);
|
||||
@@ -4329,6 +4372,7 @@ impl ZeroSendApp {
|
||||
speed_bps: 0,
|
||||
state: TransferState::InProgress,
|
||||
checksum_verified: false,
|
||||
compressed_bytes: 0,
|
||||
};
|
||||
|
||||
if let Some(pos) = self.transfers.iter().position(|x| x.session_id == session_id) {
|
||||
|
||||
Reference in New Issue
Block a user