SingleSelectionCheckList.swift 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //
  2. // SingleSelectionCheckList.swift
  3. // LoopKitUI
  4. //
  5. // Created by Nathaniel Hamming on 2022-09-09.
  6. // Copyright © 2022 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. public struct SingleSelectionCheckList<Item: Hashable>: View {
  10. let header: String?
  11. let footer: String?
  12. let items: [Item]
  13. @Binding var selectedItem: Item
  14. public init(header: String? = nil,
  15. footer: String? = nil,
  16. items: [Item],
  17. selectedItem: Binding<Item>,
  18. formatter: ((Item) -> Item)? = nil) {
  19. self.header = header
  20. self.footer = footer
  21. self.items = items
  22. _selectedItem = selectedItem
  23. }
  24. public var body: some View {
  25. Section(header: header.map { Text($0) }, footer: footer.map { Text($0) }) {
  26. ForEach(items, id:\.self) { item in
  27. CheckSelectionRow<Item>(item: item,
  28. selectedItem: self.$selectedItem)
  29. }
  30. }
  31. }
  32. }
  33. struct CheckSelectionRow<Item>: View where Item: Hashable {
  34. var item: Item
  35. @Binding var selectedItem: Item
  36. var isSelected: Bool {
  37. selectedItem == item
  38. }
  39. var body: some View {
  40. HStack {
  41. Button(action: { selectedItem = item } ) {
  42. Text(String(describing: item))
  43. .foregroundColor(.primary)
  44. }
  45. Spacer()
  46. if isSelected {
  47. Image(systemName: "checkmark.circle.fill")
  48. .foregroundColor(.accentColor)
  49. }
  50. }
  51. }
  52. }
  53. struct SingleSelectionCheckList_Previews: PreviewProvider {
  54. static var previews: some View {
  55. PreviewWrapper()
  56. }
  57. struct PreviewWrapper: View {
  58. enum Shape: String, CaseIterable {
  59. case square = "Square"
  60. case circle = "Circle"
  61. case triangle = "Triangle"
  62. case rectangle = "Rectangle"
  63. }
  64. @State var selectedFruit: Shape = .square
  65. var body: some View {
  66. SingleSelectionCheckList<Shape>(items: Shape.allCases,
  67. selectedItem: $selectedFruit)
  68. }
  69. }
  70. }