diff --git a/CHANGELOG.md b/CHANGELOG.md index 6617430..19b4f99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog - PS5 Upload Suite +## Version 4.2.1 - Bugfix Release (February 8, 2026) + +### ๐Ÿ› Bug Fixes + +#### UI Scrolling Fix +- **Fixed connection panel eating screen space** - Added `MaxHeight` constraint (250px) and `ScrollViewer` to the connection/payload settings panel +- **Fixed header overflow** - Added `MaxHeight="120"` to header row +- **Fixed content area too small** - Added `MinHeight="200"` to main content area +- When the Auto-send Payload Expander was open, it consumed half the screen leaving no room for file lists + +#### File Counting Fix +- **Fixed chunked files never counting as completed** - `fileChunkCounts` was set to the actual number of chunks (e.g., 4 for a 2GB file), but `UploadFileParallelAsync` handles all chunks internally as a single Task. The main loop only saw 1 task completion per file, so chunked files never reached their completion threshold +- Now correctly sets `fileChunkCounts = 1` per file since each file = 1 task + +#### Progress Display Fix +- **Fixed progress appearing frozen during heavy uploads** - All UI updates used `DispatcherPriority.Background` (lowest priority), which got starved when 24 parallel connections flooded the dispatcher queue +- Upgraded `UpdateUploadStats` to `DispatcherPriority.Normal` +- Upgraded per-file progress bars to `DispatcherPriority.Render` +- Progress now updates smoothly even at 95%+ network saturation + +--- + ## Version 4.2.0 - Game Mounter Integration (February 7, 2026) ### ๐ŸŽฎ Game Mounter Integration diff --git a/README.md b/README.md index 3e086f7..1b12fc7 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,19 @@ **By Manos** -**Version 4.2.0 - Game Mounter Integration** +**Version 4.2.1 - Bugfix Release** Custom high-speed file transfer system for PS5 with etaHEN. Achieves **104+ MB/s** upload speeds for large files using parallel chunked uploads! -โญ **NEW in v4.2.0:** +โญ **NEW in v4.2.1 (Bugfix):** +- ๐Ÿ–ฅ๏ธ **Fixed UI scrolling** - Connection panel no longer eats half the screen +- ๐Ÿ”ข **Fixed file counting** - Chunked files now count correctly as completed +- ๐Ÿ“Š **Fixed frozen progress** - Progress updates no longer freeze during heavy uploads + +โญ **v4.2.0 Features:** - ๐ŸŽฎ **Mount Games Button** - Mount uploaded games directly from the client - ๐Ÿ” **Multi-Path Scanning** - Scans internal storage, USB drives (0-3), and M.2 SSD -- ๏ฟฝ **Duplicate Detection** - Skips already-mounted games automatically +- ๐Ÿ”„ **Duplicate Detection** - Skips already-mounted games automatically - ๐Ÿ“Š **Mount Summary** - Detailed results with PS5 notifications - ๐Ÿงน **Auto-Cleanup** - Removes mount entries for deleted games diff --git a/client/MainWindow.xaml b/client/MainWindow.xaml index 778388e..7009110 100644 --- a/client/MainWindow.xaml +++ b/client/MainWindow.xaml @@ -66,10 +66,10 @@ + - - + @@ -119,7 +119,9 @@ BorderThickness="1" CornerRadius="4" Padding="15" - Margin="0,0,0,15"> + Margin="0,0,0,15" + MaxHeight="250"> + @@ -323,6 +325,7 @@ + diff --git a/client/MainWindow.xaml.cs b/client/MainWindow.xaml.cs index f66d623..c22d5ef 100644 --- a/client/MainWindow.xaml.cs +++ b/client/MainWindow.xaml.cs @@ -408,7 +408,7 @@ namespace PS5Upload private void UpdateUploadStats(int completedFiles, int activeTaskCount) { // CRITICAL FIX: Use InvokeAsync instead of Invoke to prevent UI freezing - // When uploading thousands of small files, Invoke blocks the UI thread + // Use Normal priority (not Background) so updates aren't starved during heavy uploads Dispatcher.InvokeAsync(() => { // Update files remaining counter @@ -491,7 +491,7 @@ namespace PS5Upload { UploadFileNameText.Text = $"Uploading {activeTaskCount} files in parallel..."; } - }, System.Windows.Threading.DispatcherPriority.Background); + }, System.Windows.Threading.DispatcherPriority.Normal); } private void Log(string message) @@ -1158,11 +1158,9 @@ namespace PS5Upload taskIsLargeFile[task] = isLargeFile; taskIsHugeFile[task] = isHugeFile; - long chunkSizeForFile = fileSize >= HugeFileThresholdBytes ? HugeFileChunkSizeBytes : DefaultChunkSizeBytes; - int chunkCount = fileSize > ChunkThresholdBytes - ? (int)((fileSize + chunkSizeForFile - 1) / chunkSizeForFile) - : 1; - fileChunkCounts[localPath] = chunkCount; + // Each file is ONE task (UploadFileParallelAsync handles chunks internally) + // So chunkCount must always be 1 for the completion counter to work + fileChunkCounts[localPath] = 1; fileChunksCompleted[localPath] = 0; } @@ -1625,7 +1623,7 @@ namespace PS5Upload { UploadProgressBar.Value = filePercent; UploadProgressText.Text = $"{FormatFileSize(aggregateBytes)} / {FormatFileSize(fileInfo.Length)} ({filePercent:F1}%)"; - }, System.Windows.Threading.DispatcherPriority.Background); + }, System.Windows.Threading.DispatcherPriority.Render); if (aggregateBytes == fileInfo.Length || aggregateBytes - previousLoggedBytes >= ChunkLogIntervalBytes) { @@ -1686,7 +1684,7 @@ namespace PS5Upload { UploadProgressBar.Value = filePercent; UploadProgressText.Text = $"{FormatFileSize(p.BytesSent)} / {FormatFileSize(fileInfo.Length)} ({filePercent:F1}%)"; - }, System.Windows.Threading.DispatcherPriority.Background); + }, System.Windows.Threading.DispatcherPriority.Render); if (p.BytesSent == p.TotalBytes || p.BytesSent - previousLoggedBytes >= SmallFileLogIntervalBytes) {