From 566c5c1eacd4fb9e60d5f6813178e502ccdbefe1 Mon Sep 17 00:00:00 2001 From: Raz Date: Sat, 26 Oct 2024 11:54:09 +0200 Subject: [PATCH] enhance score input to handle first team to input score switching --- PadelClub/ViewModel/MatchDescriptor.swift | 19 --- PadelClub/ViewModel/SetDescriptor.swift | 4 + PadelClub/Views/Score/EditScoreView.swift | 68 ++++++-- PadelClub/Views/Score/SetInputView.swift | 183 ++++++++++++++++------ 4 files changed, 196 insertions(+), 78 deletions(-) diff --git a/PadelClub/ViewModel/MatchDescriptor.swift b/PadelClub/ViewModel/MatchDescriptor.swift index bbb444a..dd88446 100644 --- a/PadelClub/ViewModel/MatchDescriptor.swift +++ b/PadelClub/ViewModel/MatchDescriptor.swift @@ -62,25 +62,6 @@ class MatchDescriptor: ObservableObject { return true } - func getColor() -> Color { - guard let setDescriptor = setDescriptors.last else { - return .master - } - - if setDescriptor.valueTeamOne == nil { - return colorTeamOne - } else if setDescriptor.valueTeamTwo == nil { - return colorTeamTwo - } else if setDescriptor.tieBreakValueTeamOne == nil, setDescriptor.shouldTieBreak { - return colorTeamOne - } else if setDescriptor.tieBreakValueTeamTwo == nil, setDescriptor.shouldTieBreak { - return colorTeamTwo - } - - return colorTeamTwo - } - - var showSetInputView: Bool { return setDescriptors.anySatisfy({ $0.showSetInputView }) } diff --git a/PadelClub/ViewModel/SetDescriptor.swift b/PadelClub/ViewModel/SetDescriptor.swift index fef0db5..6ef5bfe 100644 --- a/PadelClub/ViewModel/SetDescriptor.swift +++ b/PadelClub/ViewModel/SetDescriptor.swift @@ -17,6 +17,10 @@ struct SetDescriptor: Identifiable, Equatable { var showSetInputView: Bool = true var showTieBreakInputView: Bool = false + var isTeamOneSet: Bool { + return valueTeamOne != nil || tieBreakValueTeamOne != nil + } + var hasEnded: Bool { if let valueTeamTwo, let valueTeamOne { return setFormat.hasEnded(teamOne: valueTeamOne, teamTwo: valueTeamTwo) diff --git a/PadelClub/Views/Score/EditScoreView.swift b/PadelClub/Views/Score/EditScoreView.swift index 600b771..52e3225 100644 --- a/PadelClub/Views/Score/EditScoreView.swift +++ b/PadelClub/Views/Score/EditScoreView.swift @@ -16,12 +16,29 @@ struct EditScoreView: View { @State private var presentMatchFormatSelection: Bool = false @Binding var confirmScoreEdition: Bool @Environment(\.dismiss) private var dismiss + @State private var firstTeamIsFirstScoreToEnter: Bool = true init(match: Match, confirmScoreEdition: Binding) { let matchDescriptor = MatchDescriptor(match: match) _matchDescriptor = .init(wrappedValue: matchDescriptor) _confirmScoreEdition = confirmScoreEdition } + + var defaultTeamIsActive: Bool { + if firstTeamIsFirstScoreToEnter { + matchDescriptor.teamOneSetupIsActive + } else { + matchDescriptor.teamTwoSetupIsActive + } + } + + var otherTeamIsActive: Bool { + if firstTeamIsFirstScoreToEnter { + matchDescriptor.teamTwoSetupIsActive + } else { + matchDescriptor.teamOneSetupIsActive + } + } func walkout(_ team: TeamPosition) { self.matchDescriptor.match?.setWalkOut(team) @@ -45,20 +62,48 @@ struct EditScoreView: View { return winner ? tournament.tournamentLevel.points(for: seedInterval.first - 1, count: teamsCount) : tournament.tournamentLevel.points(for: seedInterval.last - 1, count: teamsCount) } + func getColor(setDescriptor: SetDescriptor) -> Color { + switch (firstTeamIsFirstScoreToEnter, setDescriptor.isTeamOneSet == false) { + case (true, true), (false, false): + return matchDescriptor.colorTeamOne + default: + return matchDescriptor.colorTeamTwo + } + } + + func teamScorePositionLabel(teamPosition: TeamPosition) -> String { + switch (firstTeamIsFirstScoreToEnter, teamPosition == .one) { + case (true, true), (false, false): + return "score de gauche" + default: + return "score de droite" + } + } + var body: some View { Form { Section { - VStack(alignment: .leading) { - Text(matchDescriptor.teamLabelOne) - if matchDescriptor.hasEnded, let pointRange = pointRange(winner: matchDescriptor.winner == .one) { - Text(pointRange.formatted(.number.sign(strategy: .always())) + " pts") - .bold() + HStack { + VStack(alignment: .leading) { + Text(teamScorePositionLabel(teamPosition: .one)).font(.caption) + Text(matchDescriptor.teamLabelOne) + if matchDescriptor.hasEnded, let pointRange = pointRange(winner: matchDescriptor.winner == .one) { + Text(pointRange.formatted(.number.sign(strategy: .always())) + " pts") + .bold() + } } + Spacer() + } + .listRowView(isActive: defaultTeamIsActive, color: matchDescriptor.colorTeamOne, hideColorVariation: false) + .contentShape(Rectangle()) + .frame(maxWidth: .infinity) + .onTapGesture { + firstTeamIsFirstScoreToEnter.toggle() } - .listRowView(isActive: matchDescriptor.teamOneSetupIsActive, color: matchDescriptor.colorTeamOne, hideColorVariation: false) HStack { Spacer() VStack(alignment: .trailing) { + Text(teamScorePositionLabel(teamPosition: .two)).font(.caption) Text(matchDescriptor.teamLabelTwo).multilineTextAlignment(.trailing) if matchDescriptor.hasEnded, let pointRange = pointRange(winner: matchDescriptor.winner == .two) { Text(pointRange.formatted(.number.sign(strategy: .always())) + " pts") @@ -66,7 +111,12 @@ struct EditScoreView: View { } } } - .listRowView(isActive: matchDescriptor.teamTwoSetupIsActive, color: matchDescriptor.colorTeamTwo, hideColorVariation: false, alignment: .trailing) + .listRowView(isActive: otherTeamIsActive, color: matchDescriptor.colorTeamTwo, hideColorVariation: false, alignment: .trailing) + .contentShape(Rectangle()) + .frame(maxWidth: .infinity) + .onTapGesture { + firstTeamIsFirstScoreToEnter.toggle() + } } header: { if let roundTitle = matchDescriptor.match?.roundAndMatchTitle() { Text(roundTitle) @@ -96,7 +146,7 @@ struct EditScoreView: View { } } ForEach($matchDescriptor.setDescriptors) { $setDescriptor in - SetInputView(setDescriptor: $setDescriptor) + SetInputView(setDescriptor: $setDescriptor, firstTeamIsFirstScoreToEnter: firstTeamIsFirstScoreToEnter) .onChange(of: setDescriptor.hasEnded) { if setDescriptor.hasEnded { if matchDescriptor.hasEnded == false { @@ -107,7 +157,7 @@ struct EditScoreView: View { matchDescriptor.setDescriptors = Array(matchDescriptor.setDescriptors[0...index]) } } - .tint(matchDescriptor.getColor()) + .tint(getColor(setDescriptor: setDescriptor)) } if matchDescriptor.hasEnded { diff --git a/PadelClub/Views/Score/SetInputView.swift b/PadelClub/Views/Score/SetInputView.swift index 231e168..ff87f39 100644 --- a/PadelClub/Views/Score/SetInputView.swift +++ b/PadelClub/Views/Score/SetInputView.swift @@ -11,6 +11,7 @@ struct SetInputView: View { @Binding var setDescriptor: SetDescriptor @State private var showSetInputView: Bool = true @State private var showTieBreakInputView: Bool = false + var firstTeamIsFirstScoreToEnter: Bool = true var setFormat: SetFormat { setDescriptor.setFormat } @@ -22,56 +23,138 @@ struct SetInputView: View { setFormat == .superTieBreak || setFormat == .megaTieBreak } + var defaultTeamValue: Int? { + if firstTeamIsFirstScoreToEnter { + return setDescriptor.valueTeamOne + } else { + return setDescriptor.valueTeamTwo + } + } + + var defaultTeamValueBinding: Binding { + Binding { + defaultTeamValue + } set: { value in + if firstTeamIsFirstScoreToEnter { + setDescriptor.valueTeamOne = value + } else { + setDescriptor.valueTeamTwo = value + } + } + } + + var otherTeamValue: Int? { + if firstTeamIsFirstScoreToEnter { + return setDescriptor.valueTeamTwo + } else { + return setDescriptor.valueTeamOne + } + } + + var otherTeamValueBinding: Binding { + Binding { + otherTeamValue + } set: { value in + if firstTeamIsFirstScoreToEnter { + setDescriptor.valueTeamTwo = value + } else { + setDescriptor.valueTeamOne = value + } + } + + } + + var defaultTeamTieBreakValue: Int? { + if firstTeamIsFirstScoreToEnter { + return setDescriptor.tieBreakValueTeamOne + } else { + return setDescriptor.tieBreakValueTeamTwo + } + } + + var defaultTeamTieBreakValueBinding: Binding { + Binding { + defaultTeamTieBreakValue + } set: { value in + if firstTeamIsFirstScoreToEnter { + setDescriptor.tieBreakValueTeamOne = value + } else { + setDescriptor.tieBreakValueTeamTwo = value + } + } + } + + var otherTeamTieBreakValue: Int? { + if firstTeamIsFirstScoreToEnter { + return setDescriptor.tieBreakValueTeamTwo + } else { + return setDescriptor.tieBreakValueTeamOne + } + } + + var otherTeamTieBreakValueBinding: Binding { + Binding { + otherTeamTieBreakValue + } set: { value in + if firstTeamIsFirstScoreToEnter { + setDescriptor.tieBreakValueTeamTwo = value + } else { + setDescriptor.tieBreakValueTeamOne = value + } + } + + } + private var currentValue: Binding { Binding { - if setDescriptor.valueTeamOne != nil { - return setDescriptor.valueTeamTwo + if defaultTeamValue != nil { + return otherTeamValue } else { - return setDescriptor.valueTeamOne + return defaultTeamValue } } set: { newValue, _ in - if setDescriptor.valueTeamOne != nil { - setDescriptor.valueTeamTwo = newValue + if defaultTeamValue != nil { + otherTeamValueBinding.wrappedValue = newValue } else { - setDescriptor.valueTeamOne = newValue + defaultTeamValueBinding.wrappedValue = newValue } } } private var currentTiebreakValue: Binding { Binding { - if setDescriptor.tieBreakValueTeamOne != nil { - return setDescriptor.tieBreakValueTeamTwo + if defaultTeamTieBreakValue != nil { + return otherTeamTieBreakValue } else { - return setDescriptor.tieBreakValueTeamOne + return defaultTeamTieBreakValue } } set: { newValue, _ in - if let tieBreakValueTeamOne = setDescriptor.tieBreakValueTeamOne, let tieBreakValueTeamTwo = setDescriptor.tieBreakValueTeamTwo { + if let tieBreakValueTeamOne = defaultTeamTieBreakValue, let tieBreakValueTeamTwo = otherTeamTieBreakValue { if tieBreakValueTeamOne < tieBreakValueTeamTwo && tieBreakValueTeamTwo > 6 { - setDescriptor.tieBreakValueTeamOne = newValue + defaultTeamTieBreakValueBinding.wrappedValue = newValue } else if tieBreakValueTeamOne > tieBreakValueTeamTwo && tieBreakValueTeamOne > 6 { - setDescriptor.tieBreakValueTeamTwo = newValue + otherTeamTieBreakValueBinding.wrappedValue = newValue } } - else if setDescriptor.tieBreakValueTeamOne != nil { - setDescriptor.tieBreakValueTeamTwo = newValue + else if defaultTeamTieBreakValue != nil { + otherTeamTieBreakValueBinding.wrappedValue = newValue } else { - setDescriptor.tieBreakValueTeamOne = newValue + defaultTeamTieBreakValueBinding.wrappedValue = newValue } } } private var disableValues: [Int] { - if let valueTeamOne = setDescriptor.valueTeamOne { + if let valueTeamOne = defaultTeamValue { return setFormat.disableValuesForTeamTwo(with: valueTeamOne) } return [] } private var disableTieBreakValues: [Int] { - if let tieBreakValueTeamOne = setDescriptor.tieBreakValueTeamOne { + if let tieBreakValueTeamOne = defaultTeamTieBreakValue { if tieBreakValueTeamOne == 7 { return [7,6] } @@ -90,7 +173,7 @@ struct SetInputView: View { } func possibleValues() -> [Int] { - if let valueTeamOne = setDescriptor.valueTeamOne { + if let valueTeamOne = defaultTeamValue { if valueTeamOne == 7 && setFormat == .six { return [6,5] } @@ -102,7 +185,7 @@ struct SetInputView: View { } func tieBreakPossibleValues() -> [Int] { - if let tieBreakValueTeamOne = setDescriptor.tieBreakValueTeamOne, let tieBreakValueTeamTwo = setDescriptor.tieBreakValueTeamTwo { + if let tieBreakValueTeamOne = defaultTeamTieBreakValue, let tieBreakValueTeamTwo = otherTeamTieBreakValue { if tieBreakValueTeamOne == 6 && tieBreakValueTeamTwo == 8 { return [] } @@ -114,7 +197,7 @@ struct SetInputView: View { } return Array(((max(tieBreakValueTeamOne, tieBreakValueTeamTwo)+2).. 10 && setFormat == .superTieBreak { - setDescriptor.valueTeamTwo = newValue - 2 + otherTeamValueBinding.wrappedValue = newValue - 2 } else if newValue > 15 && setFormat == .megaTieBreak { - setDescriptor.valueTeamTwo = newValue - 2 + otherTeamValueBinding.wrappedValue = newValue - 2 } } } - .onChange(of: setDescriptor.valueTeamTwo) { - if setDescriptor.valueTeamOne != nil && setDescriptor.valueTeamTwo != nil { + .onChange(of: otherTeamValue) { + if defaultTeamValue != nil && otherTeamValue != nil { showSetInputView = false } } - .onChange(of: setDescriptor.tieBreakValueTeamOne) { - if let newValue = setDescriptor.tieBreakValueTeamOne, setDescriptor.tieBreakValueTeamTwo == nil { + .onChange(of: defaultTeamTieBreakValue) { + if let newValue = defaultTeamTieBreakValue, otherTeamTieBreakValue == nil { if newValue > 7 { - setDescriptor.tieBreakValueTeamTwo = newValue - 2 + otherTeamTieBreakValueBinding.wrappedValue = newValue - 2 } if newValue == 6 { - setDescriptor.tieBreakValueTeamTwo = newValue + 2 + otherTeamTieBreakValueBinding.wrappedValue = newValue + 2 } if newValue <= 5 { - setDescriptor.tieBreakValueTeamTwo = 7 + otherTeamTieBreakValueBinding.wrappedValue = 7 } } - else if let newValue = setDescriptor.tieBreakValueTeamOne, let tieBreakValueTeamTwo = setDescriptor.tieBreakValueTeamTwo { + else if let newValue = defaultTeamTieBreakValue, let tieBreakValueTeamTwo = otherTeamTieBreakValue { if newValue > 6 && tieBreakValueTeamTwo < newValue { - setDescriptor.tieBreakValueTeamTwo = newValue - 2 + otherTeamTieBreakValueBinding.wrappedValue = newValue - 2 } if newValue > 6 && tieBreakValueTeamTwo > newValue { - setDescriptor.tieBreakValueTeamTwo = newValue + 2 + otherTeamTieBreakValueBinding.wrappedValue = newValue + 2 } if newValue == 6 { - setDescriptor.tieBreakValueTeamTwo = newValue + 2 + otherTeamTieBreakValueBinding.wrappedValue = newValue + 2 } if newValue <= 5 { - setDescriptor.tieBreakValueTeamTwo = 7 + otherTeamTieBreakValueBinding.wrappedValue = 7 showTieBreakInputView = false } } } - .onChange(of: setDescriptor.tieBreakValueTeamTwo) { - if let tieBreakValueTeamOne = setDescriptor.tieBreakValueTeamOne, tieBreakValueTeamOne <= 5 { + .onChange(of: otherTeamTieBreakValue) { + if let tieBreakValueTeamOne = defaultTeamTieBreakValue, tieBreakValueTeamOne <= 5 { showTieBreakInputView = false } else { - if let tieBreakValueTeamTwo = setDescriptor.tieBreakValueTeamTwo { - if tieBreakValueTeamTwo > 6 && tieBreakValueTeamTwo > setDescriptor.tieBreakValueTeamOne ?? 0 { - setDescriptor.tieBreakValueTeamOne = tieBreakValueTeamTwo - 2 + if let tieBreakValueTeamTwo = otherTeamTieBreakValue { + if tieBreakValueTeamTwo > 6 && tieBreakValueTeamTwo > defaultTeamTieBreakValue ?? 0 { + defaultTeamTieBreakValueBinding.wrappedValue = tieBreakValueTeamTwo - 2 } - if tieBreakValueTeamTwo > 4 && tieBreakValueTeamTwo < setDescriptor.tieBreakValueTeamOne ?? 0 { - setDescriptor.tieBreakValueTeamOne = tieBreakValueTeamTwo + 2 + if tieBreakValueTeamTwo > 4 && tieBreakValueTeamTwo < defaultTeamTieBreakValue ?? 0 { + defaultTeamTieBreakValueBinding.wrappedValue = tieBreakValueTeamTwo + 2 } } - if let tieBreakValueTeamTwo = setDescriptor.tieBreakValueTeamTwo, let tieBreakValueTeamOne = setDescriptor.tieBreakValueTeamOne { + if let tieBreakValueTeamTwo = otherTeamTieBreakValue, let tieBreakValueTeamOne = defaultTeamTieBreakValue { if tieBreakValueTeamTwo < 6 && tieBreakValueTeamOne == 7 { showTieBreakInputView = false }