Arthur_UserGame #25

Merged
arthur.valin merged 9 commits from Arthur_UserGame into master 2 years ago

@ -51,7 +51,7 @@ final GoRouter router = GoRouter(
GoRoute( GoRoute(
path: 'scoreboard', path: 'scoreboard',
builder: (BuildContext context, GoRouterState state) { builder: (BuildContext context, GoRouterState state) {
return FinalScoreBoard(gameDeatil: state.extra as GameDetail); return FinalScoreBoard(gameDetail: state.extra as GameDetail);
}, },
), ),
], ],

@ -53,6 +53,7 @@ abstract class AbstractRound {
bool computeNext(int val); bool computeNext(int val);
void computePoints(); void computePoints();
bool shotIsStrike(); bool shotIsStrike();
int getMaxPinsThisShot();
bool isStrike() { bool isStrike() {
return firstThrow==10; return firstThrow==10;
@ -66,6 +67,9 @@ abstract class AbstractRound {
return (firstThrow ?? 0)+(secondThrow ?? 0)==10; return (firstThrow ?? 0)+(secondThrow ?? 0)==10;
} }
int getNbStrike();
int getNbSpares();
int getPinsKnockedDown();
void subscribe(AbstractRound nextRound){ void subscribe(AbstractRound nextRound){
nextRound.previousRound=this; nextRound.previousRound=this;
@ -73,7 +77,6 @@ abstract class AbstractRound {
void update(int val){ void update(int val){
points = (points ?? 0) + val; points = (points ?? 0) + val;
print("ROUND " + number.toString() + " - " + player.id.toString() + "Update points : " + points.toString());
previousRound?.update(val); previousRound?.update(val);
} }

@ -1,13 +1,15 @@
import 'Player.dart';
class Game { class Game {
int _id; int _id;
DateTime _date; DateTime _date;
int _pointsCurrentUser; int _pointsCurrentUser;
bool _isFinished; bool _isFinished;
List<int> _playersId = []; List<Player> _players = [];
// Constructor // Constructor
Game(this._id, this._date, this._pointsCurrentUser, this._isFinished, Game(this._id, this._date, this._pointsCurrentUser, this._isFinished,
this._playersId); this._players);
// Getters and setters // Getters and setters
int get id => _id; int get id => _id;
@ -34,9 +36,9 @@ class Game {
_isFinished = value; _isFinished = value;
} }
List<int> get playersId => _playersId; List<Player> get players => _players;
set playersId(List<int> value) { set playersId(List<Player> value) {
_playersId = value; _players = value;
} }
} }

@ -5,11 +5,12 @@ import 'package:bowl_in/model/LastRound.dart';
import 'Player.dart'; import 'Player.dart';
import 'Round.dart'; import 'Round.dart';
import 'User.dart';
class GameDetail { class GameDetail {
int _id; int _id;
DateTime _time; DateTime _time;
int? _winner; Player? _winner;
int _nbPoints; int _nbPoints;
bool _isFinished; bool _isFinished;
int _host; int _host;
@ -25,10 +26,10 @@ class GameDetail {
this.rounds.add(Round(null, null, 0, element, i)); this.rounds.add(Round(null, null, 0, element, i));
}); });
} }
players.forEach((element) { players.forEach((element) {
this.rounds.add(LastRound(null, null, 0, element, 10, null)); this.rounds.add(LastRound(null, null, 0, element, 10, null));
}); });
} }
// Getters and setters // Getters and setters
@ -44,9 +45,9 @@ class GameDetail {
_time = value; _time = value;
} }
int? get winner => _winner; Player? get winner => _winner;
set winner(int? value) { set winner(Player? value) {
_winner = value; _winner = value;
} }
@ -83,13 +84,27 @@ class GameDetail {
Map<Player, int> get points => _points; Map<Player, int> get points => _points;
void addGameToUsers(){
for(var p in players){
if(p is User){
p.games.add(Game(this.id, this.time, points[p] ?? 0, true, players));
p.stat.updateStats(this, p);
}
}
}
void computeWinner(){
print(getRank().entries.first.key.name);
this.winner = getRank().entries.first.key;
}
void computeScores(){ void computeScores(){
print("====COMPUTE POINTS===="); print("====COMPUTE POINTS====");
for(var element in rounds){ for(var element in rounds){
print(element.points);
points[element.player] = (points[element.player] ?? 0) + (element.points ?? 0); points[element.player] = (points[element.player] ?? 0) + (element.points ?? 0);
print(element.player.name + " : " + points[element.player].toString());
} }
computeWinner();
addGameToUsers();
} }
Map<Player, int> getRank() { Map<Player, int> getRank() {

@ -1,3 +1,4 @@
import 'package:bowl_in/model/IManager.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'GameDetail.dart'; import 'GameDetail.dart';
@ -7,8 +8,11 @@ import 'Round.dart';
class GamePlayer { class GamePlayer {
late GameDetail _game; late GameDetail _game;
final IManager _parent;
int currentRoundIndex = 0; int currentRoundIndex = 0;
GamePlayer(this._parent);
GameDetail get game => _game; GameDetail get game => _game;
set game(GameDetail value) { set game(GameDetail value) {
@ -23,6 +27,10 @@ class GamePlayer {
} }
if (currentRoundIndex >= game.rounds.length) { if (currentRoundIndex >= game.rounds.length) {
print("FINISHED"); print("FINISHED");
game.id=_parent.gameMgr.getNextId();
_parent.gameMgr.addGame(game);
game.computeScores(); game.computeScores();
context.go("/scoreboard", extra: game); context.go("/scoreboard", extra: game);
} else { } else {

@ -1,6 +1,18 @@
import 'dart:math';
import 'Player.dart'; import 'Player.dart';
const _images = [
"./assets/images/image_user_cyan.png",
"./assets/images/image_user_red.png",
"./assets/images/image_user_yellow.png",
"./assets/images/image_user_pink.png",
"./assets/images/image_user_orange.png",
"./assets/images/image_user_green.png",
"./assets/images/image_user_purple.png",
];
class Guest extends Player { class Guest extends Player {
// Constructor // Constructor
Guest(int id, String image, String name) : super(id, image, name); Guest(String name) : super(name, _images[Random().nextInt(_images.length)]);
} }

@ -10,4 +10,6 @@ abstract class IGameManager {
List<GameDetail> getGamesByPlayers(List<Player> users); List<GameDetail> getGamesByPlayers(List<Player> users);
List<Player> getPlayersByIdGame(int id); List<Player> getPlayersByIdGame(int id);
Map<Player, int> getRankByIdGame(int id); Map<Player, int> getRankByIdGame(int id);
int getNextId();
addGame(GameDetail gd);
} }

@ -10,7 +10,7 @@ import 'Game.dart';
abstract class IManager { abstract class IManager {
late User _userCurrent; late User _userCurrent;
late GameDetail _gameCurrent; late GameDetail _gameCurrent;
late GamePlayer _gamePlayer = GamePlayer(); late GamePlayer _gamePlayer = GamePlayer(this);
late IUserManager _userMgr; late IUserManager _userMgr;
late IGameManager _gameMgr; late IGameManager _gameMgr;

@ -55,4 +55,60 @@ class LastRound extends AbstractRound{
return secondThrow==10; return secondThrow==10;
} }
} }
@override
int getNbSpares() {
int nb = 0;
if(firstThrow!=10){
if((firstThrow??0)+(secondThrow??0)==10){
nb+=1;
}
}else{
if((thirdThrow??0)+(secondThrow??0)==10) {
nb+=1;
}
}
return nb;
}
@override
int getNbStrike() {
int nb = 0;
if(firstThrow==10){
nb+=1;
if(secondThrow==10){
nb+=1;
if(thirdThrow==10) {
nb+=1;
}
}
}else{
if(thirdThrow==10) {
nb+=1;
}
}
return nb;
}
@override
int getPinsKnockedDown() {
return (firstThrow??0)+(secondThrow??0)+(thirdThrow??0);
}
@override
int getMaxPinsThisShot() {
if(firstThrow==null){
return 10;
}else if(firstThrow==10 && secondThrow==null){
return 10;
}else if(secondThrow==null){
return 10 - (firstThrow??0);
}else if(secondThrow==10){
return 10;
}else{
return 10 - (secondThrow??0);
}
}
} }

@ -1,13 +1,10 @@
class Player { class Player {
final int _id;
String _name; String _name;
String _image; String _image;
// Constructor // Constructor
Player(this._id, this._name, this._image); Player(this._name, this._image);
// Getters and setters // Getters and setters
int get id => _id;
String get name => _name; String get name => _name;
@ -20,4 +17,7 @@ class Player {
set image(String value) { set image(String value) {
_image = value; _image = value;
} }
} }

@ -28,7 +28,6 @@ class Round extends AbstractRound{
@override @override
void computePoints() { void computePoints() {
points = (firstThrow ?? 0)+(secondThrow ?? 0); points = (firstThrow ?? 0)+(secondThrow ?? 0);
print("ROUND " + number.toString() + " - " + player.id.toString() + "Compute points : " + points.toString());
if(previousRound?.isStrike() ?? false){ if(previousRound?.isStrike() ?? false){
previousRound?.update(points ?? 0); previousRound?.update(points ?? 0);
} }
@ -40,5 +39,33 @@ class Round extends AbstractRound{
return firstThrow==null; return firstThrow==null;
} }
@override
int getNbSpares() {
if(isSpare()){
return 1;
}
return 0;
}
@override
int getNbStrike() {
if(isStrike()){
return 1;
}
return 0;
}
@override
int getPinsKnockedDown() {
return (firstThrow ?? 0)+(secondThrow ?? 0);
}
@override
int getMaxPinsThisShot() {
if(firstThrow==null){
return 10;
}else{
return 10 - (firstThrow ?? 0);
}
}
} }

@ -1,6 +1,10 @@
import 'package:bowl_in/model/GameDetail.dart';
import 'package:bowl_in/model/Player.dart';
import 'User.dart';
class Stat { class Stat {
int _nbVictory; int _nbVictory;
int _nbDefeat;
int _nbGames; int _nbGames;
int _highscore; int _highscore;
int _nbStrikes; int _nbStrikes;
@ -12,7 +16,6 @@ class Stat {
// Constructor // Constructor
Stat( Stat(
this._nbVictory, this._nbVictory,
this._nbDefeat,
this._nbGames, this._nbGames,
this._highscore, this._highscore,
this._nbStrikes, this._nbStrikes,
@ -29,12 +32,6 @@ class Stat {
_nbVictory = value; _nbVictory = value;
} }
int get nbDefeat => _nbDefeat;
set nbDefeat(int value) {
_nbDefeat = value;
}
int get nbGames => _nbGames; int get nbGames => _nbGames;
set nbGames(int value) { set nbGames(int value) {
@ -76,4 +73,27 @@ class Stat {
set avgPinsPerRound(double value) { set avgPinsPerRound(double value) {
_avgPinsPerRound = value; _avgPinsPerRound = value;
} }
void updateStats(GameDetail gd, Player p){
nbGames +=1;
if(gd.winner == p){
nbVictory +=1;
}
if((gd.points[p] ?? 0) > highscore){
highscore = gd.points[p] ?? 0;
}
double totalpins = 0;
for(var r in gd.rounds){
if(p == r.player){
nbStrikes += r.getNbStrike();
nbSpares += r.getNbSpares();
totalpins = totalpins + r.getPinsKnockedDown();
}
}
avgPinsPerRound = ((avgPinsPerRound * (nbGames-1)) + (totalpins/10))/nbGames;
}
} }

@ -28,7 +28,7 @@ class GameManager extends IGameManager {
List<GameDetail> games = []; List<GameDetail> games = [];
for (var element in parent.gameDetails) { for (var element in parent.gameDetails) {
for (Player player in element.players) { for (Player player in element.players) {
if (player.id == id) { if (player is User && player.id == id) {
games.add(element); games.add(element);
break; break;
} }
@ -41,7 +41,7 @@ class GameManager extends IGameManager {
List<GameDetail> games = []; List<GameDetail> games = [];
for (var element in parent.gameDetails) { for (var element in parent.gameDetails) {
for (Player player in element.players) { for (Player player in element.players) {
if (player.id == user.id) { if (player is User && user is User && player.id == user.id) {
games.add(element); games.add(element);
break; break;
} }
@ -81,4 +81,14 @@ class GameManager extends IGameManager {
} }
throw Exception("Game not found."); throw Exception("Game not found.");
} }
@override
addGame(GameDetail gd) {
parent.gameDetails.add(gd);
}
@override
int getNextId() {
return parent.gameDetails.length;
}
} }

@ -1,5 +1,6 @@
library StubLib; library StubLib;
import '../Guest.dart';
import '../IManager.dart'; import '../IManager.dart';
import '../Game.dart'; import '../Game.dart';
import '../IUserManager.dart'; import '../IUserManager.dart';
@ -32,13 +33,13 @@ class StubData extends IManager {
IGameManager get gameMgr => _gameMgr; IGameManager get gameMgr => _gameMgr;
List<Player> players = [ List<Player> players = [
Player(1, "Mathieu", "./assets/images/image_user_cyan.png"), Guest("Mathieu"),
Player(2, "Robin", "./assets/images/image_user_purple.png"), Guest("Robin"),
Player(3, "Lucas", "./assets/images/image_user_red.png"), Guest("Lucas"),
Player(4, "Emre", "./assets/images/image_user_blue.png"), Guest("Emre"),
Player(5, "Louison", "./assets/images/image_user_cyan.png"), Guest("Louison"),
Player(6, "Arthur", "./assets/images/image_user_yellow.png"), Guest("Arthur"),
Player(7, "David", "./assets/images/image_user_pink.png"), Guest("David"),
User( User(
8, 8,
"Emre", "Emre",
@ -51,15 +52,14 @@ class StubData extends IManager {
], ],
[], [],
Stat( Stat(
10, 0,
2, 0,
12, 0,
130, 0,
7, 0,
6, 0,
700, 0,
58.33, 0)),
30.2)),
User( User(
9, 9,
"Dave", "Dave",
@ -83,15 +83,14 @@ class StubData extends IManager {
], ],
[], [],
Stat( Stat(
10, 0,
2, 0,
12, 0,
110, 0,
7, 0,
6, 0,
700, 0,
58.33, 0)),
30.2)),
User( User(
22, 22,
"Louison", "Louison",
@ -105,7 +104,6 @@ class StubData extends IManager {
[], [],
Stat( Stat(
10, 10,
2,
12, 12,
150, 150,
7, 7,
@ -126,7 +124,6 @@ class StubData extends IManager {
[], [],
Stat( Stat(
10, 10,
2,
12, 12,
10, 10,
7, 7,
@ -147,7 +144,6 @@ class StubData extends IManager {
[], [],
Stat( Stat(
10, 10,
2,
12, 12,
40, 40,
7, 7,
@ -168,7 +164,6 @@ class StubData extends IManager {
[], [],
Stat( Stat(
10, 10,
2,
12, 12,
76, 76,
7, 7,
@ -178,15 +173,14 @@ class StubData extends IManager {
30.2)), 30.2)),
], ],
Stat( Stat(
2, 0,
7, 0,
9, 0,
80, 0,
4, 0,
3, 0,
250, 0,
27.77, 0))
10.55))
]; ];
List<GameDetail> _gameDetails = []; List<GameDetail> _gameDetails = [];

@ -28,7 +28,7 @@ class UserManager extends IUserManager {
Player getUserById(int id) { Player getUserById(int id) {
for (var player in parent.players) { for (var player in parent.players) {
if (player.id == id) { if (player is User && player.id == id) {
return player; return player;
} }
} }

@ -4,6 +4,7 @@ import 'Player.dart';
import 'Stat.dart'; import 'Stat.dart';
class User extends Player { class User extends Player {
final int _id;
String _mail; String _mail;
List<Achievement> _achievements = <Achievement>[]; List<Achievement> _achievements = <Achievement>[];
List<User> _friends = <User>[]; List<User> _friends = <User>[];
@ -11,9 +12,11 @@ class User extends Player {
List<Game> games = []; List<Game> games = [];
// Constructor // Constructor
User(int id, String name, String image, this._mail, this._achievements, User(this._id, String name, String image, this._mail, this._achievements,
this._friends, this._stat) this._friends, this._stat)
: super(id, name, image); : super(name, image);
int get id => _id;
// Getters and setters // Getters and setters
String get mail => _mail; String get mail => _mail;

@ -85,12 +85,15 @@ class _AnalysisScreenState extends State<AnalysisScreen> {
verticalDirection: VerticalDirection.up, verticalDirection: VerticalDirection.up,
children: [ children: [
StatsCard( StatsCard(
title: "Number of victory", title: "Number of victories",
val: MyApp.controller.userCurrent.stat.nbVictory val: MyApp.controller.userCurrent.stat.nbVictory.toDouble(),
.toDouble()), precision: 0,
),
StatsCard( StatsCard(
title: "Average pins per round", title: "Average pins per round",
val: MyApp.controller.userCurrent.stat.avgPinsPerRound), val: MyApp.controller.userCurrent.stat.avgPinsPerRound,
precision: 2,
),
], ],
)) ))
]), ]),

@ -6,6 +6,9 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import '../model/Game.dart';
import '../model/Guest.dart';
import '../model/Player.dart';
import '../widgets/button_new_party.dart'; import '../widgets/button_new_party.dart';
import '../widgets/ingame_widgets.dart'; import '../widgets/ingame_widgets.dart';
import '../widgets/scores_list_widget.dart'; import '../widgets/scores_list_widget.dart';
@ -18,10 +21,12 @@ class InGameScreen extends StatefulWidget {
} }
class _InGameScreenState extends State<InGameScreen> { class _InGameScreenState extends State<InGameScreen> {
late List<Player> listPlayers;
late Widget widgetHolder; late Widget widgetHolder;
void initState() { void initState() {
widgetHolder = InGameCardConfig(); listPlayers = [MyApp.controller.userCurrent];
widgetHolder = InGameCardConfig(listPlayer: listPlayers);
super.initState(); super.initState();
} }
@ -52,8 +57,13 @@ class _InGameScreenState extends State<InGameScreen> {
Spacer(), Spacer(),
ElevatedButton( ElevatedButton(
onPressed: () { onPressed: () {
GameDetail gd = GameDetail(1, DateTime.now(), null, 123, false, GameDetail gd = GameDetail(
MyApp.controller.userCurrent.id, [MyApp.controller.userCurrent, MyApp.controller.userMgr.getUserById(2)]); -1,
DateTime.now(),
null,
0,
false,
MyApp.controller.userCurrent.id, listPlayers);
MyApp.controller.gamePlayer.game = gd; MyApp.controller.gamePlayer.game = gd;
MyApp.controller.gameCurrent = gd; MyApp.controller.gameCurrent = gd;

@ -101,8 +101,9 @@ class GameCard extends StatelessWidget {
class StatsCard extends StatelessWidget { class StatsCard extends StatelessWidget {
final String title; final String title;
final double val; final double val;
final int precision;
const StatsCard({Key? key, required this.title, required this.val}) const StatsCard({Key? key, required this.title, required this.val, required this.precision})
: super(key: key); : super(key: key);
@override @override
@ -137,7 +138,7 @@ class StatsCard extends StatelessWidget {
), ),
Spacer(), Spacer(),
Text( Text(
this.val.toString(), this.val.toStringAsFixed(precision),
style: GoogleFonts.roboto( style: GoogleFonts.roboto(
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
fontSize: 28, fontSize: 28,

@ -4,6 +4,10 @@ import 'package:flutter/services.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import '../main.dart';
import '../model/GameDetail.dart';
import '../model/Player.dart';
import '../model/User.dart';
import 'ingame_widgets.dart'; import 'ingame_widgets.dart';
class ButtonNewParty extends StatelessWidget { class ButtonNewParty extends StatelessWidget {
@ -143,10 +147,14 @@ class NewGameModal extends StatelessWidget {
} }
class ScoreBoardModal extends StatelessWidget { class ScoreBoardModal extends StatelessWidget {
const ScoreBoardModal({Key? key}) : super(key: key); final GameDetail gamedetail;
const ScoreBoardModal({Key? key, required this.gamedetail}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var rank = gamedetail.getRank();
var pseudoList = rank.keys.toList();
var scoreList = rank.values.toList();
return Dialog( return Dialog(
child: Stack( child: Stack(
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
@ -159,39 +167,42 @@ class ScoreBoardModal extends StatelessWidget {
child: child:
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Expanded( Expanded(
child: Padding(
padding: EdgeInsets.fromLTRB(0, 40, 0, 0),
child: Stack( child: Stack(
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
children: [ children: [
/*Positioned( rank.length > 1
? Positioned(
child: PodiumGameOverWidget( child: PodiumGameOverWidget(
isfirst: 2, isfirst: 2,
pseudo: 'Lucas', player: pseudoList[1],
score: 123, score: scoreList[1],
), ),
top: 70, top: 70,
left: 30, left: 30,
), )
Positioned( : Container(),
rank.length > 0
? Positioned(
child: PodiumGameOverWidget( child: PodiumGameOverWidget(
isfirst: 1, isfirst: 1,
pseudo: 'Momo', player: pseudoList[0],
score: 160, score: scoreList[0],
), ),
top: 10, top: 10,
), )
Positioned( : Container(),
rank.length > 2
? Positioned(
child: PodiumGameOverWidget( child: PodiumGameOverWidget(
isfirst: 3, isfirst: 3,
pseudo: 'popo', player: pseudoList[2],
score: 110, score: scoreList[2],
), ),
top: 70, top: 70,
right: 30, right: 30,
)*/ )
: Container()
], ],
),
)), )),
]), ]),
) )

@ -1,5 +1,6 @@
import 'dart:ui'; import 'dart:ui';
import 'package:bowl_in/main.dart';
import 'package:bowl_in/widgets/profil_listpodium_widget.dart'; import 'package:bowl_in/widgets/profil_listpodium_widget.dart';
import 'package:bowl_in/widgets/scores_list_widget.dart'; import 'package:bowl_in/widgets/scores_list_widget.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -9,11 +10,13 @@ import 'package:google_fonts/google_fonts.dart';
import '../model/AbstractRound.dart'; import '../model/AbstractRound.dart';
import '../model/GameDetail.dart'; import '../model/GameDetail.dart';
import '../model/Guest.dart';
import '../model/Player.dart'; import '../model/Player.dart';
import '../model/User.dart';
class FinalScoreBoard extends StatefulWidget { class FinalScoreBoard extends StatefulWidget {
final GameDetail gameDeatil; final GameDetail gameDetail;
const FinalScoreBoard({Key? key, required this.gameDeatil}) : super(key: key); const FinalScoreBoard({Key? key, required this.gameDetail}) : super(key: key);
@override @override
State<FinalScoreBoard> createState() => _FinalScoreBoardState(); State<FinalScoreBoard> createState() => _FinalScoreBoardState();
@ -25,7 +28,7 @@ class _FinalScoreBoardState extends State<FinalScoreBoard> {
late List<int> scoreList; late List<int> scoreList;
@override @override
void initState() { void initState() {
rank = widget.gameDeatil.getRank(); rank = widget.gameDetail.getRank();
pseudoList = rank.keys.toList(); pseudoList = rank.keys.toList();
scoreList = rank.values.toList(); scoreList = rank.values.toList();
super.initState(); super.initState();
@ -248,13 +251,37 @@ class PodiumGameOverWidget extends StatelessWidget {
} }
class InGameCardConfig extends StatefulWidget { class InGameCardConfig extends StatefulWidget {
const InGameCardConfig({Key? key}) : super(key: key); final List<Player> listPlayer;
const InGameCardConfig({Key? key, required this.listPlayer}) : super(key: key);
@override @override
State<InGameCardConfig> createState() => _InGameCardConfigState(); State<InGameCardConfig> createState() => _InGameCardConfigState();
} }
class _InGameCardConfigState extends State<InGameCardConfig> { class _InGameCardConfigState extends State<InGameCardConfig> {
@override
void initState() {
super.initState();
}
void onDelete(Player p){
setState(() {
widget.listPlayer.remove(p);
});
}
void onReorder(int oldIndex, int newIndex){
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final Player item = widget.listPlayer.removeAt(oldIndex);
widget.listPlayer.insert(newIndex, item);
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -298,7 +325,7 @@ class _InGameCardConfigState extends State<InGameCardConfig> {
], ],
), ),
)), )),
ListUserInGame(), ListUserInGame(listPlayer: widget.listPlayer, onDelete: onDelete, onReorder: onReorder,),
Spacer(), Spacer(),
Image( Image(
image: AssetImage("assets/images/start_sentence.png"), image: AssetImage("assets/images/start_sentence.png"),
@ -307,7 +334,12 @@ class _InGameCardConfigState extends State<InGameCardConfig> {
Padding( Padding(
padding: EdgeInsets.fromLTRB(15, 0, 15, 15), padding: EdgeInsets.fromLTRB(15, 0, 15, 15),
child: ElevatedButton( child: ElevatedButton(
onPressed: () {}, onPressed: () {
setState(() {
if (widget.listPlayer.length < 10)
widget.listPlayer.add(new Guest("guest"));
});
},
child: Text( child: Text(
"+ Add a player", "+ Add a player",
style: GoogleFonts.roboto( style: GoogleFonts.roboto(
@ -332,13 +364,17 @@ class _InGameCardConfigState extends State<InGameCardConfig> {
} }
class ListUserInGame extends StatefulWidget { class ListUserInGame extends StatefulWidget {
const ListUserInGame({Key? key}) : super(key: key); final List<Player> listPlayer;
final Function(Player) onDelete;
final Function(int, int) onReorder;
const ListUserInGame({Key? key, required this.listPlayer, required this.onDelete, required this.onReorder}) : super(key: key);
@override @override
State<ListUserInGame> createState() => _ListUserInGameState(); State<ListUserInGame> createState() => _ListUserInGameState();
} }
class _ListUserInGameState extends State<ListUserInGame> { class _ListUserInGameState extends State<ListUserInGame> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
@ -350,20 +386,28 @@ class _ListUserInGameState extends State<ListUserInGame> {
constraints: new BoxConstraints( constraints: new BoxConstraints(
maxHeight: 170, maxHeight: 170,
), ),
child: ListView(children: [ child: ReorderableListView.builder(
UserInGame(), itemCount: widget.listPlayer.length,
UserInGame(), itemBuilder: (context, index) {
UserInGame(), return UserInGame(key:ValueKey(widget.listPlayer[index]) ,player: widget.listPlayer[index], onDelete: widget.onDelete, index: index);
UserInGame(), },
UserInGame(), onReorder: widget.onReorder,
])), ),
Text( ),
"3 player(s)", RichText(
text: TextSpan(
text: widget.listPlayer.length.toString(),
style: GoogleFonts.roboto( style: GoogleFonts.roboto(
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontSize: 15, fontSize: 15,
color: CupertinoColors.black, color: CupertinoColors.black,
decoration: TextDecoration.none), decoration: TextDecoration.none),
children: const <TextSpan>[
TextSpan(
text: ' player(s)',
style: TextStyle(fontWeight: FontWeight.bold)),
],
),
) )
], ],
)); ));
@ -371,13 +415,17 @@ class _ListUserInGameState extends State<ListUserInGame> {
} }
class UserInGame extends StatefulWidget { class UserInGame extends StatefulWidget {
const UserInGame({Key? key}) : super(key: key); final Player player;
final Function(Player) onDelete;
final int index;
const UserInGame({Key? key, required this.player, required this.onDelete, required this.index}) : super(key: key);
@override @override
State<UserInGame> createState() => _UserInGameState(); State<UserInGame> createState() => _UserInGameState();
} }
class _UserInGameState extends State<UserInGame> { class _UserInGameState extends State<UserInGame> {
final userNameTextField = TextEditingController();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -393,27 +441,61 @@ class _UserInGameState extends State<UserInGame> {
), ),
child: Row( child: Row(
children: [ children: [
Container( ReorderableDragStartListener(
index: widget.index,
child : Container(
width: 30, width: 30,
height: 30, height: 30,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(70)), borderRadius: BorderRadius.all(Radius.circular(70)),
image: DecorationImage( image: DecorationImage(
image: AssetImage("assets/images/image_user_cyan.png"), image: AssetImage(widget.player.image), fit: BoxFit.cover),
fit: BoxFit.cover), ),
), ),
), ),
SizedBox( SizedBox(
width: 10, width: 10,
), ),
Text( widget.player is Guest
"Emre", ? Material(
surfaceTintColor: Colors.transparent,
child: SizedBox(
width: 220,
child: TextField(
controller: userNameTextField,
style: const TextStyle(color: Colors.black),
decoration: InputDecoration(
border: InputBorder.none,
filled: true,
fillColor: Color(0xffF2F2F2),
hintText: 'Pseudonyme',
),
cursorColor: Colors.purple,
textAlign: TextAlign.left,
onChanged: (str)=> widget.player.name=str
,
),
),
)
: SizedBox(
width: 220,
child: Text(
widget.player.name,
style: GoogleFonts.roboto( style: GoogleFonts.roboto(
fontSize: 18, fontSize: 18,
decoration: TextDecoration.none, decoration: TextDecoration.none,
color: Color(0xff241E40)), color: Color(0xff241E40))
), ),
Spacer(), ),
(widget.player is User && (widget.player as User).id == MyApp.controller.userCurrent.id) ?
Icon(Icons.lock, color: Colors.amber) :
GestureDetector(
onTap: () {
widget.onDelete(widget.player);
},
child: Icon(Icons.close)
),
Spacer()
], ],
), ),
); );
@ -437,17 +519,8 @@ class InGameCardThrow extends StatefulWidget {
class _InGameCardThrowState extends State<InGameCardThrow> { class _InGameCardThrowState extends State<InGameCardThrow> {
GlobalKey<_NumberPadState> _numberPadKey = GlobalKey(); GlobalKey<_NumberPadState> _numberPadKey = GlobalKey();
late var maxValue;
void initState() { void initState() {
if (widget.currentRound.firstThrow == null) {
maxValue = 10;
} else if (widget.currentRound.secondThrow == null) {
maxValue = 10 - (widget.currentRound.firstThrow ?? 0);
} else {
maxValue = 10;
}
super.initState(); super.initState();
} }
@ -522,7 +595,7 @@ class _InGameCardThrowState extends State<InGameCardThrow> {
numberThrow: widget.numberThrow, numberThrow: widget.numberThrow,
setSelectedValue: widget.setSelectedValue, setSelectedValue: widget.setSelectedValue,
currentRound: widget.currentRound, currentRound: widget.currentRound,
maxValue: maxValue, maxValue: widget.currentRound.getMaxPinsThisShot(),
), ),
], ],
), ),
@ -602,7 +675,10 @@ class SpareButton extends StatelessWidget {
final IntCallback onSonChanged; final IntCallback onSonChanged;
final int valueToReturn; final int valueToReturn;
const SpareButton( const SpareButton(
{Key? key, required this.onSonChanged, required this.currentSelected, required this.valueToReturn}) {Key? key,
required this.onSonChanged,
required this.currentSelected,
required this.valueToReturn})
: super(key: key); : super(key: key);
@override @override
@ -622,8 +698,9 @@ class SpareButton extends StatelessWidget {
child: Text( child: Text(
"SPARE !", "SPARE !",
style: GoogleFonts.roboto( style: GoogleFonts.roboto(
color: color: currentSelected == valueToReturn
currentSelected == valueToReturn ? Colors.pink : CupertinoColors.black, ? Colors.pink
: CupertinoColors.black,
decoration: TextDecoration.none, decoration: TextDecoration.none,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
fontStyle: FontStyle.italic, fontStyle: FontStyle.italic,

@ -111,12 +111,9 @@ class CardGame extends StatelessWidget {
child: Wrap( child: Wrap(
spacing: 5, spacing: 5,
runSpacing: 5, runSpacing: 5,
children: game.playersId children: game.players
.map((e) => ProfilPicture( .map((e) => ProfilPicture(
path: MyApp.controller.userMgr path: e.image.toString(),
.getUserById(e)
.image
.toString(),
)) ))
.toList()))), .toList()))),
const Spacer(), const Spacer(),
@ -149,7 +146,9 @@ class CardGame extends StatelessWidget {
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return ScoreBoardModal(); return ScoreBoardModal(
gamedetail:
MyApp.controller.gameMgr.getGameById(game.id));
}); });
}, },
)); ));

Loading…
Cancel
Save