diff --git a/RedCal.xcodeproj/project.xcworkspace/xcuserdata/masbekmacpro_m2.xcuserdatad/UserInterfaceState.xcuserstate b/RedCal.xcodeproj/project.xcworkspace/xcuserdata/masbekmacpro_m2.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..41a208e
Binary files /dev/null and b/RedCal.xcodeproj/project.xcworkspace/xcuserdata/masbekmacpro_m2.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/RedCal.xcodeproj/xcuserdata/masbekmacpro_m2.xcuserdatad/xcschemes/xcschememanagement.plist b/RedCal.xcodeproj/xcuserdata/masbekmacpro_m2.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..356e611
--- /dev/null
+++ b/RedCal.xcodeproj/xcuserdata/masbekmacpro_m2.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ SchemeUserState
+
+ RedCal.xcscheme_^#shared#^_
+
+ orderHint
+ 0
+
+
+
+
diff --git a/RedCal/AddPeriod.swift b/RedCal/AddPeriod.swift
index 30cb5ff..6b4afdb 100644
--- a/RedCal/AddPeriod.swift
+++ b/RedCal/AddPeriod.swift
@@ -27,56 +27,56 @@ struct AddPeriod: View {
var body: some View {
NavigationView {
- List {
- MultiDatePicker("Select Date", selection: $selectedDates, in: bounds!)
- .datePickerStyle(GraphicalDatePickerStyle())
- .onChange(of: selectedDates) { dates in
- (startDate, endDate) = getFirstAndLastDate(from: selectedDates)
-
- let (selected, start, end) = periodManager.insertDatesBetweenFirstAndLast(
- from: (calendar.date(from: startDate!)!),
- to: (calendar.date(from: endDate!)!)
- )
- duration = periodManager.countDuration(startDate: start, endDate: end)
- cycleLength = periodManager.countCycleLength(newStartDate: start)!
-
- period = Period(startDate: start, endDate: end, duration: duration, cycleLength: cycleLength)
- selectedDates.formUnion(selected)
- }
- }
- .toolbar {
- ToolbarItem(placement: .primaryAction) {
- Button("Save") {
- if let period = period {
- periods.append(period)
+ List {
+ MultiDatePicker("Select Date", selection: $selectedDates, in: bounds!)
+ .datePickerStyle(GraphicalDatePickerStyle())
+ .onChange(of: selectedDates) { dates in
+ (startDate, endDate) = getFirstAndLastDate(from: selectedDates)
+
+ let (selected, start, end) = periodManager.insertDatesBetweenFirstAndLast(
+ from: (calendar.date(from: startDate!)!),
+ to: (calendar.date(from: endDate!)!)
+ )
+ duration = periodManager.countDuration(startDate: start, endDate: end)
+ cycleLength = periodManager.countCycleLength(newStartDate: start)!
+
+ period = Period(startDate: start, endDate: end, duration: duration, cycleLength: cycleLength)
+ selectedDates.formUnion(selected)
}
-
- // Calculate for the next period prediction
- let answers: [Answer] = [
- Answer(promptID: 0, answer: DateAnswer(date: calendar.date(from: endDate!)!)),
- Answer(promptID: 1, answer: NumericAnswer(number: duration!)),
- Answer(promptID: 2, answer: NumericAnswer(number: cycleLength!)),
- ]
-
- for answer in answers {
- answerManager.saveOrUpdateAnswer(answer: answer)
+ }
+ .toolbar {
+ ToolbarItem(placement: .primaryAction) {
+ Button("Save") {
+ if let period = period {
+ periods.append(period)
+ }
+
+ // Calculate for the next period prediction
+ let answers: [Answer] = [
+ Answer(promptID: 0, answer: DateAnswer(date: calendar.date(from: endDate!)!)),
+ Answer(promptID: 1, answer: NumericAnswer(number: duration!)),
+ Answer(promptID: 2, answer: NumericAnswer(number: cycleLength!)),
+ ]
+
+ for answer in answers {
+ answerManager.saveOrUpdateAnswer(answer: answer)
+ }
+ answerManager.addCycleLength(cycleLength!)
+ answerManager.calculatePeriodDate()
+ answerManager.calculatePredictedDates()
+
+ print(period!)
+ dismiss()
}
- answerManager.addCycleLength(cycleLength!)
- answerManager.calculatePeriodDate()
- answerManager.calculatePredictedDates()
-
- print(period!)
- dismiss()
}
- }
- ToolbarItem(placement: .cancellationAction) {
- Button("Cancel", role: .cancel) {
- dismiss()
+ ToolbarItem(placement: .cancellationAction) {
+ Button("Cancel", role: .cancel) {
+ dismiss()
+ }
}
}
- }
- .navigationTitle("Add Period")
- .navigationBarTitleDisplayMode(.inline)
+ .navigationTitle("Add Period")
+ .navigationBarTitleDisplayMode(.inline)
}
}
@@ -85,7 +85,7 @@ struct AddPeriod: View {
guard let latestPeriod = periodManager.periods.last else {
return nil // Return nil if there are no periods available
}
-
+
let monthOfLastPeriod = calendar.date(from: calendar.dateComponents([.year, .month], from: latestPeriod.startDate))!
let monthOfNextPeriod = calendar.date(byAdding: DateComponents(month: 1), to: monthOfLastPeriod)!
diff --git a/RedCal/MainView.swift b/RedCal/MainView.swift
index 69b487d..976f318 100644
--- a/RedCal/MainView.swift
+++ b/RedCal/MainView.swift
@@ -34,7 +34,7 @@ struct MainView: View {
var bounds: Range {
let start = calendar.startOfDay(for: answerManager.startDatePrediction!)
let end = calendar.startOfDay(for: answerManager.finishDatePrediction!)
-
+
return start ..< end
}
@@ -75,22 +75,22 @@ struct MainView: View {
func PeriodPrediction() -> some View {
VStack {
- HStack {
- Text("Period Prediction")
- .font(.body).bold()
- .foregroundColor(Color(hex: "CE5656"))
-
- Spacer()
- }
- .padding(.vertical, 10)
- .padding(.horizontal, screenWidth * 0.05)
- .background(.white)
+ HStack {
+ Text("Period Prediction")
+ .font(.body).bold()
+ .foregroundColor(Color(hex: "CE5656"))
+
+ Spacer()
+ }
+ .padding(.vertical, 10)
+ .padding(.horizontal, screenWidth * 0.05)
+ .background(.white)
+
+ // Rectangle()
+ // .frame(height: 0.1)
+ // .foregroundColor(.black)
+ // .padding(.top, -10)
-// Rectangle()
-// .frame(height: 0.1)
-// .foregroundColor(.black)
-// .padding(.top, -10)
-
ZStack {
Rectangle()
.frame(height: 300)
@@ -118,7 +118,7 @@ struct MainView: View {
struct CycleLengthChart: View {
var periods: [Period]
var maxCycleDayLength = 50
-
+
var body: some View {
VStack {
HStack {
@@ -151,7 +151,7 @@ struct CycleLengthChart: View {
)
.clipShape(RoundedRectangle(cornerRadius: 20))
.padding(.horizontal, screenWidth*0.024)
-
+
Rectangle()
.fill(Color(hex: "FEDCDC"))
.frame(
@@ -161,11 +161,11 @@ struct CycleLengthChart: View {
.clipShape(RoundedRectangle(cornerRadius: 20))
.padding(.bottom, 3)
}
-
+
Text(String(period.cycleLength!))
.font(.caption)
}
- }
+ }
}
.padding(.vertical, 10)
}
diff --git a/RedCal/Model/AnswerManager.swift b/RedCal/Model/AnswerManager.swift
index a0ff511..298e3a7 100644
--- a/RedCal/Model/AnswerManager.swift
+++ b/RedCal/Model/AnswerManager.swift
@@ -82,7 +82,7 @@ class AnswerManager: ObservableObject {
else {
return
}
-
+
if let lastPeriodDate = (lastPeriodAnswer.answer as? DateAnswer)?.date,
let cycleLength = calculateAvgCycleLength(),
let periodDuration = (periodDurationAnswer.answer as? NumericAnswer)?.number
@@ -105,13 +105,13 @@ class AnswerManager: ObservableObject {
let (selected, _, _) = insertDatesBetweenFirstAndLast(
from: (
calendar.date(from:
- calendar.dateComponents([.year, .month, .day], from: startDatePrediction!)
- )!
+ calendar.dateComponents([.year, .month, .day], from: startDatePrediction!)
+ )!
),
to:(
calendar.date(from:
- calendar.dateComponents([.year, .month, .day], from: finishDatePrediction!)
- )!
+ calendar.dateComponents([.year, .month, .day], from: finishDatePrediction!)
+ )!
)
)
setPredictedDates(selected: selected)
@@ -168,12 +168,12 @@ class AnswerManager: ObservableObject {
else {
return nil
}
-
+
if let lastPeriodDate = (lastPeriodAnswer.answer as? DateAnswer)?.date,
let periodDuration = (periodDurationAnswer.answer as? NumericAnswer)?.number,
answers.count > 0 {
let adjustedStartDate = Calendar.current.date(byAdding: .day, value: -(periodDuration), to: lastPeriodDate)!
-
+
return adjustedStartDate
}
return nil
diff --git a/RedCal/RedCalApp.swift b/RedCal/RedCalApp.swift
index adae7d8..a6e9095 100644
--- a/RedCal/RedCalApp.swift
+++ b/RedCal/RedCalApp.swift
@@ -11,7 +11,7 @@ import SwiftUI
struct RedCalApp: App {
@StateObject var answerManager = AnswerManager()
@StateObject var periodManager = PeriodManager()
-
+
var body: some Scene {
WindowGroup {
ContentView()
diff --git a/RedCal/UserPrompt.swift b/RedCal/UserPrompt.swift
index cf051ab..10c1285 100644
--- a/RedCal/UserPrompt.swift
+++ b/RedCal/UserPrompt.swift
@@ -40,7 +40,7 @@ struct UserPrompt: View {
VStack {
TabView(selection: $currentCardIndex) {
ForEach((prompts.indices), id: \.self) { index in
- PromptCard(prompts: $prompts, currentCardIndex: $currentCardIndex)
+ PromptCard(prompts: $prompts, currentCardIndex: $currentCardIndex)
}
}
@@ -91,32 +91,34 @@ struct PromptCard: View {
// Conditional picker and selection for data saving
switch prompts[currentCardIndex].answerInputType {
- case .date:
- DatePicker("", selection: $dateAnswer, displayedComponents: .date)
- .datePickerStyle(.wheel)
- .frame(maxHeight: 400)
- .labelsHidden()
-
- case .number:
- Picker("", selection: $numberAnswer) {
- ForEach(1...30, id: \.self) { number in
- Text("\(number)")
- }
- }
+ case .date:
+ DatePicker("", selection: $dateAnswer, displayedComponents: .date)
+ .colorScheme(.light)
+ .datePickerStyle(.wheel)
.frame(maxHeight: 400)
- .pickerStyle(.wheel)
- .labelsHidden()
- .padding(.horizontal, screenWidth * 0.1)
+ .labelsHidden()
+
+ case .number:
+ Picker("", selection: $numberAnswer) {
+ ForEach(1...30, id: \.self) { number in
+ Text("\(number)")
+ }
+ }
+ .colorScheme(.light)
+ .frame(maxHeight: 400)
+ .pickerStyle(.wheel)
+ .labelsHidden()
+ .padding(.horizontal, screenWidth * 0.1)
}
Button(action: {
let answer: Answer
switch prompts[currentCardIndex].answerInputType {
- case .date:
- answer = Answer(promptID: currentCardIndex, answer: DateAnswer(date: dateAnswer))
- case .number:
- answer = Answer(promptID: currentCardIndex, answer: NumericAnswer(number: numberAnswer))
+ case .date:
+ answer = Answer(promptID: currentCardIndex, answer: DateAnswer(date: dateAnswer))
+ case .number:
+ answer = Answer(promptID: currentCardIndex, answer: NumericAnswer(number: numberAnswer))
}
answerManager.saveOrUpdateAnswer(answer: answer)
@@ -146,7 +148,7 @@ struct PromptCard: View {
.frame(width: screenWidth * 0.65, height: screenHeight * 0.05)
.cornerRadius(10)
.foregroundColor(.green)
-
+
Text("Next")
.foregroundColor(.white)
}
@@ -171,16 +173,16 @@ struct PromptCard: View {
// Calculate the next prediction
answerManager.calculatePeriodDate()
answerManager.calculatePredictedDates()
-
+
// Add answer data as the first period data
if let lastPeriodDate = (lastPeriodAnswer!.answer as? DateAnswer)?.date,
let cycleLength = (cycleLengthAnswer!.answer as? NumericAnswer)?.number,
let periodDuration = (periodDurationAnswer!.answer as? NumericAnswer)?.number {
let firstPeriod = Period(
- startDate: startDatePeriod!,
- endDate: lastPeriodDate,
- duration: periodDuration,
- cycleLength: cycleLength
+ startDate: startDatePeriod!,
+ endDate: lastPeriodDate,
+ duration: periodDuration,
+ cycleLength: cycleLength
)
periodManager.addPeriod(firstPeriod)
}