adwaita.docc/Resources/TaskList/TaskList18.swift

87 lines
2.0 KiB
Swift

//
// TaskList.swift
// Subtasks
//
import Adwaita
struct TaskList: View {
@Binding var tasks: [Task]
@State private var showAddDialog = false
@State private var addDialogText = ""
@State private var focusEntry: Signal = .init()
var view: Body {
ScrollView {
list
}
.topToolbar {
HeaderBar.start {
Button(icon: .default(icon: .listAdd)) {
showAddDialog = true
focusEntry.signal()
}
}
}
.dialog(visible: $showAddDialog, id: "add") {
dialog
}
}
var list: AnyView {
List(tasks, selection: nil) { task in
taskRow(task: task)
}
.boxedList()
.valign(.start)
.padding(20)
.frame(maxWidth: 500)
}
var dialog: AnyView {
Form {
EntryRow("Label", text: $addDialogText)
.frame(minWidth: 250)
.focus(focusEntry)
}
.padding(20)
.valign(.start)
.topToolbar {
HeaderBar {
Button("Cancel") {
cancel()
}
} end: {
Button("Add") {
tasks.append(.init(label: addDialogText))
cancel()
}
.suggested()
}
.showEndTitleButtons(false)
}
}
func taskRow(task: Task) -> AnyView {
ActionRow()
.title(task.label)
.prefix {
CheckButton()
.active($tasks[id: task.id, default: .init(label: "")].done)
.selectionMode()
.valign(.center)
}
.suffix {
ButtonContent()
.iconName(Icon.default(icon: .goNext).string)
}
}
func cancel() {
showAddDialog = false
addDialogText = ""
}
}