diff --git a/App/App.xcodeproj/project.pbxproj b/App/App.xcodeproj/project.pbxproj index cee8262..4cc985b 100644 --- a/App/App.xcodeproj/project.pbxproj +++ b/App/App.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ F0F59E532DDDC35100BE32D6 /* NewGameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F59E522DDDC35100BE32D6 /* NewGameView.swift */; }; F0F59E552DDDED1D00BE32D6 /* IngameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F59E542DDDED1D00BE32D6 /* IngameView.swift */; }; F0F59E572DE6D6E600BE32D6 /* SavedGamesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F59E562DE6D6E600BE32D6 /* SavedGamesView.swift */; }; + F0F59E592DE6EB2A00BE32D6 /* PlayerVSPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F59E582DE6EB2A00BE32D6 /* PlayerVSPage.swift */; }; + F0F59E5B2DE6F68800BE32D6 /* ScoreboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0F59E5A2DE6F68800BE32D6 /* ScoreboardView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -63,6 +65,8 @@ F0F59E522DDDC35100BE32D6 /* NewGameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewGameView.swift; sourceTree = ""; }; F0F59E542DDDED1D00BE32D6 /* IngameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IngameView.swift; sourceTree = ""; }; F0F59E562DE6D6E600BE32D6 /* SavedGamesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SavedGamesView.swift; sourceTree = ""; }; + F0F59E582DE6EB2A00BE32D6 /* PlayerVSPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerVSPage.swift; sourceTree = ""; }; + F0F59E5A2DE6F68800BE32D6 /* ScoreboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScoreboardView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -172,6 +176,8 @@ F0F59E522DDDC35100BE32D6 /* NewGameView.swift */, F0F59E542DDDED1D00BE32D6 /* IngameView.swift */, F0F59E562DE6D6E600BE32D6 /* SavedGamesView.swift */, + F0F59E582DE6EB2A00BE32D6 /* PlayerVSPage.swift */, + F0F59E5A2DE6F68800BE32D6 /* ScoreboardView.swift */, ); path = View; sourceTree = ""; @@ -309,9 +315,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F0F59E592DE6EB2A00BE32D6 /* PlayerVSPage.swift in Sources */, F001A04E2DD48FAB00809561 /* MainMenuView.swift in Sources */, F001A04C2DD48FAB00809561 /* AppApp.swift in Sources */, F0F59E532DDDC35100BE32D6 /* NewGameView.swift in Sources */, + F0F59E5B2DE6F68800BE32D6 /* ScoreboardView.swift in Sources */, F0F59E572DE6D6E600BE32D6 /* SavedGamesView.swift in Sources */, F0F59E552DDDED1D00BE32D6 /* IngameView.swift in Sources */, ); diff --git a/App/App/Localizable.xcstrings b/App/App/Localizable.xcstrings index 2cedb63..14520ac 100644 --- a/App/App/Localizable.xcstrings +++ b/App/App/Localizable.xcstrings @@ -1,7 +1,7 @@ { "sourceLanguage" : "en", "strings" : { - "%@ savedGames.table.column.players.entry %@" : { + "%@ scoreboard.column.players.entry %@" : { "localizations" : { "en" : { "stringUnit" : { @@ -16,6 +16,9 @@ } } } + }, + "%llu" : { + }, "appName" : { "extractionState" : "manual", @@ -387,6 +390,38 @@ } } }, + "playerVs.chart.draws" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Draws" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egalités" + } + } + } + }, + "playerVs.chart.wins %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Win %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Victoires %@" + } + } + } + }, "savedGames.section.finished" : { "localizations" : { "en" : { @@ -419,66 +454,66 @@ } } }, - "savedGames.table.column.date" : { + "savedGames.title" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Date" + "value" : "Scoreboard" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Date" + "value" : "Tableau des scores" } } } }, - "savedGames.table.column.players" : { + "scoreboard.table.column.date" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Players" + "value" : "Date" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Joueurs" + "value" : "Date" } } } }, - "savedGames.table.column.rules" : { + "scoreboard.table.column.players" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Rules" + "value" : "Players" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Règles" + "value" : "Joueurs" } } } }, - "savedGames.title" : { + "scoreboard.table.column.rules" : { "localizations" : { "en" : { "stringUnit" : { "state" : "translated", - "value" : "Scoreboard" + "value" : "Rules" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Tableau des scores" + "value" : "Règles" } } } diff --git a/App/App/View/PlayerVSPage.swift b/App/App/View/PlayerVSPage.swift new file mode 100644 index 0000000..956db4f --- /dev/null +++ b/App/App/View/PlayerVSPage.swift @@ -0,0 +1,61 @@ +// +// PlayerVSPage.swift +// App +// +// Created by etudiant2 on 28/05/2025. +// + +import SwiftUI +import Charts + +struct PlayerVSPage: View { + private var chartData: [(key: LocalizedStringKey, color: Color, value: UInt)] = [ + (key: "playerVs.chart.wins \("Player 1")", color: .red, value: 1), + (key: "playerVs.chart.wins \("Player 2")", color: .yellow, value: 2), + (key: "playerVs.chart.draws", color: .gray, value: 3), + ] + + var body: some View { + VStack { + HStack { + PlayerPicker() + + Spacer() + + Chart { + ForEach(chartData, id: \.color) { entry in + SectorMark(angle: .value(entry.key, entry.value)) + .annotation(position: .overlay) { + Text("\(entry.value)").font(.caption) + } + .foregroundStyle(entry.color) + } + }.frame(height: 100) + + Spacer() + + PlayerPicker() + } + + ScoreboardView() + } + } +} + +struct PlayerPicker: View { + var body: some View { + VStack { + Circle().frame(width: 50, height: 50) + + let text: String = "Button Idk" + + Button(text) { + // + } + } + } +} + +#Preview { + PlayerVSPage() +} diff --git a/App/App/View/SavedGamesView.swift b/App/App/View/SavedGamesView.swift index c7c5bdb..69be640 100644 --- a/App/App/View/SavedGamesView.swift +++ b/App/App/View/SavedGamesView.swift @@ -10,54 +10,16 @@ import SwiftUI struct SavedGamesView: View { var body: some View { // TODO: use the same collection view with headers instead? Or use collapsible sections? - ScoreTable(key: "savedGames.section.unfinished") - ScoreTable(key: "savedGames.section.finished") - } -} - -struct ScoreTable: View { - let key: LocalizedStringKey - - @Environment(\.horizontalSizeClass) - private var horizontalSizeClass - - @State private var unsinished = [ - Result(date: Date.now, player1: "P1", player2: "P2", rules: "Rule1"), - Result(date: Date.now, player1: "P2", player2: "P3", rules: "Rule2"), - Result(date: Date.now, player1: "P3", player2: "P4", rules: "Rule3"), - Result(date: Date.now, player1: "P4", player2: "P5", rules: "Rule4"), - Result(date: Date.now, player1: "P5", player2: "P1", rules: "Rule5") - ]; - - var body: some View { - Section(self.key) { - // TODO: sort by date - if horizontalSizeClass == .compact { - List(self.unsinished) { result in - VStack(alignment: .center) { - Text("\(result.player1) savedGames.table.column.players.entry \(result.player2)") - HStack { - Text(result.date, style: .date) - Spacer() - Text(result.rules) - }.foregroundStyle(.secondary) - } - } - } else{ - Table(self.unsinished) { - TableColumn("savedGames.table.column.date") { result in - Text(result.date, style: .date) - } - TableColumn("savedGames.table.column.players") { result in - Text("\(result.player1) savedGames.table.column.players.entry \(result.player2)") - } - TableColumn("savedGames.table.column.rules", value: \.rules) - } - } + Section("savedGames.section.unfinished") { + ScoreboardView() + } + Section("savedGames.section.finished"){ + ScoreboardView() } } } + struct Result: Identifiable { let id = UUID() diff --git a/App/App/View/ScoreboardView.swift b/App/App/View/ScoreboardView.swift new file mode 100644 index 0000000..d622749 --- /dev/null +++ b/App/App/View/ScoreboardView.swift @@ -0,0 +1,51 @@ +// +// ScoreboardView.swift +// App +// +// Created by etudiant2 on 28/05/2025. +// + +import SwiftUI + +struct ScoreboardView: View { + @Environment(\.horizontalSizeClass) + private var horizontalSizeClass + + @State private var unsinished = [ + Result(date: Date.now, player1: "P1", player2: "P2", rules: "Rule1"), + Result(date: Date.now, player1: "P2", player2: "P3", rules: "Rule2"), + Result(date: Date.now, player1: "P3", player2: "P4", rules: "Rule3"), + Result(date: Date.now, player1: "P4", player2: "P5", rules: "Rule4"), + Result(date: Date.now, player1: "P5", player2: "P1", rules: "Rule5") + ]; + + var body: some View { + // TODO: sort by date + if horizontalSizeClass == .compact { + List(self.unsinished) { result in + VStack(alignment: .center) { + Text("\(result.player1) scoreboard.column.players.entry \(result.player2)") + HStack { + Text(result.date, style: .date) + Spacer() + Text(result.rules) + }.foregroundStyle(.secondary) + } + } + } else{ + Table(self.unsinished) { + TableColumn("scoreboard.table.column.date") { result in + Text(result.date, style: .date) + } + TableColumn("scoreboard.table.column.players") { result in + Text("\(result.player1) scoreboard.column.players.entry \(result.player2)") + } + TableColumn("scoreboard.table.column.rules", value: \.rules) + } + } + } +} + +#Preview { + ScoreboardView() +}