Selaa lähdekoodia

Moved nsloader main trigger to not fire twice at first load
added BGText color option
refactored settings VC for easier code reading

Jon Fawcett 6 vuotta sitten
vanhempi
commit
c410abf5d2

+ 56 - 21
LoopFollow/Controllers/MainViewController.swift

@@ -134,7 +134,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         infoTable.dataSource = self
         infoTable.dataSource = self
         
         
         // Load Data
         // Load Data
-        nightscoutLoader()
+        appCameToForeground()
         
         
     }
     }
     
     
@@ -220,7 +220,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     }
     }
     
     
     // Main loader for all data
     // Main loader for all data
-    func nightscoutLoader() {
+    func nightscoutLoader(forceLoad: Bool = false) {
         
         
         var needsLoaded: Bool = false
         var needsLoaded: Bool = false
         var onlyPullLastRecord = false
         var onlyPullLastRecord = false
@@ -240,6 +240,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             needsLoaded = true
             needsLoaded = true
         }
         }
         
         
+        if forceLoad { needsLoaded = true}
         // Only do the network calls if we don't have a current reading
         // Only do the network calls if we don't have a current reading
         if needsLoaded {
         if needsLoaded {
             loadDeviceStatus(urlUser: urlUser)
             loadDeviceStatus(urlUser: urlUser)
@@ -824,11 +825,11 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             bgChartEntry.append(value)
             bgChartEntry.append(value)
             
             
             if Double(entries[i].sgv) >= Double(UserDefaultsRepository.highLine.value) {
             if Double(entries[i].sgv) >= Double(UserDefaultsRepository.highLine.value) {
-                colors.append(NSUIColor.yellow)
+                colors.append(NSUIColor.systemYellow)
             } else if Double(entries[i].sgv) <= Double(UserDefaultsRepository.lowLine.value) {
             } else if Double(entries[i].sgv) <= Double(UserDefaultsRepository.lowLine.value) {
-                colors.append(NSUIColor.red)
+                colors.append(NSUIColor.systemRed)
             } else {
             } else {
-                colors.append(NSUIColor.green)
+                colors.append(NSUIColor.systemGreen)
             }
             }
         }
         }
         
         
