ExpandableSetting.swift 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //
  2. // ExpandableSetting.swift
  3. // LoopKitUI
  4. //
  5. // Created by Michael Pangburn on 5/15/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. public struct ExpandableSetting<
  10. LeadingValueContent: View,
  11. TrailingValueContent: View,
  12. ExpandedContent: View
  13. >: View {
  14. @Binding var isEditing: Bool
  15. var leadingValueContent: LeadingValueContent
  16. var trailingValueContent: TrailingValueContent
  17. var expandedContent: () -> ExpandedContent
  18. public init(
  19. isEditing: Binding<Bool>,
  20. @ViewBuilder leadingValueContent: () -> LeadingValueContent,
  21. @ViewBuilder trailingValueContent: () -> TrailingValueContent,
  22. @ViewBuilder expandedContent: @escaping () -> ExpandedContent
  23. ) {
  24. self._isEditing = isEditing
  25. self.leadingValueContent = leadingValueContent()
  26. self.trailingValueContent = trailingValueContent()
  27. self.expandedContent = expandedContent
  28. }
  29. public var body: some View {
  30. VStack(spacing: 0) {
  31. HStack {
  32. leadingValueContent
  33. Spacer()
  34. trailingValueContent
  35. .fixedSize(horizontal: true, vertical: false)
  36. }
  37. .accessibilityElement(children: .combine)
  38. .contentShape(Rectangle())
  39. .onTapGesture {
  40. withAnimation {
  41. self.isEditing.toggle()
  42. }
  43. }
  44. if isEditing {
  45. expandedContent()
  46. .padding(.horizontal, -8)
  47. .transition(.fadeInFromTop)
  48. }
  49. }
  50. }
  51. }
  52. extension ExpandableSetting where LeadingValueContent == EmptyView {
  53. public init(
  54. isEditing: Binding<Bool>,
  55. @ViewBuilder valueContent: () -> TrailingValueContent,
  56. @ViewBuilder expandedContent: @escaping () -> ExpandedContent
  57. ) {
  58. self.init(isEditing: isEditing, leadingValueContent: EmptyView.init, trailingValueContent: valueContent, expandedContent: expandedContent)
  59. }
  60. }