Просмотр исходного кода

change override duration to scroll wheel picker

also update duration labels to use "2 hr 5 min" instead of "125 min",
and removed duration from label when set to indefinite
Mike Plante 1 год назад
Родитель
Сommit
ad2a8d91da

+ 4 - 5
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -211,15 +211,14 @@ extension Home {
                 0
             )
             let indefinite = latestOverride.indefinite
-            var durationString = ""
+            var durationString = ""
 
             if !indefinite {
                 if newDuration >= 1 {
-                    durationString =
-                        "\(newDuration.formatted(.number.grouping(.never).rounded().precision(.fractionLength(0)))) min"
+                    durationString = formatHrMin(Int(newDuration))
                 } else if newDuration > 0 {
-                    durationString =
-                        "\((newDuration * 60).formatted(.number.grouping(.never).rounded().precision(.fractionLength(0)))) s"
+                    durationString = "\(Int(newDuration * 60)) s"
+
                 } else {
                     /// Do not show the Override anymore
                     Task {

+ 59 - 4
FreeAPS/Sources/Modules/OverrideConfig/View/AddOverrideForm.swift

@@ -4,10 +4,13 @@ import SwiftUI
 struct AddOverrideForm: View {
     @Environment(\.presentationMode) var presentationMode
     @StateObject var state: OverrideConfig.StateModel
+    @State private var displayPickerDuration: Bool = false
     @State private var displayPickerStart: Bool = false
     @State private var displayPickerEnd: Bool = false
     @State private var displayPickerSmbMinutes: Bool = false
     @State private var displayPickerUamMinutes: Bool = false
+    @State private var durationHours = 0
+    @State private var durationMinutes = 0
     @State private var overrideTarget = false
     @Environment(\.colorScheme) var colorScheme
     @State private var showAlert = false
@@ -143,11 +146,44 @@ struct AddOverrideForm: View {
                     Text("Enable Indefinitely")
                 }
                 if !state.indefinite {
-                    HStack {
-                        Text("Duration")
-                        TextFieldWithToolBar(text: $state.overrideDuration, placeholder: "0", numberFormatter: formatter)
-                        Text("min").foregroundColor(.secondary)
+                    VStack {
+                        HStack {
+                            Text("Duration")
+                            Spacer()
+                            Text(formatHrMin(Int(state.overrideDuration)))
+                                .foregroundColor(!displayPickerDuration ? .primary : .accentColor)
+                        }
+                        .onTapGesture {
+                            displayPickerDuration.toggle()
+                        }
+
+                        if displayPickerDuration {
+                            HStack {
+                                Picker("Hours", selection: $durationHours) {
+                                    ForEach(0 ..< 24) { hour in
+                                        Text("\(hour) hr").tag(hour)
+                                    }
+                                }
+                                .pickerStyle(WheelPickerStyle())
+                                .frame(width: 100)
+                                .onChange(of: durationHours) { _ in
+                                    state.overrideDuration = Decimal(totalDurationInMinutes())
+                                }
+
+                                Picker("Minutes", selection: $durationMinutes) {
+                                    ForEach(Array(stride(from: 0, through: 55, by: 5)), id: \.self) { minute in
+                                        Text("\(minute) min").tag(minute)
+                                    }
+                                }
+                                .pickerStyle(WheelPickerStyle())
+                                .frame(width: 100)
+                                .onChange(of: durationMinutes) { _ in
+                                    state.overrideDuration = Decimal(totalDurationInMinutes())
+                                }
+                            }
+                        }
                     }
+                    .padding(.top)
                 }
             }
 
@@ -416,6 +452,11 @@ struct AddOverrideForm: View {
         }
     }
 
+    private func totalDurationInMinutes() -> Int {
+        let durationTotal = (durationHours * 60) + durationMinutes
+        return max(0, durationTotal)
+    }
+
     private func unChanged() -> Bool {
         let defaultProfile = state.overrideSliderPercentage == 100 && !state.shouldOverrideTarget && !state.advancedSettings
         let noDurationSpecified = !state.indefinite && state.overrideDuration == 0
@@ -455,3 +496,17 @@ func convertTo12HourFormat(_ hour: Int) -> String {
 func format24Hour(_ hour: Int) -> String {
     String(format: "%02d", hour)
 }
+
+func formatHrMin(_ durationInMinutes: Int) -> String {
+    let hours = durationInMinutes / 60
+    let minutes = durationInMinutes % 60
+
+    switch (hours, minutes) {
+    case let (0, m):
+        return "\(m) min"
+    case let (h, 0):
+        return "\(h) hr"
+    default:
+        return "\(hours) hr \(minutes) min"
+    }
+}

+ 54 - 13
FreeAPS/Sources/Modules/OverrideConfig/View/EditOverrideForm.swift

@@ -27,6 +27,7 @@ struct EditOverrideForm: View {
     @State private var isEditing = false
     @State private var target_override = false
     @State private var showAlert = false
+    @State private var displayPickerDuration: Bool = false
     @State private var displayPickerStart: Bool = false
     @State private var displayPickerEnd: Bool = false
     @State private var displayPickerSmbMinutes: Bool = false
@@ -198,21 +199,61 @@ struct EditOverrideForm: View {
                 }.onChange(of: indefinite) { _ in hasChanges = true }
 
                 if !indefinite {
-                    HStack {
-                        Text("Duration")
-                        TextFieldWithToolBar(
-                            text: Binding(
-                                get: { duration },
-                                set: {
-                                    duration = $0
-                                    hasChanges = true
+                    VStack {
+                        HStack {
+                            Text("Duration")
+                            Spacer()
+                            Text(formatHrMin(Int(truncating: duration as NSNumber)))
+                                .foregroundColor(!displayPickerDuration ? .primary : .accentColor)
+                        }
+                        .onTapGesture {
+                            displayPickerDuration.toggle()
+                        }
+
+                        if displayPickerDuration {
+                            HStack {
+                                Picker(
+                                    selection: Binding(
+                                        get: {
+                                            Int(truncating: duration as NSNumber) / 60
+                                        },
+                                        set: {
+                                            duration = Decimal($0 * 60 + Int(truncating: duration as NSNumber) % 60)
+                                            hasChanges = true
+                                        }
+                                    ),
+                                    label: Text("")
+                                ) {
+                                    ForEach(0 ..< 24) { hour in
+                                        Text("\(hour) hr").tag(hour)
+                                    }
                                 }
-                            ),
-                            placeholder: "0",
-                            numberFormatter: formatter
-                        )
-                        Text("min").foregroundColor(.secondary)
+                                .pickerStyle(WheelPickerStyle())
+                                .frame(width: 100)
+
+                                Picker(
+                                    selection: Binding(
+                                        get: {
+                                            Int(truncating: duration as NSNumber) %
+                                                60 // Convert Decimal to Int for modulus operation
+                                        },
+                                        set: {
+                                            duration = Decimal((Int(truncating: duration as NSNumber) / 60) * 60 + $0)
+                                            hasChanges = true
+                                        }
+                                    ),
+                                    label: Text("")
+                                ) {
+                                    ForEach(Array(stride(from: 0, through: 55, by: 5)), id: \.self) { minute in
+                                        Text("\(minute) min").tag(minute)
+                                    }
+                                }
+                                .pickerStyle(WheelPickerStyle())
+                                .frame(width: 100)
+                            }
+                        }
                     }
+                    .padding(.top)
                 }
             }
 

+ 5 - 5
FreeAPS/Sources/Modules/OverrideConfig/View/OverrideRootView.swift

@@ -500,7 +500,7 @@ extension OverrideConfig {
             let name = ((preset.name ?? "") == "") || (preset.name?.isEmpty ?? true) ? "" : preset.name!
             let percent = preset.percentage / 100
             let perpetual = preset.indefinite
-            let durationString = perpetual ? "∞" : "\(formatter.string(from: duration as NSNumber)!) min"
+            let durationString = perpetual ? "" : "\(formatHrMin(Int(duration)))"
             let scheduledSMBstring = preset.smbIsScheduledOff && preset.start != preset.end
                 ? " \(formatTimeRange(start: preset.start?.stringValue, end: preset.end?.stringValue))"
                 : ""
@@ -528,11 +528,11 @@ extension OverrideConfig {
                                     Text(durationString)
                                 }
                                 if percent != 1 {
-                                    overrideLabelDivider
+                                    if durationString != "" {
+                                        overrideLabelDivider
+                                    }
                                     Text(
-                                        percent
-                                            .formatted(.percent.grouping(.never).rounded().precision(.fractionLength(0))) +
-                                            isfAndCRstring
+                                        "\(Int(percent * 100))%\(isfAndCRstring)"
                                     )
                                 }
                                 if targetString != "" {