@@ -839,7 +840,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             // Add 1 hour of predictions
             // Add 1 hour of predictions
             while i < 12 {
             while i < 12 {
                 var predictionVal = Double(predictionData[i])
                 var predictionVal = Double(predictionData[i])
-                // Below can be turned on to prevent out of range opn the graph if needed.
+                // Below can be turned on to prevent out of range on the graph if desired.
+                // It currently just drops them out of view
                 if predictionVal > 400 {
                 if predictionVal > 400 {
                //     predictionVal = 400
                //     predictionVal = 400
                 } else if predictionVal < 0 {
                 } else if predictionVal < 0 {
@@ -855,7 +857,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         
         
         let line1 = LineChartDataSet(entries:bgChartEntry, label: "")
         let line1 = LineChartDataSet(entries:bgChartEntry, label: "")
         line1.circleRadius = 3
         line1.circleRadius = 3
-        line1.circleColors = [NSUIColor.green]
+        line1.circleColors = [NSUIColor.systemGreen]
         line1.drawCircleHoleEnabled = false
         line1.drawCircleHoleEnabled = false
         if UserDefaultsRepository.showLines.value {
         if UserDefaultsRepository.showLines.value {
             line1.lineWidth = 2
             line1.lineWidth = 2
@@ -883,13 +885,13 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         //Add lower red line based on low alert value
         //Add lower red line based on low alert value
         let ll = ChartLimitLine()
         let ll = ChartLimitLine()
         ll.limit = Double(UserDefaultsRepository.lowLine.value)
         ll.limit = Double(UserDefaultsRepository.lowLine.value)
-        ll.lineColor = NSUIColor.red
+        ll.lineColor = NSUIColor.systemRed
         BGChart.rightAxis.addLimitLine(ll)
         BGChart.rightAxis.addLimitLine(ll)
         
         
         //Add upper yellow line based on low alert value
         //Add upper yellow line based on low alert value
         let ul = ChartLimitLine()
         let ul = ChartLimitLine()
         ul.limit = Double(UserDefaultsRepository.highLine.value)
         ul.limit = Double(UserDefaultsRepository.highLine.value)
-        ul.lineColor = NSUIColor.yellow
+        ul.lineColor = NSUIColor.systemYellow
         BGChart.rightAxis.addLimitLine(ul)
         BGChart.rightAxis.addLimitLine(ul)
         
         
         BGChart.xAxis.valueFormatter = ChartXValueFormatter()
         BGChart.xAxis.valueFormatter = ChartXValueFormatter()
@@ -908,6 +910,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         BGChart.data = data
         BGChart.data = data
         BGChart.setExtraOffsets(left: 10, top: 10, right: 10, bottom: 10)
         BGChart.setExtraOffsets(left: 10, top: 10, right: 10, bottom: 10)
         BGChart.setVisibleXRangeMinimum(10)
         BGChart.setVisibleXRangeMinimum(10)
+        BGChart.drawGridBackgroundEnabled = true
+        BGChart.gridBackgroundColor = NSUIColor.secondarySystemBackground
         if firstStart {
         if firstStart {
             BGChart.zoom(scaleX: 18, scaleY: 1, x: 1, y: 1)
             BGChart.zoom(scaleX: 18, scaleY: 1, x: 1, y: 1)
             firstStart = false
             firstStart = false
@@ -968,6 +972,8 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             }
             }
             
             
             BGText.text = bgOutputFormat(bg: Double(latestBG), mmol: mmol)
             BGText.text = bgOutputFormat(bg: Double(latestBG), mmol: mmol)
+            setBGTextColor()
+
             MinAgoText.text = String(Int(deltaTime)) + " min ago"
             MinAgoText.text = String(Int(deltaTime)) + " min ago"
             print(String(Int(deltaTime)) + " min ago")
             print(String(Int(deltaTime)) + " min ago")
             if let directionBG = entries[latestEntryi].direction {
             if let directionBG = entries[latestEntryi].direction {
@@ -996,6 +1002,22 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         checkAlarms(bgs: entries)
         checkAlarms(bgs: entries)
     }
     }
 
 
+    func setBGTextColor() {
+        let latestBG = bgData[bgData.count - 1].sgv
+        if UserDefaultsRepository.colorBGText.value {
+            if latestBG >= UserDefaultsRepository.highLine.value {
+                BGText.textColor = NSUIColor.systemYellow
+            } else if latestBG <= UserDefaultsRepository.lowLine.value {
+                BGText.textColor = NSUIColor.systemRed
+            } else {
+                BGText.textColor = NSUIColor.systemGreen
+            }
+        } else {
+            BGText.textColor = NSUIColor.label
+        }
+        
+    }
+    
     func bgOutputFormat(bg: Double, mmol: Bool) -> String {
     func bgOutputFormat(bg: Double, mmol: Bool) -> String {
         if !mmol {
         if !mmol {
             return String(format:"%.0f", bg)
             return String(format:"%.0f", bg)
@@ -1015,7 +1037,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
         return graphics[value]!
         return graphics[value]!
     }
     }
     
     
-    // Write calendar. Not implemented yet
+    // Write calendar
     func writeCalendar() {
     func writeCalendar() {
         store.requestAccess(to: .event) {(granted, error) in
         store.requestAccess(to: .event) {(granted, error) in
         if !granted { return }
         if !granted { return }
@@ -1113,10 +1135,15 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             
             
             // Check Urgent Low
             // Check Urgent Low
             if UserDefaultsRepository.alertUrgentLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value &&
             if UserDefaultsRepository.alertUrgentLowActive.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value &&
-            currentBG <= UserDefaultsRepository.alertUrgentLowBG.value && !UserDefaultsRepository.alertUrgentLowIsSnoozed.value {
-                AlarmSound.whichAlarm = "Urgent Low Alert"
-                triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime)
-                return
+            currentBG <= UserDefaultsRepository.alertUrgentLowBG.value {
+                // Separating this makes it so the low or drop alerts won't trigger if they already snoozed the urgent low
+                if !UserDefaultsRepository.alertUrgentLowIsSnoozed.value {
+                    AlarmSound.whichAlarm = "Urgent Low Alert"
+                    triggerAlarm(sound: UserDefaultsRepository.alertUrgentLowSound.value, snooozedBGReadingTime: currentBGTime)
+                    return
+                } else {
+                    return
+                }
             }
             }
             
             
             // Check Low
             // Check Low
@@ -1127,6 +1154,20 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
                 return
                 return
             }
             }
             
             
+            // Check Urgent High
+            if UserDefaultsRepository.alertUrgentHighActive.value && !UserDefaultsRepository.alertUrgentHighIsSnoozed.value &&
+            currentBG >= UserDefaultsRepository.alertUrgentHighBG.value {
+                // Separating this makes it so the high or rise alerts won't trigger if they already snoozed the urgent low
+                if !UserDefaultsRepository.alertUrgentHighIsSnoozed.value {
+                        AlarmSound.whichAlarm = "Urgent High Alert"
+                        triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime)
+                        return
+                } else {
+                    return
+                }
+                
+            }
+            
             // Check High
             // Check High
             if UserDefaultsRepository.alertHighActive.value && !UserDefaultsRepository.alertHighIsSnoozed.value &&
             if UserDefaultsRepository.alertHighActive.value && !UserDefaultsRepository.alertHighIsSnoozed.value &&
             currentBG >= UserDefaultsRepository.alertHighBG.value && !UserDefaultsRepository.alertHighIsSnoozed.value {
             currentBG >= UserDefaultsRepository.alertHighBG.value && !UserDefaultsRepository.alertHighIsSnoozed.value {
@@ -1135,13 +1176,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
                 return
                 return
             }
             }
             
             
-            // Check Urgent High
-            if UserDefaultsRepository.alertUrgentHighActive.value && !UserDefaultsRepository.alertUrgentHighIsSnoozed.value &&
-            currentBG >= UserDefaultsRepository.alertUrgentHighBG.value && !UserDefaultsRepository.alertUrgentHighIsSnoozed.value {
-                AlarmSound.whichAlarm = "Urgent High Alert"
-                triggerAlarm(sound: UserDefaultsRepository.alertUrgentHighSound.value, snooozedBGReadingTime: currentBGTime)
-                return
-            }
+            
             
             
             // Check Fast Drop
             // Check Fast Drop
             if UserDefaultsRepository.alertFastDropActive.value && !UserDefaultsRepository.alertFastDropIsSnoozed.value {
             if UserDefaultsRepository.alertFastDropActive.value && !UserDefaultsRepository.alertFastDropIsSnoozed.value {

+ 201 - 158
LoopFollow/Controllers/SettingsViewController.swift

@@ -25,15 +25,7 @@ class SettingsViewController: FormViewController {
             overrideUserInterfaceStyle = .dark
             overrideUserInterfaceStyle = .dark
         }
         }
         
         
-        //array of calendars
-        let store = EKEventStore()
-        let ekCalendars = store.calendars(for: EKEntityType.event)
-        var calendars: [cal] = []
-        for i in 0..<ekCalendars.count{
-            
-            let item = cal(title: ekCalendars[i].title, identifier: ekCalendars[i].calendarIdentifier)
-            calendars.append(item)
-        }
+        
       
       
         form +++ Section("Nightscout Settings")
         form +++ Section("Nightscout Settings")
             <<< TextRow(){ row in
             <<< TextRow(){ row in
@@ -44,173 +36,224 @@ class SettingsViewController: FormViewController {
                 guard let value = row.value else { return }
                 guard let value = row.value else { return }
                 UserDefaultsRepository.url.value = value.lowercased()
                 UserDefaultsRepository.url.value = value.lowercased()
                 }
                 }
-        +++ Section("General Settings")
+        
+
+        buildGeneralSettings()
+        buildAlarmSettings()
+        buildGraphSettings()
+        buildWatchSettings()
+        
+        
+        
+            
+        
+         }
+    
+    func buildGeneralSettings() {
+        form
+            +++ Section("General Settings")
+        <<< SwitchRow("colorBGText") { row in
+        row.title = "Color Main BG Text"
+        row.value = UserDefaultsRepository.colorBGText.value
+        }.onChange { [weak self] row in
+            guard let value = row.value else { return }
+                UserDefaultsRepository.colorBGText.value = value
+            // Force main screen update
+            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            mainScreen.setBGTextColor()
+        }
             <<< SwitchRow("forceDarkMode") { row in
             <<< SwitchRow("forceDarkMode") { row in
-            row.title = "Always Use Dark Mode (Restart App)"
-            row.value = UserDefaultsRepository.forceDarkMode.value
+        row.title = "Force Dark Mode (Restart App)"
+        row.value = UserDefaultsRepository.forceDarkMode.value
+        }.onChange { [weak self] row in
+            guard let value = row.value else { return }
+                UserDefaultsRepository.forceDarkMode.value = value
+        }
+        <<< SwitchRow("screenlockSwitchState") { row in
+            row.title = "Keep Screen Active"
+            row.value = UserDefaultsRepository.screenlockSwitchState.value
             }.onChange { [weak self] row in
             }.onChange { [weak self] row in
                 guard let value = row.value else { return }
                 guard let value = row.value else { return }
                 
                 
                 if value {
                 if value {
-                    UserDefaultsRepository.forceDarkMode.value = value
+                    UserDefaultsRepository.screenlockSwitchState.value = value
                 }
                 }
             }
             }
-            <<< SwitchRow("screenlockSwitchState") { row in
-                row.title = "Keep Screen Active"
-                row.value = UserDefaultsRepository.screenlockSwitchState.value
-                }.onChange { [weak self] row in
+        
+        <<< SwitchRow("backgroundRefresh"){ row in
+            row.title = "Background Refresh"
+            row.tag = "backgroundRefresh"
+            row.value = UserDefaultsRepository.backgroundRefresh.value
+        }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     guard let value = row.value else { return }
-                    
-                    if value {
-                        UserDefaultsRepository.screenlockSwitchState.value = value
-                    }
-                }
-            
-            <<< SwitchRow("backgroundRefresh"){ row in
-                row.title = "Background Refresh"
-                row.tag = "backgroundRefresh"
-                row.value = UserDefaultsRepository.backgroundRefresh.value
-            }.onChange { [weak self] row in
-                        guard let value = row.value else { return }
-                        UserDefaultsRepository.backgroundRefresh.value = value
-                }
-            <<< SliderRow() { row in
-                row.title = "Refresh Minutes"
-                row.tag = "backgroundRefreshFrequency"
-                row.steps = 19
-                row.value = Float(UserDefaultsRepository.backgroundRefreshFrequency.value)
-                row.hidden = "$backgroundRefresh == false"
-            }.cellSetup { cell, row in
-                cell.slider.minimumValue = 0.5
-                cell.slider.maximumValue = 10
+                    UserDefaultsRepository.backgroundRefresh.value = value
             }
             }
-            <<< SwitchRow("appBadge"){ row in
-                row.title = "Display App Badge"
-                row.tag = "appBadge"
-                row.value = UserDefaultsRepository.appBadge.value
-            }.onChange { [weak self] row in
-                        guard let value = row.value else { return }
-                        UserDefaultsRepository.appBadge.value = value
-                }
-
-        +++ Section("Alarm Settings")
-            <<< SwitchRow("overrideSystemOutputVolume"){ row in
-                row.title = "Override System Volume"
-                row.value = UserDefaultsRepository.overrideSystemOutputVolume.value
-            }.onChange { [weak self] row in
-                        guard let value = row.value else { return }
-                        UserDefaultsRepository.overrideSystemOutputVolume.value = value
-                }
-            <<< StepperRow("forcedOutputVolume") { row in
-                  row.title = "Volume Level"
-                row.cell.stepper.stepValue = 0.05
-                  row.cell.stepper.minimumValue = 0
-                  row.cell.stepper.maximumValue = 1
-                  row.value = Double(UserDefaultsRepository.forcedOutputVolume.value)
-                  row.hidden = "$overrideSystemOutputVolume == false"
-                    row.displayValueFor = { value in
-                    guard let value = value else { return nil }
-                    return "\(Int(value*100))%"
-                    }
-              }.onChange { [weak self] row in
-                      guard let value = row.value else { return }
-                      UserDefaultsRepository.forcedOutputVolume.value = Float(value)
-              }
-           /* <<< StepperRow("fadeInTimeInterval") { row in
-                row.title = "Fade-in Seconds"
-                row.cell.stepper.stepValue = 5
-                row.cell.stepper.minimumValue = 0
-                row.cell.stepper.maximumValue = 60
-                row.value = Double(UserDefaultsRepository.fadeInTimeInterval.value)
-                row.displayValueFor = { value in
-                guard let value = value else { return nil }
-                return "\(Int(value))"
-                }
-            }.onChange { [weak self] row in
+        <<< SliderRow() { row in
+            row.title = "Refresh Minutes"
+            row.tag = "backgroundRefreshFrequency"
+            row.steps = 19
+            row.value = Float(UserDefaultsRepository.backgroundRefreshFrequency.value)
+            row.hidden = "$backgroundRefresh == false"
+        }.cellSetup { cell, row in
+            cell.slider.minimumValue = 0.5
+            cell.slider.maximumValue = 10
+        }
+        <<< SwitchRow("appBadge"){ row in
+            row.title = "Display App Badge"
+            row.tag = "appBadge"
+            row.value = UserDefaultsRepository.appBadge.value
+        }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.fadeInTimeInterval.value = TimeInterval(value)
-            }*/
-            
-        +++ Section("Graph Settings")
-            <<< SwitchRow("switchRowDots"){ row in
-                row.title = "Display Dots"
-                row.value = UserDefaultsRepository.showDots.value
-            }.onChange { [weak self] row in
-                        guard let value = row.value else { return }
-                        UserDefaultsRepository.showDots.value = value
-                }
-            <<< SwitchRow("switchRowLines"){ row in
-                row.title = "Display Lines"
-                row.value = UserDefaultsRepository.showLines.value
-            }.onChange { [weak self] row in
-                        guard let value = row.value else { return }
-                        UserDefaultsRepository.showLines.value = value
-                        
-            }
-            <<< StepperRow("lowLine") { row in
-                row.title = "Low BG Display Value"
-                row.cell.stepper.stepValue = 1
-                row.cell.stepper.minimumValue = 150
-                row.cell.stepper.maximumValue = 400
-                row.value = Double(UserDefaultsRepository.lowLine.value)
-                row.displayValueFor = { value in
-                    guard let value = value else { return nil }
-                    return "\(Int(value))"
-                }
-            }.onChange { [weak self] row in
+                    UserDefaultsRepository.appBadge.value = value
+                    // Force main screen update
+                    guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+                    mainScreen.nightscoutLoader(forceLoad: true)
+        }
+    }
+    
+    func buildAlarmSettings() {
+        form
+            +++ Section("Alarm Settings")
+         <<< SwitchRow("overrideSystemOutputVolume"){ row in
+             row.title = "Override System Volume"
+             row.value = UserDefaultsRepository.overrideSystemOutputVolume.value
+         }.onChange { [weak self] row in
+                     guard let value = row.value else { return }
+                     UserDefaultsRepository.overrideSystemOutputVolume.value = value
+             }
+         <<< StepperRow("forcedOutputVolume") { row in
+               row.title = "Volume Level"
+             row.cell.stepper.stepValue = 0.05
+               row.cell.stepper.minimumValue = 0
+               row.cell.stepper.maximumValue = 1
+               row.value = Double(UserDefaultsRepository.forcedOutputVolume.value)
+               row.hidden = "$overrideSystemOutputVolume == false"
+                 row.displayValueFor = { value in
+                 guard let value = value else { return nil }
+                 return "\(Int(value*100))%"
+                 }
+           }.onChange { [weak self] row in
+                   guard let value = row.value else { return }
+                   UserDefaultsRepository.forcedOutputVolume.value = Float(value)
+           }
+        /* <<< StepperRow("fadeInTimeInterval") { row in
+             row.title = "Fade-in Seconds"
+             row.cell.stepper.stepValue = 5
+             row.cell.stepper.minimumValue = 0
+             row.cell.stepper.maximumValue = 60
+             row.value = Double(UserDefaultsRepository.fadeInTimeInterval.value)
+             row.displayValueFor = { value in
+             guard let value = value else { return nil }
+             return "\(Int(value))"
+             }
+         }.onChange { [weak self] row in
+                 guard let value = row.value else { return }
+                 UserDefaultsRepository.fadeInTimeInterval.value = TimeInterval(value)
+         }*/
+    }
+    
+    func buildGraphSettings() {
+        form
+            +++ Section("Graph Settings")
+        <<< SwitchRow("switchRowDots"){ row in
+            row.title = "Display Dots"
+            row.value = UserDefaultsRepository.showDots.value
+        }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.lowLine.value = Int(value)
+                    UserDefaultsRepository.showDots.value = value
+                // Force main screen update
+                guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+                mainScreen.nightscoutLoader(forceLoad: true)
             }
             }
-            <<< StepperRow("highLine") { row in
-                row.title = "High BG Display Value"
-                row.cell.stepper.stepValue = 1
-                row.cell.stepper.minimumValue = 150
-                row.cell.stepper.maximumValue = 400
-                row.value = Double(UserDefaultsRepository.highLine.value)
-                row.displayValueFor = { value in
-                    guard let value = value else { return nil }
-                    return "\(Int(value))"
-                }
-            }.onChange { [weak self] row in
+        <<< SwitchRow("switchRowLines"){ row in
+            row.title = "Display Lines"
+            row.value = UserDefaultsRepository.showLines.value
+        }.onChange { [weak self] row in
                     guard let value = row.value else { return }
                     guard let value = row.value else { return }
-                    UserDefaultsRepository.highLine.value = Int(value)
+                    UserDefaultsRepository.showLines.value = value
+            // Force main screen update
+            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            mainScreen.nightscoutLoader(forceLoad: true)
+                    
+        }
+        <<< StepperRow("lowLine") { row in
+            row.title = "Low BG Display Value"
+            row.cell.stepper.stepValue = 1
+            row.cell.stepper.minimumValue = 40
+            row.cell.stepper.maximumValue = 120
+            row.value = Double(UserDefaultsRepository.lowLine.value)
+            row.displayValueFor = { value in
+                guard let value = value else { return nil }
+                return "\(Int(value))"
             }
             }
-        
-        
-            +++ Section(header: "Watch Settings", footer: "Add the Apple calendar complication to your watch face for BG, Trend, Delta, COB, and IOB updated every 5 minutes. It is recommended to create a new calendar called 'Loop' and modify the calendar settings in the iPhone Watch App to only display the Loop calendar on your watch")
-            <<< SwitchRow("writeCalendarEvent"){ row in
-                row.title = "BG to Calendar"
-                row.value = UserDefaultsRepository.writeCalendarEvent.value
-            }.onChange { [weak self] row in
-                        guard let value = row.value else { return }
-                        UserDefaultsRepository.writeCalendarEvent.value = value
-                }
-            <<< PickerInputRow<String>("calendarIdentifier") { row in
-                row.title = "Calendar"
-                row.options = calendars.map { $0.identifier }
-                row.hidden = "$writeCalendarEvent == false"
-                row.value = UserDefaultsRepository.calendarIdentifier.value
-                row.displayValueFor = { value in
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.lowLine.value = Int(value)
+            // Force main screen update
+            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            mainScreen.nightscoutLoader(forceLoad: true)
+        }
+        <<< StepperRow("highLine") { row in
+            row.title = "High BG Display Value"
+            row.cell.stepper.stepValue = 1
+            row.cell.stepper.minimumValue = 150
+            row.cell.stepper.maximumValue = 400
+            row.value = Double(UserDefaultsRepository.highLine.value)
+            row.displayValueFor = { value in
                 guard let value = value else { return nil }
                 guard let value = value else { return nil }
-                    let matching = calendars
-                    .flatMap { $0 }
-                        .filter { $0.identifier.range(of: value) != nil || $0.title.range(of: value) != nil }
-                    if matching.count > 0 {
+                return "\(Int(value))"
+            }
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.highLine.value = Int(value)
+            // Force main screen update
+            guard let mainScreen = self?.tabBarController!.viewControllers?[0] as? MainViewController else { return }
+            mainScreen.nightscoutLoader(forceLoad: true)
+        }
+    }
+    
+    func buildWatchSettings(){
+        //array of calendars
+        let store = EKEventStore()
+        let ekCalendars = store.calendars(for: EKEntityType.event)
+        var calendars: [cal] = []
+        for i in 0..<ekCalendars.count{
+            
+            let item = cal(title: ekCalendars[i].title, identifier: ekCalendars[i].calendarIdentifier)
+            calendars.append(item)
+        }
+        
+        form
+        +++ Section(header: "Watch Settings", footer: "Add the Apple calendar complication to your watch face for BG, Trend, Delta, COB, and IOB updated every 5 minutes. It is recommended to create a new calendar called 'Loop' and modify the calendar settings in the iPhone Watch App to only display the Loop calendar on your watch")
+        <<< SwitchRow("writeCalendarEvent"){ row in
+            row.title = "BG to Calendar"
+            row.value = UserDefaultsRepository.writeCalendarEvent.value
+        }.onChange { [weak self] row in
+                    guard let value = row.value else { return }
+                    UserDefaultsRepository.writeCalendarEvent.value = value
+            }
+        <<< PickerInputRow<String>("calendarIdentifier") { row in
+            row.title = "Calendar"
+            row.options = calendars.map { $0.identifier }
+            row.hidden = "$writeCalendarEvent == false"
+            row.value = UserDefaultsRepository.calendarIdentifier.value
+            row.displayValueFor = { value in
+            guard let value = value else { return nil }
+                let matching = calendars
+                .flatMap { $0 }
+                    .filter { $0.identifier.range(of: value) != nil || $0.title.range(of: value) != nil }
+                if matching.count > 0 {
 
 
-                        return "\(String(matching[0].title))"
-                    } else {
-                        return " - "
-                    }
+                    return "\(String(matching[0].title))"
+                } else {
+                    return " - "
                 }
                 }
-            }.onChange { [weak self] row in
-                    guard let value = row.value else { return }
-                    UserDefaultsRepository.calendarIdentifier.value = value
             }
             }
-        
-         }
-        
-        
-        
+        }.onChange { [weak self] row in
+                guard let value = row.value else { return }
+                UserDefaultsRepository.calendarIdentifier.value = value
+        }
+    }
  
  
 
 
 
 

+ 1 - 0
LoopFollow/repository/UserDefaults.swift

@@ -23,6 +23,7 @@ class UserDefaultsRepository {
     static let highLine = UserDefaultsValue<Int>(key: "highLine", default: 180)
     static let highLine = UserDefaultsValue<Int>(key: "highLine", default: 180)
     
     
     // General Settings
     // General Settings
+    static let colorBGText = UserDefaultsValue<Bool>(key: "colorBGText", default: true)
     static let backgroundRefreshFrequency = UserDefaultsValue<Int>(key: "backgroundRefreshFrequency", default: 1)
     static let backgroundRefreshFrequency = UserDefaultsValue<Int>(key: "backgroundRefreshFrequency", default: 1)
     static let backgroundRefresh = UserDefaultsValue<Bool>(key: "backgroundRefresh", default: true)
     static let backgroundRefresh = UserDefaultsValue<Bool>(key: "backgroundRefresh", default: true)
     static let appBadge = UserDefaultsValue<Bool>(key: "appBadge", default: true)
     static let appBadge = UserDefaultsValue<Bool>(key: "appBadge", default: true)