Fix scrolling to current task in download view

This commit is contained in:
Nindi Gill 2023-06-10 00:14:42 +10:00
parent 5491ae6cf5
commit b816ca257f
No known key found for this signature in database
GPG key ID: FF9A7FD590D4F4B1

View file

@ -26,6 +26,7 @@ struct DownloadView: View {
var beta: Bool var beta: Bool
var destinationURL: URL? var destinationURL: URL?
@ObservedObject var taskManager: TaskManager @ObservedObject var taskManager: TaskManager
@State private var currentTaskId: String?
@State private var value: Double = 0 @State private var value: Double = 0
@State private var showAlert: Bool = false @State private var showAlert: Bool = false
@State private var alertType: ProgressAlertType = .cancel @State private var alertType: ProgressAlertType = .cancel
@ -44,26 +45,35 @@ struct DownloadView: View {
} }
var body: some View { var body: some View {
// swiftlint:disable:next closure_body_length
VStack(spacing: 0) { VStack(spacing: 0) {
DownloadHeaderView(imageName: imageName, name: name, version: version, build: build, beta: beta) DownloadHeaderView(imageName: imageName, name: name, version: version, build: build, beta: beta)
Divider() Divider()
List { ScrollViewReader { proxy in
ForEach(taskManager.taskGroups, id: \.section) { taskGroup in List {
Section(header: DownloadSectionHeaderView(section: taskGroup.section)) { ForEach(taskManager.taskGroups, id: \.section) { taskGroup in
ForEach(taskGroup.tasks.indices, id: \.self) { index in Section(header: DownloadSectionHeaderView(section: taskGroup.section)) {
VStack { ForEach(taskGroup.tasks.indices, id: \.self) { index in
DownloadRowView(state: taskGroup.tasks[index].state, description: taskGroup.tasks[index].currentDescription, degrees: degrees) VStack {
if taskGroup.tasks[index].type == .download && taskGroup.tasks[index].state != .pending, DownloadRowView(state: taskGroup.tasks[index].state, description: taskGroup.tasks[index].currentDescription, degrees: degrees)
let size: UInt64 = taskGroup.tasks[index].downloadSize { if taskGroup.tasks[index].type == .download && taskGroup.tasks[index].state != .pending,
DownloadProgressView(state: taskGroup.tasks[index].state, value: value, size: size) let size: UInt64 = taskGroup.tasks[index].downloadSize {
} DownloadProgressView(state: taskGroup.tasks[index].state, value: value, size: size)
if index < taskGroup.tasks.count - 1 { }
Divider() if index < taskGroup.tasks.count - 1 {
Divider()
}
} }
.id("\(taskGroup.section.id).\(index)")
} }
} }
} }
} }
.onChange(of: currentTaskId) { id in
withAnimation(.easeOut(duration: 1.0)) {
proxy.scrollTo(id, anchor: .center)
}
}
} }
Divider() Divider()
HStack { HStack {
@ -111,6 +121,7 @@ struct DownloadView: View {
for taskGroupIndex in taskManager.taskGroups.indices { for taskGroupIndex in taskManager.taskGroups.indices {
for taskIndex in taskManager.taskGroups[taskGroupIndex].tasks.indices { for taskIndex in taskManager.taskGroups[taskGroupIndex].tasks.indices {
currentTaskId = "\(taskManager.taskGroups[taskGroupIndex].section.id).\(taskIndex)"
degrees = 0 degrees = 0
taskManager.taskGroups[taskGroupIndex].tasks[taskIndex].state = .inProgress taskManager.taskGroups[taskGroupIndex].tasks[taskIndex].state = .inProgress
timer = timer.upstream.autoconnect() timer = timer.upstream.autoconnect()