Update affichage Ipad

pull/24/head
Louis DUFOUR 10 months ago
parent 5cdddf9eb4
commit 0afbdff586

@ -21,7 +21,7 @@ struct ArkitDoushiQiApp: App {
@StateObject private var languageSettings = LanguageSettings(selectedLanguage: .English) @StateObject private var languageSettings = LanguageSettings(selectedLanguage: .English)
var body: some Scene { var body: some Scene {
WindowGroup { WindowGroup {
MainMenu() MainMenu(playButtonText: "Play", registeredGamesButtonText: "Registered Games")
.environmentObject(LanguageSettings(selectedLanguage: .French) .environmentObject(LanguageSettings(selectedLanguage: .French)
) )
.environmentObject(languageSettings) .environmentObject(languageSettings)

@ -4,10 +4,13 @@
// //
// Created by Johan LACHENAL on 16/05/2024. // Created by Johan LACHENAL on 16/05/2024.
// //
import SwiftUI import SwiftUI
struct MainMenu: View { struct MainMenu: View {
@EnvironmentObject var languageSettings: LanguageSettings @EnvironmentObject var languageSettings: LanguageSettings
let playButtonText: LocalizedStringKey
let registeredGamesButtonText: LocalizedStringKey
@State private var action: Int? = 0 @State private var action: Int? = 0
@AppStorage("isDarkMode") private var isDarkMode = false @AppStorage("isDarkMode") private var isDarkMode = false
@State private var reloadView = false @State private var reloadView = false
@ -16,14 +19,15 @@ struct MainMenu: View {
@Environment(\.colorScheme) var colorScheme @Environment(\.colorScheme) var colorScheme
var body: some View { var body: some View {
NavigationView { NavigationStack {
ZStack { ZStack {
VStack { VStack {
Spacer().frame(height: 50)
Text("DOUSHIQI") Text("DOUSHIQI")
.font(.custom("Nuku Nuku", size: 48, relativeTo: .largeTitle)) .font(.custom("Nuku Nuku", size: 48, relativeTo: .largeTitle))
.padding() .padding()
.foregroundColor(colorScheme == .dark ? .white : .black) .foregroundColor(colorScheme == .dark ? .white : .black)
.offset(x: 0, y: 15)
Text("GAME") Text("GAME")
.font(.custom("Nuku Nuku", size: 48, relativeTo: .largeTitle)) .font(.custom("Nuku Nuku", size: 48, relativeTo: .largeTitle))
@ -32,7 +36,7 @@ struct MainMenu: View {
Spacer() Spacer()
NavigationLink(destination: GameParametersMenuView()) { NavigationLink(destination: GameParametersMenuView()) {
Text(LocalizedStringKey("Play")) Text(playButtonText)
.font(.custom("Nuku Nuku", size: 32, relativeTo: .title)) .font(.custom("Nuku Nuku", size: 32, relativeTo: .title))
.bold() .bold()
.frame(maxWidth: .infinity) .frame(maxWidth: .infinity)
@ -52,7 +56,7 @@ struct MainMenu: View {
Spacer().frame(height: 40) Spacer().frame(height: 40)
NavigationLink(destination: PartyListView()) { NavigationLink(destination: PartyListView()) {
Text(LocalizedStringKey("Registered Games")) Text(registeredGamesButtonText)
.font(.custom("Nuku Nuku", size: 18, relativeTo: .body)) .font(.custom("Nuku Nuku", size: 18, relativeTo: .body))
.padding() .padding()
.background(Color.gray.opacity(0.7)) .background(Color.gray.opacity(0.7))
@ -76,7 +80,6 @@ struct MainMenu: View {
} }
Button(action: { Button(action: {
// Afficher le sélecteur de langue
showLanguagePicker.toggle() showLanguagePicker.toggle()
}) { }) {
Image(systemName: "globe") Image(systemName: "globe")
@ -97,7 +100,7 @@ struct MainMenu: View {
} }
.environmentObject(languageSettings) .environmentObject(languageSettings)
.onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("LanguageChanged"))) { _ in .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("LanguageChanged"))) { _ in
self.reloadView.toggle() // Changez la valeur pour forcer le rechargement self.reloadView.toggle()
} }
} }
} }
@ -105,7 +108,7 @@ struct MainMenu: View {
struct MainMenu_Previews: PreviewProvider { struct MainMenu_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
MainMenu() MainMenu(playButtonText: "Play", registeredGamesButtonText: "Registered Games")
.environmentObject(LanguageSettings(selectedLanguage: .French)) .environmentObject(LanguageSettings(selectedLanguage: .French))
} }
} }

@ -13,70 +13,56 @@ struct ItemCollectionParty: View {
var body: some View { var body: some View {
VStack { VStack {
HStack { HStack {
Text(party.date) Text(party.formattedDate)
.font(.headline) .font(.headline)
.foregroundColor(.gray) .foregroundColor(.gray)
Spacer() Spacer()
} }
.padding(.bottom, 5) .padding(.bottom, 5)
GeometryReader { geometry in HStack(spacing: 10) {
HStack(spacing: 10) { HStack {
HStack { ProfileComponent(color: Color.purple, profileWidth: 60, profileHeight: 60, image: Image(party.player1Image))
Image(party.player1Image)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: geometry.size.width * 0.15, height: geometry.size.width * 0.15)
.clipShape(Circle())
.overlay(Circle().stroke(Color.purple, lineWidth: 2))
VStack(alignment: .leading) { VStack(alignment: .leading) {
Text(party.player1Name) Text(party.player1Name)
.fontWeight(.bold) .fontWeight(.bold)
.foregroundColor(.purple) .foregroundColor(.purple)
.lineLimit(1) .lineLimit(1)
.minimumScaleFactor(0.5) .minimumScaleFactor(0.5)
.frame(maxWidth: geometry.size.width * 0.25, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
Text("\(party.player1Score)") Text(LocalizedStringKey(party.player1Score))
.fontWeight(.bold) .fontWeight(.bold)
.foregroundColor(.red) // Perdent en vert .foregroundColor(party.player1Score == "Défaite" ? .red : .green) // Défaite en rouge, Victoire en vert
}
} }
}
Text("vs") Text("vs")
.font(.headline) .font(.headline)
.foregroundColor(.gray) .foregroundColor(.gray)
HStack {
VStack(alignment: .trailing) {
Text(party.player2Name)
.fontWeight(.bold)
.foregroundColor(.purple)
.lineLimit(1)
.minimumScaleFactor(0.5)
.frame(maxWidth: geometry.size.width * 0.25, alignment: .trailing)
Text("\(party.player2Score)")
.fontWeight(.bold) HStack {
.foregroundColor(.green) // Gagnant en rouge VStack(alignment: .trailing) {
} Text(party.player2Name)
.fontWeight(.bold)
.foregroundColor(.purple)
.lineLimit(1)
.minimumScaleFactor(0.5)
.frame(maxWidth: .infinity, alignment: .trailing)
Image(party.player2Image) Text(LocalizedStringKey(party.player2Score))
.resizable() .fontWeight(.bold)
.aspectRatio(contentMode: .fill) .foregroundColor(party.player2Score == "Victoire" ? .green : .red) // Victoire en vert, Défaite en rouge
.frame(width: geometry.size.width * 0.15, height: geometry.size.width * 0.15)
.clipShape(Circle())
.overlay(Circle().stroke(Color.purple, lineWidth: 2))
} }
ProfileComponent(color: Color.purple, profileWidth: 60, profileHeight: 60, image: Image(party.player2Image))
} }
.padding()
.background(Color.white)
.cornerRadius(15)
.shadow(radius: 3) // Réduction de l'ombre pour un effet plus léger
} }
.frame(height: 120) // Ajustez la hauteur en fonction de votre contenu .padding()
.background(Color(UIColor.systemBackground))
.cornerRadius(15)
.shadow(radius: 3) // Réduction de l'ombre pour un effet plus léger
} }
.padding(.horizontal) .padding(.horizontal)
} }
@ -84,7 +70,7 @@ struct ItemCollectionParty: View {
struct ItemCollectionParty_Previews: PreviewProvider { struct ItemCollectionParty_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
ItemCollectionParty(party: Party(player1Name: "L'invaincu du samedi", player1Score: "Défaite", player1Image: "Perceval", player2Name: "Le gars du dimanche", player2Score: "Victoire", player2Image: "Perceval", date: "Samedi soir")) ItemCollectionParty(party: Party(player1Name: "L'invaincu du samedi", player1Score: "Défaite", player1Image: "Perceval", player2Name: "Le gars du dimanche", player2Score: "Victoire", player2Image: "Perceval", date: Date()))
.previewLayout(.sizeThatFits) .previewLayout(.sizeThatFits)
.padding() .padding()
} }

@ -2,7 +2,7 @@
// ProfileEdit.swift // ProfileEdit.swift
// ArkitDoushiQi // ArkitDoushiQi
// //
// Created by Johan LACHENAL on 28/05/2024. // Created by Johan LACHENAL, Louis DUFOUR on 28/05/2024.
// //
import SwiftUI import SwiftUI
@ -16,33 +16,36 @@ struct ProfileEdit: View {
let playerNameKey: LocalizedStringKey let playerNameKey: LocalizedStringKey
var body: some View { var body: some View {
VStack(alignment: .leading) { VStack(alignment: .leading, spacing: 10) {
EditImageComponent( EditImageComponent(
color: color, color: color,
profileWidth: profileWidth, profileWidth: profileWidth,
profileHeight: profileHeight, profileHeight: profileHeight,
defaultImage: defaultImage, defaultImage: defaultImage,
imageTextChange: imageTextChange imageTextChange: imageTextChange
).padding(EdgeInsets(top: 0, leading: 32, bottom: 0, trailing: 32)) ).padding(.horizontal)
VStack(alignment: .trailing) { VStack(alignment: .leading, spacing: 5) {
HStack { Text(playerNameKey)
EditTextComponent(explanation: playerNameKey, value: playerNameKey == "Nom du Joueur 1" ? "Joueur 1" : "Joueur 2") .font(.headline)
} .foregroundColor(.gray)
TextField("", text: .constant("")) // Modifier ici selon votre logique
.textFieldStyle(RoundedBorderTextFieldStyle())
.font(.title3) // Taille de police augmentée
} }
.padding(.horizontal)
} }
} }
} }
struct ProfileEdit_Previews: PreviewProvider { struct ProfileEdit_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
ProfileEdit( ProfileEdit(color: Color(.red),
color: Color(.red), profileWidth: 80,
profileWidth: 100, profileHeight: 80,
profileHeight: 100, defaultImage: Image("profil"),
defaultImage: Image("profil"), imageTextChange: "Changer d'avatar",
imageTextChange: LocalizedStringKey("Changer d'avatar"), playerNameKey: "Nom du Joueur 1"
playerNameKey: LocalizedStringKey("Nom du Joueur 1")
) )
} }
} }

@ -6,6 +6,7 @@
// //
import SwiftUI import SwiftUI
import Foundation
struct Party: Identifiable { struct Party: Identifiable {
let id = UUID() let id = UUID()
@ -15,5 +16,21 @@ struct Party: Identifiable {
let player2Name: String let player2Name: String
let player2Score: String let player2Score: String
let player2Image: String let player2Image: String
let date: String let date: Date
var localizedPlayer1Score: LocalizedStringKey {
LocalizedStringKey(player1Score)
}
var localizedPlayer2Score: LocalizedStringKey {
LocalizedStringKey(player2Score)
}
var formattedDate: String {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .full
dateFormatter.timeStyle = .none
dateFormatter.locale = Locale.current
return dateFormatter.string(from: date)
}
} }

@ -2,29 +2,28 @@
// KeyboardReadable.swift // KeyboardReadable.swift
// ArkitDoushiQi // ArkitDoushiQi
// //
// Created by Johan LACHENAL on 31/05/2024. // Created by Johan LACHENAL, Louis DUFOUR on 31/05/2024.
// //
import Foundation
import Combine import Combine
import UIKit import UIKit
// Publisher to read keyboard changes. // Publisher to read keyboard changes.
protocol KeyboardReadable { protocol KeyboardReadable {
var keyboardPublisher: AnyPublisher<Bool, Never> { get } var keyboardPublisher: AnyPublisher<CGFloat, Never> { get }
} }
extension KeyboardReadable { extension KeyboardReadable {
var keyboardPublisher: AnyPublisher<Bool, Never> { var keyboardPublisher: AnyPublisher<CGFloat, Never> {
Publishers.Merge( Publishers.Merge(
NotificationCenter.default NotificationCenter.default
.publisher(for: UIResponder.keyboardWillShowNotification) .publisher(for: UIResponder.keyboardWillShowNotification)
.map { _ in true }, .compactMap { notification in
(notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect)?.height
},
NotificationCenter.default NotificationCenter.default
.publisher(for: UIResponder.keyboardWillHideNotification) .publisher(for: UIResponder.keyboardWillHideNotification)
.map { _ in false } .map { _ in CGFloat(0) }
) )
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }

@ -2,7 +2,7 @@
// GameParametersMenuView.swift // GameParametersMenuView.swift
// ArkitDoushiQi // ArkitDoushiQi
// //
// Created by Johan LACHENAL on 24/05/2024. // Created by Johan LACHENAL, Louis DUFOUR on 24/05/2024.
// //
import SwiftUI import SwiftUI
@ -12,44 +12,55 @@ struct GameParametersMenuView: View, KeyboardReadable {
@State private var selectedGameType: GameType = .PvP @State private var selectedGameType: GameType = .PvP
@State private var selectedAIOption: AI = .RandomAction @State private var selectedAIOption: AI = .RandomAction
@State private var selectedRulesOption: Rules = .Regular @State private var selectedRulesOption: Rules = .Regular
@State private var isKeyboardVisible = false @State private var keyboardHeight: CGFloat = 0
var body: some View { var body: some View {
NavigationView { NavigationStack {
VStack(alignment: .leading) { VStack(alignment: .leading, spacing: 15) {
HStack(alignment: .center) { Text(LocalizedStringKey("Paramètres de partie"))
Text(LocalizedStringKey("Paramètres de partie")).bold().font(.title) .bold()
}.frame(maxWidth: .infinity) .font(.largeTitle)
.padding(.top, 20)
// Sélecteur pour le type de partie
PickerComponent(title: LocalizedStringKey("Sélectionne le type de partie :"), PickerComponent(title: LocalizedStringKey("Sélectionne le type de partie :"),
selectedOption: $selectedGameType, selectedOption: $selectedGameType,
options: GameType.allCases) options: GameType.allCases)
.padding(.horizontal)
PickerComponent(title: LocalizedStringKey("Sélectionne les règles :"), PickerComponent(title: LocalizedStringKey("Sélectionne les règles :"),
selectedOption: $selectedRulesOption, selectedOption: $selectedRulesOption,
options: Rules.allCases) options: Rules.allCases)
.padding(.horizontal)
if selectedGameType == .PvAI { if selectedGameType == .PvAI {
PickerComponent(title: LocalizedStringKey("Sélectionne une IA :"), PickerComponent(title: LocalizedStringKey("Sélectionne une IA :"),
selectedOption: $selectedAIOption, selectedOption: $selectedAIOption,
options: AI.allCases) options: AI.allCases)
.padding(.horizontal)
} }
ProfileEdit(color: Color(.red), profileWidth: 100, profileHeight: 100, defaultImage: Image("profil"), imageTextChange: LocalizedStringKey("changer l'avatar du joueur 1"), playerNameKey: LocalizedStringKey("Nom du Joueur 1")) ProfileEdit(color: Color(.red), profileWidth: 80, profileHeight: 80, defaultImage: Image("profil"), imageTextChange: LocalizedStringKey("changer l'avatar du joueur 1"), playerNameKey: LocalizedStringKey("Nom du Joueur 1"))
if selectedGameType == .PvP { if selectedGameType == .PvP {
ProfileEdit(color: Color(.blue), profileWidth: 100, profileHeight: 100, defaultImage: Image("profil"), imageTextChange: LocalizedStringKey("changer l'avatar du joueur 2"), playerNameKey: LocalizedStringKey("Nom du Joueur 2")) ProfileEdit(color: Color(.blue), profileWidth: 80, profileHeight: 80, defaultImage: Image("profil"), imageTextChange: LocalizedStringKey("changer l'avatar du joueur 2"), playerNameKey: LocalizedStringKey("Nom du Joueur 2"))
} }
if !isKeyboardVisible { Spacer()
ButtonComponent(title: LocalizedStringKey("Lancer la partie")) {
GameView() ButtonComponent(title: LocalizedStringKey("Lancer la partie")) {
}.padding(EdgeInsets(top: 10, leading: 32, bottom: 10, trailing: 32)) GameView()
}
.padding(.horizontal, 32)
.padding(.bottom, 20)
}
.onReceive(keyboardPublisher) { height in
withAnimation {
self.keyboardHeight = height
} }
} }
.onReceive(keyboardPublisher) { value in isKeyboardVisible = value } .padding(.horizontal, 20)
.frame(maxHeight: .infinity, alignment: .top) .padding(.bottom, keyboardHeight) // Ajouter le padding en bas pour éviter le clavier
.padding(.top, 20) // Ajuster le padding en haut si nécessaire
} }
} }
} }

@ -9,18 +9,20 @@ import SwiftUI
struct PartyListView: View { struct PartyListView: View {
let parties: [Party] = [ let parties: [Party] = [
Party(player1Name: "Jack", player1Score: "Défaite", player1Image: "Perceval", player2Name: "Le gars du dimanche", player2Score: "Victoire", player2Image: "Perceval", date: "Samedi soir"), Party(player1Name: "Jack", player1Score: "Défaite", player1Image: "Perceval", player2Name: "Le gars du dimanche", player2Score: "Victoire", player2Image: "Perceval", date: Date()),
Party(player1Name: "Le gars du dimanche", player1Score: "Victoire", player1Image: "Perceval", player2Name: "Jack", player2Score: "Défaite", player2Image: "Perceval", date: "Vendredi soir") Party(player1Name: "Le gars du dimanche", player1Score: "Victoire", player1Image: "Perceval", player2Name: "Jack", player2Score: "Défaite", player2Image: "Perceval", date: Date().addingTimeInterval(-86400))
// Ajoutez plus de parties ici // Ajoutez plus de parties ici
] ]
var body: some View { var body: some View {
NavigationView { NavigationStack {
List(parties) { party in List(parties) { party in
ItemCollectionParty(party: party) ItemCollectionParty(party: party)
.padding(.vertical, 5) .padding(.vertical, 5)
.listRowInsets(EdgeInsets()) // Supprimer le padding
} }
.navigationTitle("Liste des Parties") .navigationTitle(LocalizedStringKey("Liste des Parties"))
.frame(maxWidth: .infinity) // Utiliser toute la largeur disponible
} }
} }
} }

@ -34,5 +34,7 @@
"Nom du Joueur 2" = "Player 2 Name"; "Nom du Joueur 2" = "Player 2 Name";
"Lancer la partie" = "Start Game"; "Lancer la partie" = "Start Game";
"Changer d'avatar" = "Change Avatar"; "Changer d'avatar" = "Change Avatar";
"Liste des Parties" = "Party List";
"Victoire" = "Victory";
"Défaite" = "Defeat";

@ -34,3 +34,7 @@
"Nom du Joueur 2" = "Nom du Joueur 2"; "Nom du Joueur 2" = "Nom du Joueur 2";
"Lancer la partie" = "Lancer la partie"; "Lancer la partie" = "Lancer la partie";
"Changer d'avatar" = "Changer d'avatar"; "Changer d'avatar" = "Changer d'avatar";
"Liste des Parties" = "Liste des Parties";
"Liste des Parties" = "Liste des Parties";
"Victoire" = "Victoire";
"Défaite" = "Défaite";

Loading…
Cancel
Save