-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAddTrivitView.swift
More file actions
84 lines (78 loc) · 2.79 KB
/
Copy pathAddTrivitView.swift
File metadata and controls
84 lines (78 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//
// AddTrivitView.swift
// trivit Vision
//
// Sheet for creating a new counter
//
import SwiftUI
import SwiftData
struct AddTrivitView: View {
@Environment(\.modelContext) private var modelContext
@Environment(\.dismiss) private var dismiss
@Query(sort: \Trivit.sortOrder) private var trivits: [Trivit]
@State private var title = ""
@State private var selectedColorIndex = 0
var body: some View {
NavigationStack {
Form {
Section("Name") {
TextField("Counter name", text: $title)
}
Section("Color") {
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 5), spacing: 12) {
ForEach(0..<TrivitColors.colorCount, id: \.self) { index in
Circle()
.fill(TrivitColors.color(at: index))
.frame(width: 40, height: 40)
.overlay {
if index == selectedColorIndex {
Circle()
.strokeBorder(.white, lineWidth: 3)
}
}
.hoverEffect(.highlight)
.onTapGesture {
selectedColorIndex = index
}
}
}
.padding(.vertical, 8)
}
}
.navigationTitle("New Counter")
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") {
dismiss()
}
}
ToolbarItem(placement: .confirmationAction) {
Button("Add") {
createTrivit()
dismiss()
}
.disabled(title.trimmingCharacters(in: .whitespaces).isEmpty)
}
}
}
.onAppear {
// Auto-select next color in sequence
let lastColorIndex = trivits.last?.colorIndex ?? -1
selectedColorIndex = (lastColorIndex + 1) % TrivitColors.colorCount
}
}
private func createTrivit() {
let maxSortOrder = trivits.map { $0.sortOrder }.max() ?? -1
let newTrivit = Trivit(
title: title.trimmingCharacters(in: .whitespaces),
count: 0,
colorIndex: selectedColorIndex,
sortOrder: maxSortOrder + 1
)
modelContext.insert(newTrivit)
}
}
#Preview {
AddTrivitView()
.modelContainer(for: [Trivit.self], inMemory: true)
}