TabCustomizationSettingsView.swift 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // LoopFollow
  2. // TabCustomizationSettingsView.swift
  3. // Created by Jonas Björkert.
  4. import SwiftUI
  5. struct TabCustomizationSettingsView: View {
  6. // MARK: - Local State
  7. @State private var alarmsPosition: TabPosition
  8. @State private var remotePosition: TabPosition
  9. @State private var nightscoutPosition: TabPosition
  10. init() {
  11. _alarmsPosition = State(initialValue: Storage.shared.alarmsPosition.value)
  12. _remotePosition = State(initialValue: Storage.shared.remotePosition.value)
  13. _nightscoutPosition = State(initialValue: Storage.shared.nightscoutPosition.value)
  14. }
  15. var body: some View {
  16. Form {
  17. Section("Tab Positions") {
  18. TabPositionRow(
  19. title: "Alarms",
  20. icon: "alarm",
  21. position: $alarmsPosition,
  22. otherPositions: [remotePosition, nightscoutPosition]
  23. )
  24. TabPositionRow(
  25. title: "Remote",
  26. icon: "antenna.radiowaves.left.and.right",
  27. position: $remotePosition,
  28. otherPositions: [alarmsPosition, nightscoutPosition]
  29. )
  30. TabPositionRow(
  31. title: "Nightscout",
  32. icon: "safari",
  33. position: $nightscoutPosition,
  34. otherPositions: [alarmsPosition, remotePosition]
  35. )
  36. }
  37. Section {
  38. Text("• Tab 2 and Tab 4 can each hold one item")
  39. Text("• Items in 'More Menu' appear under the last tab")
  40. Text("• Hidden items are not accessible")
  41. }
  42. }
  43. .navigationTitle("Tab Settings")
  44. .navigationBarTitleDisplayMode(.inline)
  45. .onDisappear {
  46. Storage.shared.alarmsPosition.value = alarmsPosition
  47. Storage.shared.remotePosition.value = remotePosition
  48. Storage.shared.nightscoutPosition.value = nightscoutPosition
  49. }
  50. }
  51. }
  52. struct TabPositionRow: View {
  53. let title: String
  54. let icon: String
  55. @Binding var position: TabPosition
  56. let otherPositions: [TabPosition]
  57. var availablePositions: [TabPosition] {
  58. TabPosition.allCases.filter { tabPosition in
  59. // Always allow current position and disabled/more
  60. if tabPosition == position || tabPosition == .more || tabPosition == .disabled {
  61. return true
  62. }
  63. // Otherwise, only allow if not taken by another position
  64. return !otherPositions.contains(tabPosition)
  65. }
  66. }
  67. var body: some View {
  68. HStack {
  69. Image(systemName: icon)
  70. .frame(width: 30)
  71. .foregroundColor(.accentColor)
  72. Text(title)
  73. Spacer()
  74. Picker(title, selection: $position) {
  75. ForEach(availablePositions, id: \.self) { pos in
  76. Text(pos.displayName).tag(pos)
  77. }
  78. }
  79. .pickerStyle(.menu)
  80. .labelsHidden()
  81. }
  82. }
  83. }