Improvements to download menu

This commit is contained in:
2025-11-05 11:52:04 -07:00
parent 8c00a3e553
commit 6677e22ab6
4 changed files with 51 additions and 9 deletions

View File

@@ -150,12 +150,12 @@ async fn download(
downloaded += chunk.len() as u64; downloaded += chunk.len() as u64;
let progress = if total_size > 0 { let progress = if total_size > 0 {
(downloaded * 100 / total_size) as u8 (downloaded as f64 / total_size as f64) * 100.0
} else { } else {
0 0.0
}; };
app.emit("download-progress", format!("{}:{}", &name, progress)) app.emit("download-progress", format!("{}:{:.8}:{}", &name, progress, downloaded))
.unwrap(); .unwrap();
} }

View File

@@ -0,0 +1,17 @@
type ProgressBarProps = {
progress: number
className?: string
}
export default function ProgressBar ({ progress, className }: ProgressBarProps) {
return (
<div
className={`w-full bg-(--col1) border border-(--col5) rounded-full h-4 overflow-hidden ${className}`}
>
<div
className='bg-(--col8) border-r border-r-(--col5) h-full'
style={{ width: `${progress}%` }}
/>
</div>
)
}

View File

@@ -42,6 +42,8 @@ import { listen } from '@tauri-apps/api/event'
import { usePathname } from 'next/navigation' import { usePathname } from 'next/navigation'
import { arch, platform } from '@tauri-apps/plugin-os' import { arch, platform } from '@tauri-apps/plugin-os'
import VersionInfo from './componets/VersionInfo' import VersionInfo from './componets/VersionInfo'
import prettyBytes from 'pretty-bytes'
import ProgressBar from './componets/ProgressBar'
const roboto = Roboto({ const roboto = Roboto({
subsets: ['latin'] subsets: ['latin']
@@ -113,13 +115,14 @@ export default function RootLayout ({
let unlistenUninstalled: (() => void) | null = null let unlistenUninstalled: (() => void) | null = null
listen<string>('download-progress', event => { listen<string>('download-progress', event => {
const [versionName, progStr] = event.payload.split(':') const [versionName, progStr, totalSizeStr] = event.payload.split(':')
const prog = Number(progStr) const prog = Number(progStr)
const progBytes = Number(totalSizeStr)
setDownloadProgress(prev => { setDownloadProgress(prev => {
const i = prev.findIndex(d => d.version === versionName) const i = prev.findIndex(d => d.version === versionName)
if (i === -1) return prev if (i === -1) return prev
const copy = [...prev] const copy = [...prev]
copy[i] = { ...copy[i], progress: prog } copy[i] = { ...copy[i], progress: prog, progressBytes: progBytes }
return copy return copy
}) })
}).then(f => (unlistenProgress = f)) }).then(f => (unlistenProgress = f))
@@ -268,7 +271,7 @@ export default function RootLayout ({
setSelectedVersionList([]) setSelectedVersionList([])
const newDownloads = list.map( const newDownloads = list.map(
version => new DownloadProgress(version, 0, false, true, false, false) version => new DownloadProgress(version, 0, 0, false, true, false, false)
) )
setDownloadProgress(newDownloads) setDownloadProgress(newDownloads)
@@ -655,9 +658,30 @@ export default function RootLayout ({
Finishing... Finishing...
</span> </span>
) : ( ) : (
<span> <div className='flex flex-col gap-1 w-full'>
Downloading: {v.progress}% done <span>
</span> Downloading: {Math.floor(v.progress)}%
of (
{prettyBytes(v.progressBytes, {
minimumFractionDigits: 1,
maximumFractionDigits: 1
})}
/
{prettyBytes(
getVersionInfo(v.version)?.size ??
0,
{
minimumFractionDigits: 1,
maximumFractionDigits: 1
}
)}
)
</span>
<ProgressBar
progress={v.progress}
className='w-full'
/>
</div>
)} )}
</div> </div>
</div> </div>

View File

@@ -2,6 +2,7 @@ export class DownloadProgress {
constructor( constructor(
public version: string, public version: string,
public progress: number, public progress: number,
public progressBytes: number,
public failed: boolean, public failed: boolean,
public queued: boolean, public queued: boolean,
public hash_checking: boolean, public hash_checking: boolean,