9024b87934
Spawn file operations on background threads and show the existing ProgressDialog (gauge, sparkline, ETA, cancel button) while the operation runs. The event loop polls the result channel every frame and applies the outcome when the thread finishes. - DialogState::Progress variant added - PendingProgressOp tracks kind/sources/destination/result channel - spawn_op_with_progress() spawns thread + shows modal progress - tick_progress() polls channel, handles Ok/Err/Empty/Disconnected - ProgressDialog Cancel key (Enter) cancels the OpHandle - Tab toggles focus on the cancel button - Wired into app.rs event loop (re-render every tick while running) Tests: 1381 pass, zero warnings.