diff --git a/PadelClub/Data/Tournament.swift b/PadelClub/Data/Tournament.swift index fd17325..512ba1a 100644 --- a/PadelClub/Data/Tournament.swift +++ b/PadelClub/Data/Tournament.swift @@ -1966,7 +1966,7 @@ defer { func labelIndexOf(team: TeamRegistration) -> String? { if let teamIndex = indexOf(team: team) { - return "#" + (teamIndex + 1).formatted() + return "Tête de série #" + (teamIndex + 1).formatted() } else { return nil } diff --git a/PadelClub/Views/Components/FortuneWheelView.swift b/PadelClub/Views/Components/FortuneWheelView.swift index ac659d1..795773a 100644 --- a/PadelClub/Views/Components/FortuneWheelView.swift +++ b/PadelClub/Views/Components/FortuneWheelView.swift @@ -8,20 +8,20 @@ import SwiftUI protocol SpinDrawable { - func segmentLabel(_ displayStyle: DisplayStyle) -> [String] + func segmentLabel(_ displayStyle: DisplayStyle, hideNames: Bool) -> [String] } extension String: SpinDrawable { - func segmentLabel(_ displayStyle: DisplayStyle) -> [String] { + func segmentLabel(_ displayStyle: DisplayStyle, hideNames: Bool) -> [String] { [self] } } extension Match: SpinDrawable { - func segmentLabel(_ displayStyle: DisplayStyle) -> [String] { + func segmentLabel(_ displayStyle: DisplayStyle, hideNames: Bool) -> [String] { let teams = teams() - if teams.count == 1 { - return teams.first!.segmentLabel(displayStyle) + if teams.count == 1, hideNames == false { + return teams.first!.segmentLabel(displayStyle, hideNames: hideNames) } else { return [roundTitle(), matchTitle(displayStyle)].compactMap { $0 } } @@ -29,12 +29,16 @@ extension Match: SpinDrawable { } extension TeamRegistration: SpinDrawable { - func segmentLabel(_ displayStyle: DisplayStyle) -> [String] { + func segmentLabel(_ displayStyle: DisplayStyle, hideNames: Bool) -> [String] { var strings: [String] = [] let indexLabel = tournamentObject()?.labelIndexOf(team: self) if let indexLabel { strings.append(indexLabel) + if hideNames { + return strings + } } + strings.append(contentsOf: self.players().map { $0.playerLabel(displayStyle) }) return strings } @@ -51,8 +55,8 @@ struct DrawOption: Identifiable, SpinDrawable { let initialIndex: Int let option: SpinDrawable - func segmentLabel(_ displayStyle: DisplayStyle) -> [String] { - option.segmentLabel(displayStyle) + func segmentLabel(_ displayStyle: DisplayStyle, hideNames: Bool) -> [String] { + option.segmentLabel(displayStyle, hideNames: hideNames) } } @@ -62,6 +66,7 @@ struct SpinDrawView: View { let drawees: [any SpinDrawable] @State var segments: [any SpinDrawable] var autoMode: Bool = false + var hideNames: Bool = false let completion: ([DrawResult]) async -> Void // Completion closure @State private var drawCount: Int = 0 @@ -89,12 +94,12 @@ struct SpinDrawView: View { } } else if drawCount < drawees.count { Section { - _segmentLabelView(segment: drawees[drawCount].segmentLabel(.wide), horizontalAlignment: .center) + _segmentLabelView(segment: drawees[drawCount].segmentLabel(.wide, hideNames: hideNames), horizontalAlignment: .center) } Section { ZStack { - FortuneWheelContainerView(segments: drawOptions, autoMode: autoMode) { index in + FortuneWheelContainerView(segments: drawOptions, autoMode: autoMode, hideNames: hideNames) { index in self.selectedIndex = index self.draws.append(DrawResult(drawee: drawCount, drawIndex: drawOptions[index].initialIndex)) self.drawOptions.remove(at: index) @@ -209,8 +214,8 @@ struct SpinDrawView: View { private func _segmentLabelView(segment: [String], horizontalAlignment: HorizontalAlignment = .leading) -> some View { VStack(alignment: horizontalAlignment, spacing: 0.0) { - ForEach(segment, id: \.self) { string in - Text(string).font(.title3) + ForEach(segment.indices, id: \.self) { lineIndex in + Text(segment[lineIndex]).font(.title3) .frame(maxWidth: .infinity) .lineLimit(1) } @@ -221,13 +226,13 @@ struct SpinDrawView: View { private func _validationLabelView(drawee: Int, result: SpinDrawable) -> some View { VStack(spacing: 0.0) { let draw = drawees[drawee] - _segmentLabelView(segment: draw.segmentLabel(.wide), horizontalAlignment: .center) + _segmentLabelView(segment: draw.segmentLabel(.wide, hideNames: hideNames), horizontalAlignment: .center) if result as? TeamRegistration != nil { Image(systemName: "flag.2.crossed.fill").font(.largeTitle).foregroundColor(.logoRed) } else { Image(systemName: "arrowshape.down.fill").font(.largeTitle).foregroundColor(.logoRed) } - _segmentLabelView(segment: result.segmentLabel(.wide), horizontalAlignment: .center) + _segmentLabelView(segment: result.segmentLabel(.wide, hideNames: hideNames), horizontalAlignment: .center) } } } @@ -236,10 +241,11 @@ struct FortuneWheelContainerView: View { @State private var rotation: Double = 0 let segments: [any SpinDrawable] let autoMode: Bool + let hideNames: Bool let completion: (Int) -> Void // Completion closure var body: some View { - FortuneWheelView(segments: segments) + FortuneWheelView(segments: segments, hideNames: hideNames) .rotationEffect(.degrees(rotation)) .aspectRatio(contentMode: .fill) .padding(.top, 5) @@ -303,6 +309,7 @@ struct FortuneWheelContainerView: View { struct FortuneWheelView: View { let segments: [any SpinDrawable] + let hideNames: Bool let colors: [Color] = [.yellow, .cyan, .green, .blue, .orange, .purple, .mint, .brown] func getColor(forIndex index: Int) -> Color { @@ -330,12 +337,12 @@ struct FortuneWheelView: View { path.addArc(center: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false) path.closeSubpath() } - .fill(getColor(forIndex:index)) + .fill(getColor(forIndex: index)) VStack(alignment: .trailing, spacing: 0.0) { - let strings = segments[index].segmentLabel(.short) - ForEach(strings, id: \.self) { string in - Text(string).bold() + let strings = labels(forIndex: index) + ForEach(strings.indices, id: \.self) { lineIndex in + Text(strings[lineIndex]).bold() .font(.subheadline) } } @@ -349,6 +356,19 @@ struct FortuneWheelView: View { } } + private func labels(forIndex index: Int) -> [String] { + if segments.count < 5 { + return segments[index].segmentLabel(.short, hideNames: hideNames) + } else { + let values = segments[index].segmentLabel(.short, hideNames: hideNames) + if values.count < 3 { + return values + } else { + return Array(segments[index].segmentLabel(.short, hideNames: hideNames).prefix(1)) + } + } + } + // Calculate the position for the text in the middle of the arc segment private func arcPosition(index: Int, radius: Double) -> CGPoint { let segmentAngle = 360.0 / Double(segments.count) diff --git a/PadelClub/Views/Round/RoundView.swift b/PadelClub/Views/Round/RoundView.swift index 3470ab4..bfe0e13 100644 --- a/PadelClub/Views/Round/RoundView.swift +++ b/PadelClub/Views/Round/RoundView.swift @@ -18,6 +18,7 @@ struct RoundView: View { @State private var selectedSeedGroup: SeedInterval? @State private var showPrintScreen: Bool = false + @State private var hideNames: Bool = true var upperRound: UpperRound @@ -141,6 +142,12 @@ struct RoundView: View { if (availableSeedGroup.isFixed() == false) { Section { + Toggle(isOn: $hideNames) { + Text("Masquer les noms") + if hideNames { + Text("Réalise un tirage des positions.") + } + } RowButtonView("Tirage au sort \(availableSeedGroup.localizedInterval()) visuel") { self.selectedSeedGroup = availableSeedGroup } @@ -266,7 +273,7 @@ struct RoundView: View { let seeds = _seeds(availableSeedGroup: availableSeedGroup) let availableSeedSpot = _availableSeedSpot(availableSeedGroup: availableSeedGroup) NavigationStack { - SpinDrawView(drawees: seeds, segments: availableSeedSpot, autoMode: true) { draws in + SpinDrawView(drawees: seeds, segments: availableSeedSpot, autoMode: true, hideNames: hideNames) { draws in Task { draws.forEach { drawResult in seeds[drawResult.drawee].setSeedPosition(inSpot: availableSeedSpot[drawResult.drawIndex], slot: nil, opposingSeeding: opposingSeeding) @@ -397,7 +404,7 @@ struct MatchSpot: SpinDrawable { let match: Match let teamPosition: TeamPosition - func segmentLabel(_ displayStyle: DisplayStyle) -> [String] { + func segmentLabel(_ displayStyle: DisplayStyle, hideNames: Bool) -> [String] { [match.roundTitle(), matchTitle(displayStyle: displayStyle)].compactMap { $0 } } diff --git a/PadelClub/Views/Tournament/Screen/BroadcastView.swift b/PadelClub/Views/Tournament/Screen/BroadcastView.swift index d687e29..4e12408 100644 --- a/PadelClub/Views/Tournament/Screen/BroadcastView.swift +++ b/PadelClub/Views/Tournament/Screen/BroadcastView.swift @@ -102,18 +102,14 @@ struct BroadcastView: View { } Section { - Toggle(isOn: $tournament.isPrivate) { - Text("Tournoi privé") - } + Toggle("Visible sur Padel Club", isOn: Binding( + get: { !tournament.isPrivate }, + set: { tournament.isPrivate = !$0 } + )) Toggle(isOn: $tournament.hideTeamsWeight) { Text("Masquer les poids des équipes") } - - } footer: { - let verb : String = tournament.isPrivate ? "est" : "sera" - let footerString = " Le tournoi \(verb) masqué sur le site [Padel Club](\(URLs.main.rawValue))" - Text(.init(footerString)) } if tournament.isPrivate == false {