WIP Versus Page

main
Mathieu GROUSSEAU 1 month ago
parent 9bc33ef59d
commit aee3eea20b

@ -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 = "<group>"; };
F0F59E542DDDED1D00BE32D6 /* IngameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IngameView.swift; sourceTree = "<group>"; };
F0F59E562DE6D6E600BE32D6 /* SavedGamesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SavedGamesView.swift; sourceTree = "<group>"; };
F0F59E582DE6EB2A00BE32D6 /* PlayerVSPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerVSPage.swift; sourceTree = "<group>"; };
F0F59E5A2DE6F68800BE32D6 /* ScoreboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScoreboardView.swift; sourceTree = "<group>"; };
/* 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 = "<group>";
@ -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 */,
);

@ -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"
}
}
}

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

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

@ -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()
}
Loading…
Cancel
Save