Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>RedCal.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>
92 changes: 46 additions & 46 deletions RedCal/AddPeriod.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand All @@ -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)!

Expand Down
40 changes: 20 additions & 20 deletions RedCal/MainView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct MainView: View {
var bounds: Range<Date> {
let start = calendar.startOfDay(for: answerManager.startDatePrediction!)
let end = calendar.startOfDay(for: answerManager.finishDatePrediction!)

return start ..< end
}

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -118,7 +118,7 @@ struct MainView: View {
struct CycleLengthChart: View {
var periods: [Period]
var maxCycleDayLength = 50

var body: some View {
VStack {
HStack {
Expand Down Expand Up @@ -151,7 +151,7 @@ struct CycleLengthChart: View {
)
.clipShape(RoundedRectangle(cornerRadius: 20))
.padding(.horizontal, screenWidth*0.024)

Rectangle()
.fill(Color(hex: "FEDCDC"))
.frame(
Expand All @@ -161,11 +161,11 @@ struct CycleLengthChart: View {
.clipShape(RoundedRectangle(cornerRadius: 20))
.padding(.bottom, 3)
}

Text(String(period.cycleLength!))
.font(.caption)
}
}
}
}
.padding(.vertical, 10)
}
Expand Down
14 changes: 7 additions & 7 deletions RedCal/Model/AnswerManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion RedCal/RedCalApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import SwiftUI
struct RedCalApp: App {
@StateObject var answerManager = AnswerManager()
@StateObject var periodManager = PeriodManager()

var body: some Scene {
WindowGroup {
ContentView()
Expand Down
54 changes: 28 additions & 26 deletions RedCal/UserPrompt.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -146,7 +148,7 @@ struct PromptCard: View {
.frame(width: screenWidth * 0.65, height: screenHeight * 0.05)
.cornerRadius(10)
.foregroundColor(.green)

Text("Next")
.foregroundColor(.white)
}
Expand All @@ -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)
}
Expand Down