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) }