enhance score input to handle first team to input score switching

paca_championship
Raz 1 year ago
parent c016e5e0c8
commit 566c5c1eac
  1. 19
      PadelClub/ViewModel/MatchDescriptor.swift
  2. 4
      PadelClub/ViewModel/SetDescriptor.swift
  3. 68
      PadelClub/Views/Score/EditScoreView.swift
  4. 183
      PadelClub/Views/Score/SetInputView.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 })
}

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

@ -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<Bool>) {
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 {

@ -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<Int?> {
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<Int?> {
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<Int?> {
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<Int?> {
Binding {
otherTeamTieBreakValue
} set: { value in
if firstTeamIsFirstScoreToEnter {
setDescriptor.tieBreakValueTeamTwo = value
} else {
setDescriptor.tieBreakValueTeamOne = value
}
}
}
private var currentValue: Binding<Int?> {
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<Int?> {
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)..<max(tieBreakValueTeamOne, tieBreakValueTeamTwo)+8)).reversed()
}
if setDescriptor.tieBreakValueTeamOne != nil {
if defaultTeamTieBreakValue != nil {
return [9, 5, 4, 3, 2, 1, 0]
}
return SetFormat.six.possibleValues
@ -126,14 +209,14 @@ struct SetInputView: View {
PointSelectionView(valueSelected: currentValue, values: possibleValues(), possibleValues: setFormat.possibleValues, disableValues: disableValues, deleteAction: deleteLastValue)
.listRowInsets(EdgeInsets(top: -8, leading: -20, bottom: 0, trailing: 0))
} label: {
SetLabelView(initialValueLeft: $setDescriptor.valueTeamOne, initialValueRight: $setDescriptor.valueTeamTwo, shouldDisplaySteppers: isMainViewTieBreakView)
SetLabelView(initialValueLeft: defaultTeamValueBinding, initialValueRight: otherTeamValueBinding, shouldDisplaySteppers: isMainViewTieBreakView)
}
if showTieBreakView {
DisclosureGroup(isExpanded: $showTieBreakInputView) {
PointSelectionView(valueSelected: currentTiebreakValue, values: tieBreakPossibleValues(), possibleValues: SetFormat.six.possibleValues, disableValues: disableTieBreakValues, deleteAction: deleteLastTiebreakValue)
.listRowInsets(EdgeInsets(top: -8, leading: -20, bottom: 0, trailing: 0))
} label: {
SetLabelView(initialValueLeft: $setDescriptor.tieBreakValueTeamOne, initialValueRight: $setDescriptor.tieBreakValueTeamTwo, shouldDisplaySteppers: showTieBreakInputView, isTieBreak: true)
SetLabelView(initialValueLeft: defaultTeamTieBreakValueBinding, initialValueRight: otherTeamTieBreakValueBinding, shouldDisplaySteppers: showTieBreakInputView, isTieBreak: true)
}
}
}
@ -143,71 +226,71 @@ struct SetInputView: View {
.onChange(of: showTieBreakInputView) {
setDescriptor.showTieBreakInputView = showTieBreakInputView
}
.onChange(of: setDescriptor.valueTeamOne) {
if let newValue = setDescriptor.valueTeamOne {
.onChange(of: defaultTeamValue) {
if let newValue = defaultTeamValue {
if newValue == setFormat.scoreToWin - 1 && setFormat.tieBreak == 8 {
setDescriptor.valueTeamTwo = setFormat.scoreToWin
otherTeamValueBinding.wrappedValue = setFormat.scoreToWin
} else if newValue == setFormat.scoreToWin - 2 && setFormat.tieBreak == 8 {
setDescriptor.valueTeamTwo = setFormat.scoreToWin
otherTeamValueBinding.wrappedValue = setFormat.scoreToWin
} else if newValue == setFormat.scoreToWin - 1 {
setDescriptor.valueTeamTwo = setFormat.scoreToWin + 1
otherTeamValueBinding.wrappedValue = setFormat.scoreToWin + 1
} else if newValue <= setFormat.scoreToWin - 2 {
setDescriptor.valueTeamTwo = setFormat.scoreToWin
otherTeamValueBinding.wrappedValue = setFormat.scoreToWin
} else if newValue > 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
}

Loading…
Cancel
Save