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