From 9b225f63b5284330c3cb73d0d420e1e94a4003f8 Mon Sep 17 00:00:00 2001 From: VincentMeilinger Date: Thu, 11 Jan 2024 14:15:12 +0100 Subject: [PATCH] Improved timer widget --- .../UserInterfaceState.xcuserstate | Bin 58775 -> 63226 bytes .../Data/DurationComponents.swift | 56 ++++++++++++++++++ .../ViewModels/MainViewModel.swift | 28 ++------- .../Views/RecipeDetailView.swift | 15 +++-- .../Views/TimerView.swift | 35 ++++++----- 5 files changed, 90 insertions(+), 44 deletions(-) diff --git a/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate b/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate index c1608cffda072cd4b77fd0a763058f0dee0dea1c..2a3afbe7e6d38710f052d1f6346c21655e11560d 100644 GIT binary patch delta 29659 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 z

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 diff --git a/Nextcloud Cookbook iOS Client/Data/DurationComponents.swift b/Nextcloud Cookbook iOS Client/Data/DurationComponents.swift index 774d877..edd017a 100644 --- a/Nextcloud Cookbook iOS Client/Data/DurationComponents.swift +++ b/Nextcloud Cookbook iOS Client/Data/DurationComponents.swift @@ -10,6 +10,22 @@ import SwiftUI class DurationComponents: ObservableObject { + @Published var secondComponent: String = "00" { + didSet { + if secondComponent.count > 2 { + secondComponent = oldValue + } else if secondComponent.count == 1 { + secondComponent = "0\(secondComponent)" + } else if secondComponent.count == 0 { + secondComponent = "00" + } + let filtered = secondComponent.filter { $0.isNumber } + if secondComponent != filtered { + secondComponent = filtered + } + } + } + @Published var minuteComponent: String = "00" { didSet { if minuteComponent.count > 2 { @@ -42,6 +58,19 @@ class DurationComponents: ObservableObject { } } + static func fromPTString(_ PTRepresentation: String) -> DurationComponents { + let duration = DurationComponents() + let hourRegex = /([0-9]{1,2})H/ + let minuteRegex = /([0-9]{1,2})M/ + if let match = PTRepresentation.firstMatch(of: hourRegex) { + duration.hourComponent = String(match.1) + } + if let match = PTRepresentation.firstMatch(of: minuteRegex) { + duration.minuteComponent = String(match.1) + } + return duration + } + func fromPTString(_ PTRepresentation: String) { let hourRegex = /([0-9]{1,2})H/ let minuteRegex = /([0-9]{1,2})M/ @@ -60,6 +89,7 @@ class DurationComponents: ObservableObject { func toText() -> LocalizedStringKey { let intHour = Int(hourComponent) ?? 0 let intMinute = Int(minuteComponent) ?? 0 + if intHour != 0 && intMinute != 0 { return "\(intHour) h, \(intMinute) min" } else if intHour == 0 && intMinute != 0 { @@ -71,6 +101,32 @@ class DurationComponents: ObservableObject { } } + func toTimerText() -> String { + var timeString = "" + if hourComponent != "00" { + timeString.append("\(hourComponent):") + } + timeString.append("\(minuteComponent):") + timeString.append("\(secondComponent)") + return timeString + } + + func toSeconds() -> Double { + guard let hours = Double(hourComponent) else { return 0 } + guard let minutes = Double(minuteComponent) else { return 0 } + guard let seconds = Double(secondComponent) else { return 0 } + return hours * 3600 + minutes * 60 + seconds + } + + func fromSeconds(_ totalSeconds: Int) { + let hours = totalSeconds / 3600 + let minutes = (totalSeconds % 3600) / 60 + let seconds = totalSeconds % 60 + self.hourComponent = String(hours) + self.minuteComponent = String(minutes) + self.secondComponent = String(seconds) + } + static func ptToText(_ ptString: String) -> String? { let hourRegex = /([0-9]{1,2})H/ let minuteRegex = /([0-9]{1,2})M/ diff --git a/Nextcloud Cookbook iOS Client/ViewModels/MainViewModel.swift b/Nextcloud Cookbook iOS Client/ViewModels/MainViewModel.swift index bf45e8f..cb5be79 100644 --- a/Nextcloud Cookbook iOS Client/ViewModels/MainViewModel.swift +++ b/Nextcloud Cookbook iOS Client/ViewModels/MainViewModel.swift @@ -614,33 +614,13 @@ extension DateFormatter { // Timer logic extension MainViewModel { - func createTimer(forRecipe recipeId: String, timeTotal: Double) -> RecipeTimer { - let timer = RecipeTimer(timeTotal: timeTotal) + func createTimer(forRecipe recipeId: String, duration: DurationComponents) -> RecipeTimer { + let timer = RecipeTimer(duration: duration) timers[recipeId] = timer return timer } - func getTimer(forRecipe recipeId: String, timeTotal: Double) -> RecipeTimer { - return timers[recipeId] ?? createTimer(forRecipe: recipeId, timeTotal: timeTotal) - } - - - func startTimer(forRecipe recipeId: String, timeTotal: Double) { - let timer = RecipeTimer(timeTotal: timeTotal) - timer.start() - timers[recipeId] = timer - } - - func pauseTimer(forRecipe recipeId: String) { - timers[recipeId]?.pause() - } - - func resumeTimer(forRecipe recipeId: String) { - timers[recipeId]?.resume() - } - - func cancelTimer(forRecipe recipeId: String) { - timers[recipeId]?.cancel() - timers[recipeId] = nil + func getTimer(forRecipe recipeId: String, duration: DurationComponents) -> RecipeTimer { + return timers[recipeId] ?? createTimer(forRecipe: recipeId, duration: duration) } } diff --git a/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift b/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift index 30c2dda..fdf2bc9 100644 --- a/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift +++ b/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift @@ -61,8 +61,8 @@ struct RecipeDetailView: View { } Divider() - TimerView(timer: viewModel.getTimer(forRecipe: recipeDetail.id, timeTotal: 20)) - RecipeDurationSection(recipeDetail: recipeDetail) + + RecipeDurationSection(viewModel: viewModel, recipeDetail: recipeDetail) LazyVGrid(columns: [GridItem(.adaptive(minimum: 400), alignment: .top)]) { if(!recipeDetail.recipeIngredient.isEmpty) { @@ -214,10 +214,11 @@ fileprivate struct ShareView: View { fileprivate struct RecipeDurationSection: View { + @ObservedObject var viewModel: MainViewModel @State var recipeDetail: RecipeDetail var body: some View { - LazyVGrid(columns: [GridItem(.adaptive(minimum: 150), alignment: .leading)]) { + LazyVGrid(columns: [GridItem(.adaptive(minimum: 250), alignment: .leading)]) { if let prepTime = recipeDetail.prepTime, let time = DurationComponents.ptToText(prepTime) { VStack(alignment: .leading) { HStack { @@ -229,6 +230,12 @@ fileprivate struct RecipeDurationSection: View { }.padding() } + if let cookTime = recipeDetail.cookTime, let time = DurationComponents.ptToText(cookTime) { + TimerView(timer: viewModel.getTimer(forRecipe: recipeDetail.id, duration: DurationComponents.fromPTString(cookTime))) + .padding() + } + + /* if let cookTime = recipeDetail.cookTime, let time = DurationComponents.ptToText(cookTime) { VStack(alignment: .leading) { HStack { @@ -238,7 +245,7 @@ fileprivate struct RecipeDurationSection: View { Text(time) .lineLimit(1) }.padding() - } + }*/ if let totalTime = recipeDetail.totalTime, let time = DurationComponents.ptToText(totalTime) { VStack(alignment: .leading) { diff --git a/Nextcloud Cookbook iOS Client/Views/TimerView.swift b/Nextcloud Cookbook iOS Client/Views/TimerView.swift index b95b2c3..5a81a4a 100644 --- a/Nextcloud Cookbook iOS Client/Views/TimerView.swift +++ b/Nextcloud Cookbook iOS Client/Views/TimerView.swift @@ -27,29 +27,27 @@ struct TimerView: View { } label: { if timer.isRunning { Image(systemName: "pause.fill") - .foregroundStyle(.blue) } else { Image(systemName: "play.fill") - .foregroundStyle(.blue) } } } .gaugeStyle(.accessoryCircularCapacity) .animation(.easeInOut, value: timer.timeElapsed) - .tint(.white) + .tint(timer.isRunning ? .green : .nextcloudBlue) + .foregroundStyle(timer.isRunning ? Color.green : Color.nextcloudBlue) VStack(alignment: .leading) { - HStack { - Text("Cooking time") - .padding(.horizontal) - Button { - timer.cancel() - } label: { - Image(systemName: "xmark.circle.fill") - } - } - Text("\(Int(timer.timeTotal - timer.timeElapsed))") - .padding(.horizontal) + Text("Cooking") + Text(timer.duration.toTimerText()) + } + .padding(.horizontal) + + Button { + timer.cancel() + } label: { + Image(systemName: "xmark.circle.fill") + .foregroundStyle(timer.isRunning ? Color.nextcloudBlue : Color.secondary) } } .bold() @@ -65,6 +63,7 @@ struct TimerView: View { class RecipeTimer: ObservableObject { var timeTotal: Double + @Published var duration: DurationComponents private var startDate: Date? private var pauseDate: Date? @Published var timeElapsed: Double = 0 @@ -72,8 +71,9 @@ class RecipeTimer: ObservableObject { private var timer: Timer.TimerPublisher? private var timerCancellable: Cancellable? - init(timeTotal: Double) { - self.timeTotal = timeTotal + init(duration: DurationComponents) { + self.duration = duration + self.timeTotal = duration.toSeconds() } func start() { @@ -93,8 +93,10 @@ class RecipeTimer: ObservableObject { let elapsed = Date().timeIntervalSince(startTime) if elapsed < self.timeTotal { self.timeElapsed = elapsed + self.duration.fromSeconds(Int(self.timeTotal - self.timeElapsed)) } else { self.timeElapsed = self.timeTotal + self.duration.fromSeconds(Int(self.timeTotal - self.timeElapsed)) self.pause() } } @@ -123,5 +125,6 @@ class RecipeTimer: ObservableObject { self.timeElapsed = 0 self.startDate = nil self.pauseDate = nil + self.duration.fromSeconds(Int(timeTotal)) } }