parent
7797796901
commit
035361f459
@ -0,0 +1,123 @@ |
||||
// |
||||
// LiveTimerView.swift |
||||
// LeCountdown |
||||
// |
||||
// Created by Laurent Morvillier on 03/02/2023. |
||||
// |
||||
|
||||
import SwiftUI |
||||
|
||||
//class LiveTimerViewModel: ObservableObject { |
||||
// |
||||
// @Published var formattedTime: String = "" |
||||
// fileprivate var _formattingTimer: Timer? = nil |
||||
// |
||||
// var date: Date = Date() |
||||
// var showMilliseconds: Bool = false |
||||
// |
||||
// func startTimeUpdater(date: Date, showMilliseconds: Bool) { |
||||
// |
||||
// self.date = date |
||||
// self.showMilliseconds = showMilliseconds |
||||
// self._formattingTimer = Timer(timeInterval: 0.01, repeats: true, block: { timer in |
||||
// |
||||
// self.formattedTime = Date().timeIntervalSince(self.date).hourMinuteSecondMS |
||||
// |
||||
// }) |
||||
// self._formattingTimer?.fire() |
||||
// } |
||||
//} |
||||
|
||||
struct LiveTimerView: View { |
||||
|
||||
@Environment(\.managedObjectContext) private var viewContext |
||||
@EnvironmentObject var conductor: Conductor |
||||
|
||||
@State var timer: AbstractTimer |
||||
var date: Date |
||||
|
||||
var body: some View { |
||||
HStack { |
||||
Text(timer.displayName.uppercased()).padding() |
||||
|
||||
Spacer() |
||||
TimelineView(.periodic(from: self.date, by: 0.01)) { context in |
||||
Text(self._formattedDuration(date: context.date)) |
||||
.font(.title2) |
||||
.padding(.trailing) |
||||
.minimumScaleFactor(0.1) |
||||
} |
||||
|
||||
Button { |
||||
self._stopTimer(timer) |
||||
} label: { |
||||
Image(systemName: "xmark.circle.fill") |
||||
.font(.title) |
||||
.foregroundColor(.white) |
||||
.cornerRadius(8.0) |
||||
.frame(minWidth: 0.0, maxWidth: 60.0, minHeight: 0.0, maxHeight: .infinity) |
||||
}.background(.red) |
||||
|
||||
} |
||||
} |
||||
|
||||
fileprivate func _formattedDuration(date: Date) -> String { |
||||
if self.timer is Stopwatch { |
||||
let duration = date.timeIntervalSince(self.date) |
||||
return duration.hourMinuteSecondHS |
||||
} else { // countdown |
||||
let duration = self.date.timeIntervalSince(date) |
||||
return duration.minuteSecond |
||||
} |
||||
} |
||||
|
||||
|
||||
fileprivate func _stopTimer(_ timer: AbstractTimer?) { |
||||
|
||||
guard let timer else { |
||||
return |
||||
} |
||||
|
||||
TimerRouter.stopTimer(timer: timer) |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
struct LiveTimerListView: View { |
||||
|
||||
@Environment(\.managedObjectContext) private var viewContext |
||||
@EnvironmentObject var conductor: Conductor |
||||
|
||||
var body: some View { |
||||
LazyVStack { |
||||
ForEach(conductor.liveTimers) { liveTimer in |
||||
|
||||
if let timer: AbstractTimer = liveTimer.timer(context: self.viewContext) { |
||||
|
||||
LiveTimerView(timer: timer, date: liveTimer.date) |
||||
.frame(height: 55.0) |
||||
.foregroundColor(.white) |
||||
.monospaced() |
||||
.background(Color(white: 0.2)) |
||||
.cornerRadius(16.0) |
||||
} |
||||
|
||||
} |
||||
}.padding(8.0) |
||||
|
||||
} |
||||
|
||||
|
||||
} |
||||
|
||||
struct LiveTimerView_Previews: PreviewProvider { |
||||
|
||||
init() { |
||||
Conductor.maestro.currentCountdowns["fef"] = DateInterval(start: Date(), end: Date()) |
||||
} |
||||
|
||||
static var previews: some View { |
||||
LiveTimerListView().environmentObject(Conductor.maestro) |
||||
} |
||||
} |
||||
@ -1,70 +0,0 @@ |
||||
// |
||||
// LiveTimerView.swift |
||||
// LeCountdown |
||||
// |
||||
// Created by Laurent Morvillier on 03/02/2023. |
||||
// |
||||
|
||||
import SwiftUI |
||||
|
||||
struct LiveTimerView: View { |
||||
|
||||
@Environment(\.managedObjectContext) private var viewContext |
||||
|
||||
@EnvironmentObject var conductor: Conductor |
||||
|
||||
var body: some View { |
||||
LazyVStack { |
||||
ForEach(conductor.liveTimers) { liveTimer in |
||||
|
||||
let timer = liveTimer.timer(context: self.viewContext) |
||||
|
||||
HStack { |
||||
Text(timer?.displayName.uppercased() ?? "missing") |
||||
Spacer() |
||||
Text(liveTimer.date, style: .timer) |
||||
Spacer() |
||||
Button { |
||||
self._stopTimer(timer) |
||||
} label: { |
||||
Text("STOP") |
||||
.padding(8.0) |
||||
.foregroundColor(.red) |
||||
.background(.white) |
||||
.fontWeight(.semibold) |
||||
.cornerRadius(8.0) |
||||
}//.buttonStyle(.bordered).tint(.red) |
||||
|
||||
} |
||||
.padding() |
||||
.frame(height: 55.0) |
||||
.foregroundColor(.white) |
||||
.monospaced() |
||||
.background(.cyan) |
||||
.cornerRadius(16.0) |
||||
} |
||||
}.padding(8.0) |
||||
} |
||||
|
||||
fileprivate func _stopTimer(_ timer: AbstractTimer?) { |
||||
|
||||
guard let timer else { |
||||
return |
||||
} |
||||
|
||||
TimerRouter.stopTimer(timer: timer) |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
struct LiveTimerView_Previews: PreviewProvider { |
||||
|
||||
init() { |
||||
Conductor.maestro.currentCountdowns["fef"] = DateInterval(start: Date(), end: Date()) |
||||
} |
||||
|
||||
static var previews: some View { |
||||
LiveTimerView().environmentObject(Conductor.maestro) |
||||
} |
||||
} |
||||
@ -0,0 +1,40 @@ |
||||
// |
||||
// TestView.swift |
||||
// LeCountdown |
||||
// |
||||
// Created by Laurent Morvillier on 03/02/2023. |
||||
// |
||||
|
||||
import SwiftUI |
||||
|
||||
struct TestSubView: View { |
||||
|
||||
var body: some View { |
||||
HStack { |
||||
Text("haha").padding() |
||||
Spacer() |
||||
Image(systemName: "xmark").frame(minWidth: 0.0, maxWidth: 60.0, minHeight: 0.0, maxHeight: .infinity).background(.red) |
||||
} |
||||
.background(.gray) |
||||
.cornerRadius(16.0) |
||||
} |
||||
|
||||
} |
||||
|
||||
struct TestView: View { |
||||
var body: some View { |
||||
|
||||
LazyVStack { |
||||
TestSubView() |
||||
TestSubView() |
||||
TestSubView() |
||||
}.padding() |
||||
|
||||
} |
||||
} |
||||
|
||||
struct TestView_Previews: PreviewProvider { |
||||
static var previews: some View { |
||||
TestView() |
||||
} |
||||
} |
||||
Loading…
Reference in new issue