Improvements to download menu
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
17
src/app/componets/ProgressBar.tsx
Normal file
17
src/app/componets/ProgressBar.tsx
Normal 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>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user