From f36b681de2f5ac4d9ca2f3870d94e35e01d37359 Mon Sep 17 00:00:00 2001 From: OroshiX Date: Wed, 6 May 2020 21:51:32 +0200 Subject: [PATCH 1/7] [Flutter] Cleanup --- FlutterCoinche/lib/dto/bid.dart | 2 +- FlutterCoinche/lib/widget/table_widget.dart | 52 --------------------- 2 files changed, 1 insertion(+), 53 deletions(-) diff --git a/FlutterCoinche/lib/dto/bid.dart b/FlutterCoinche/lib/dto/bid.dart index c8f05ce..b0340dd 100644 --- a/FlutterCoinche/lib/dto/bid.dart +++ b/FlutterCoinche/lib/dto/bid.dart @@ -70,7 +70,7 @@ class Bid { if (this is Coinche) { return "${(this as Coinche).annonce.readableValueBid()}"; } - return ""; + return "Pass"; } PlayerPosition getTaker() { diff --git a/FlutterCoinche/lib/widget/table_widget.dart b/FlutterCoinche/lib/widget/table_widget.dart index db6efd6..d1faca4 100644 --- a/FlutterCoinche/lib/widget/table_widget.dart +++ b/FlutterCoinche/lib/widget/table_widget.dart @@ -123,58 +123,6 @@ class _TableWidgetState extends State { heightAvatar: heightContainer, ), -// if (bidLeft != null && state == TableState.BIDDING) -// Transform.translate( -// offset: Offset(widthContainerName + 4, -heightContainer / 2), -// child: Bubble( -// color: Colors.white, -// child: Text(bidLeft.toString()), -// alignment: Alignment.centerLeft, -// nip: BubbleNip.leftTop, -// elevation: 10, -// ), -// ), -// if (bidRight != null && state == TableState.BIDDING) -// Transform.translate( -// offset: Offset(-widthContainerName - 4, -heightContainer / 2), -// child: Bubble( -// alignment: Alignment.centerRight, -// color: Colors.white, -// child: Text(bidRight.toString()), -// nip: BubbleNip.rightTop, -// elevation: 10, -// ), -// ), -// if (bidTop != null && state == TableState.BIDDING) -// Transform.translate( -// offset: Offset(0, widthContainerName + 4), -// child: Bubble( -// alignment: Alignment.topCenter, -// color: Colors.white, -// child: Text(bidTop.toString()), -// nip: BubbleNip.no, -// elevation: 10, -// ), -// ), -// if (myBid != null && state == TableState.BIDDING) -// Transform.translate( -// offset: Offset( -// 0, -// -widthContainerName - -// cardHeight - -// marginCardsPosition - -// paddingHeightCards * 2 - -// heightBiddingBar - -// 10), -// child: Bubble( -// alignment: Alignment.bottomCenter, -// color: Colors.white, -// child: Text(myBid.toString()), -// nip: BubbleNip.no, -// elevation: 10, -// ), -// ), - Padding( padding: EdgeInsets.only( top: widthContainerName, From eb22f36175394b44709c2f11062c38ed7a1be925 Mon Sep 17 00:00:00 2001 From: OroshiX Date: Thu, 7 May 2020 10:25:32 +0200 Subject: [PATCH 2/7] Simple reactivity with states_rebuilder --- FlutterCoinche/lib/bloc/games_bloc.dart | 20 +-- FlutterCoinche/lib/dto/game.dart | 15 ++- FlutterCoinche/lib/dto/nicknames.dart | 5 + .../lib/extensions/game_extensions.dart | 36 ++++++ FlutterCoinche/lib/main.dart | 2 + .../lib/screen/StatedGameScreen.dart | 120 ++++++++++++++++++ FlutterCoinche/lib/screen/lobby_screen.dart | 6 +- FlutterCoinche/pubspec.lock | 7 + FlutterCoinche/pubspec.yaml | 1 + 9 files changed, 188 insertions(+), 24 deletions(-) create mode 100644 FlutterCoinche/lib/extensions/game_extensions.dart create mode 100644 FlutterCoinche/lib/screen/StatedGameScreen.dart diff --git a/FlutterCoinche/lib/bloc/games_bloc.dart b/FlutterCoinche/lib/bloc/games_bloc.dart index 1842422..d2d7a8e 100644 --- a/FlutterCoinche/lib/bloc/games_bloc.dart +++ b/FlutterCoinche/lib/bloc/games_bloc.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:FlutterCoinche/dto/card.dart'; import 'package:FlutterCoinche/dto/game.dart'; import 'package:FlutterCoinche/dto/game_empty.dart'; import 'package:FlutterCoinche/fire/fire_auth_service.dart'; @@ -60,19 +59,7 @@ class GamesBloc implements Bloc { if (subscription != null) { subscription.cancel(); } - /* - Firestore.instance - .collection('playersSets') - .document(idGame) - .collection('players') - .document(_myAuthUser.uid) - .get() - .then((value) { - print(value.data); - gameBehavior.add(Game.fromJson(value.data)); - notifyListeners(); - }); -*/ + subscription = Firestore.instance .collection('playersSets') .document(idGame) @@ -81,11 +68,6 @@ class GamesBloc implements Bloc { .snapshots() .map((event) => Game.fromJson(event.data)) .listen((event) { - event.cards.sort((CardModel c1, CardModel c2) { - if (c1.color.index < c2.color.index) return -1; - if (c1.color.index > c2.color.index) return 1; - return compareValue(c2.value, c1.value, false); - }); _gameController.sink.add(event); }); } diff --git a/FlutterCoinche/lib/dto/game.dart b/FlutterCoinche/lib/dto/game.dart index c3dd709..ef4ba79 100644 --- a/FlutterCoinche/lib/dto/game.dart +++ b/FlutterCoinche/lib/dto/game.dart @@ -33,7 +33,7 @@ class Game extends Equatable { this.state, this.nextPlayer, this.myPosition, - this.bids, + this.bids = const [], this.currentBid, this.score, this.winnerLastTrick, @@ -45,7 +45,8 @@ class Game extends Equatable { @override String toString() { - return "game: $id, myCards: $cards"; + return "game: $id\nmyCards: $cards\nonTable: $onTable\nstate: $state\n" + "me: $myPosition\nscore: $score\nnicknames: $nicknames\nbids: $bids"; } @override @@ -63,4 +64,14 @@ class Game extends Equatable { winnerLastTrick, lastTrick ]; + + sortCards() { + cards.sort((CardModel c1, CardModel c2) { + if (c1.color.index < c2.color.index) return -1; + if (c1.color.index > c2.color.index) return 1; + final trump = + state == TableState.PLAYING && currentBid.cardColor() == c1.color; + return compareValue(c2.value, c1.value, trump); + }); + } } diff --git a/FlutterCoinche/lib/dto/nicknames.dart b/FlutterCoinche/lib/dto/nicknames.dart index 718e124..56970ee 100644 --- a/FlutterCoinche/lib/dto/nicknames.dart +++ b/FlutterCoinche/lib/dto/nicknames.dart @@ -38,4 +38,9 @@ class Nicknames extends Equatable { @override List get props => [north, south, east, west]; + + @override + String toString() { + return "north: $north, east: $east, south: $south, west: $west"; + } } diff --git a/FlutterCoinche/lib/extensions/game_extensions.dart b/FlutterCoinche/lib/extensions/game_extensions.dart new file mode 100644 index 0000000..df18d48 --- /dev/null +++ b/FlutterCoinche/lib/extensions/game_extensions.dart @@ -0,0 +1,36 @@ +import 'package:FlutterCoinche/dto/game.dart'; +import 'package:flutter/foundation.dart'; + +extension GameExtensions on Game { + List different(Game old) { + List res = []; + if (old.id != id) res.add(Aspects.ID); + if (old.cards != cards) res.add(Aspects.CARDS); + if (old.score != score) res.add(Aspects.SCORE); + if (old.state != state) res.add(Aspects.STATE); + if (old.bids != bids) res.add(Aspects.BIDS); + if (old.nicknames != nicknames) res.add(Aspects.NICKNAMES); + if (!listEquals(old.onTable, onTable)) res.add(Aspects.ON_TABLE); + if (old.nextPlayer != nextPlayer) res.add(Aspects.NEXT_PLAYER); + if (old.myPosition != myPosition) res.add(Aspects.MY_POSITION); + if (old.lastTrick != lastTrick || old.winnerLastTrick != winnerLastTrick) + res.add(Aspects.LAST_TRICK); + if (old.currentBid != currentBid) res.add(Aspects.CURRENT_BID); + return res; + } +} + +enum Aspects { + ID, + CARDS, + STATE, + BIDS, + SCORE, + NICKNAMES, + ON_TABLE, + NEXT_PLAYER, + MY_POSITION, + CURRENT_BID, + LAST_TRICK, + COLORS, +} diff --git a/FlutterCoinche/lib/main.dart b/FlutterCoinche/lib/main.dart index d5b06d7..f08a32c 100644 --- a/FlutterCoinche/lib/main.dart +++ b/FlutterCoinche/lib/main.dart @@ -1,4 +1,5 @@ import 'package:FlutterCoinche/bloc/games_bloc.dart'; +import 'package:FlutterCoinche/screen/StatedGameScreen.dart'; import 'package:FlutterCoinche/screen/all_games_screen.dart'; import 'package:FlutterCoinche/screen/game_screen.dart'; import 'package:FlutterCoinche/screen/lobby_screen.dart'; @@ -35,6 +36,7 @@ class MyApp extends StatelessWidget { LoginScreen.routeName: (context) => LoginScreen(), AllGamesScreen.routeName: (context) => AllGamesScreen(), GameScreen.routeName: (context) => GameScreen(), + StatedGameScreen.routeName: (context) => StatedGameScreen(), LobbyScreen.routeName: (context) => LobbyScreen(), }, home: LoginScreen(), diff --git a/FlutterCoinche/lib/screen/StatedGameScreen.dart b/FlutterCoinche/lib/screen/StatedGameScreen.dart new file mode 100644 index 0000000..0c89a85 --- /dev/null +++ b/FlutterCoinche/lib/screen/StatedGameScreen.dart @@ -0,0 +1,120 @@ +import 'package:FlutterCoinche/bloc/games_bloc.dart'; +import 'package:FlutterCoinche/dto/bid.dart'; +import 'package:FlutterCoinche/dto/card.dart'; +import 'package:FlutterCoinche/dto/game.dart'; +import 'package:FlutterCoinche/dto/player_position.dart'; +import 'package:FlutterCoinche/widget/game_inherited.dart'; +import 'package:bloc_provider/bloc_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; + +class StatedGameScreen extends StatelessWidget { + static const routeName = "/statedGame"; + + @override + Widget build(BuildContext context) { + return Material( + child: WillPopScope( + onWillPop: () async { + return (await _quit(context)) ?? false; + }, + child: Injector( + inject: [ + Inject.stream(() => BlocProvider.of(context).game, + name: "game"), + Inject(() => Game()), + Inject.future(() => getPosTableToColors()) + ], + initState: () { + // To be executed in the initState of StatefulWidget + }, + builder: (BuildContext context) { + final ReactiveModel gameFire = + Injector.getAsReactive(name: "game"); + final ReactiveModel game = Injector.getAsReactive(); + + return StateBuilder( + models: [gameFire], + onSetState: (_, model) { + game.setValue(() => gameFire.value); + }, + builder: (_, __) { + return Scaffold( + appBar: AppBar( + title: Text("${game.value.id}"), + actions: [ + FlatButton( + onPressed: () { + game.setState( + (game) => game.bids.add(SimpleBid( + points: 90, + color: CardColor.HEART, + position: PlayerPosition.EAST)), + filterTags: [Aspects.BIDS], + catchError: true, + onSetState: (context) { + if (game.hasError) { + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Icon(Icons.error), + content: Text("${game.error}"), + ), + ); + } + }, + ); + }, + child: Text("add a bid")) + ], + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.sort_by_alpha), + onPressed: () => + game.setState((Game g) => g.sortCards())), + body: TestWidget()); + }, + ); + }, + ), + ), + ); + } + + Future _quit(BuildContext context) { + return showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text("Exit game?"), + actions: [ + FlatButton( + onPressed: () => Navigator.of(context).pop(false), + child: Text("No, stay here")), + FlatButton( + onPressed: () { + Navigator.of(context).pop(true); + SystemChrome.restoreSystemUIOverlays(); + }, + child: Text("Yes, exit!")) + ], + ), + ); + } +} + +class TestWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + final ReactiveModel game = + Injector.getAsReactive(context: context); + return StateBuilder( + models: [game], + tag: Aspects.BIDS, + builder: (context, model) => Padding( + padding: const EdgeInsets.all(20.0), + child: Center(child: Text("${game.value}")), + ), + ); + } +} diff --git a/FlutterCoinche/lib/screen/lobby_screen.dart b/FlutterCoinche/lib/screen/lobby_screen.dart index aa66177..b456fa5 100644 --- a/FlutterCoinche/lib/screen/lobby_screen.dart +++ b/FlutterCoinche/lib/screen/lobby_screen.dart @@ -1,7 +1,7 @@ import 'package:FlutterCoinche/bloc/games_bloc.dart'; import 'package:FlutterCoinche/dto/game.dart'; import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/screen/game_screen.dart'; +import 'package:FlutterCoinche/screen/StatedGameScreen.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/material.dart'; @@ -17,7 +17,7 @@ class LobbyScreen extends StatelessWidget { FlatButton( onPressed: () { Navigator.of(context) - .pushReplacementNamed(GameScreen.routeName); + .pushReplacementNamed(StatedGameScreen.routeName); }, child: Text("Play")) ], @@ -36,7 +36,7 @@ class LobbyScreen extends StatelessWidget { if (snapshot.data.state != TableState.JOINING) { WidgetsBinding.instance.addPostFrameCallback((_) { Navigator.of(context) - .pushReplacementNamed(GameScreen.routeName); + .pushReplacementNamed(StatedGameScreen.routeName); }); return SizedBox(); } diff --git a/FlutterCoinche/pubspec.lock b/FlutterCoinche/pubspec.lock index c827981..eaacb4a 100644 --- a/FlutterCoinche/pubspec.lock +++ b/FlutterCoinche/pubspec.lock @@ -707,6 +707,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.9.3" + states_rebuilder: + dependency: "direct main" + description: + name: states_rebuilder + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" stream_channel: dependency: transitive description: diff --git a/FlutterCoinche/pubspec.yaml b/FlutterCoinche/pubspec.yaml index babd2a4..e40c2ee 100644 --- a/FlutterCoinche/pubspec.yaml +++ b/FlutterCoinche/pubspec.yaml @@ -42,6 +42,7 @@ dependencies: tuple: ^1.0.3 equatable: ^0.6.0 # for simple .equals() quiver: ^2.1.3 # For hash2 function, and other utilities + states_rebuilder: ^1.15.0 # For state management improved # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.3 From b597a867fc3e39f8b21c19d9065a56991df995dd Mon Sep 17 00:00:00 2001 From: OroshiX Date: Thu, 7 May 2020 10:51:59 +0200 Subject: [PATCH 3/7] [Flutter] big refactor --- FlutterCoinche/lib/bloc/bloc_base.dart | 3 -- .../lib/{ => domain}/dto/belote.dart | 0 FlutterCoinche/lib/{ => domain}/dto/bid.dart | 8 ++--- FlutterCoinche/lib/{ => domain}/dto/card.dart | 4 +-- FlutterCoinche/lib/{ => domain}/dto/game.dart | 12 +++---- .../lib/{ => domain}/dto/game_empty.dart | 2 +- .../lib/{ => domain}/dto/nicknames.dart | 2 +- .../lib/{ => domain}/dto/player_position.dart | 0 .../lib/{ => domain}/dto/score.dart | 0 .../lib/{ => domain}/dto/table_state.dart | 0 .../extensions/bid_extension.dart | 6 ++-- .../extensions/game_extensions.dart | 2 +- .../{business => domain/logic}/calculus.dart | 4 +-- .../lib/{ => domain}/type/callbacks.dart | 0 FlutterCoinche/lib/main.dart | 12 +++---- .../network}/fire_auth_service.dart | 26 ++------------- .../lib/service/network/my_auth_user.dart | 22 +++++++++++++ .../network}/server_communication.dart | 6 ++-- .../lib/{widget => state}/game_inherited.dart | 2 +- .../lib/{bloc => state}/games_bloc.dart | 6 ++-- .../lib/{ => ui}/resources/colors.dart | 0 .../lib/{ => ui}/resources/dimens.dart | 0 .../lib/{ => ui}/screen/all_games_screen.dart | 16 +++++----- .../lib/{ => ui}/screen/game_screen.dart | 14 ++++---- .../lib/{ => ui}/screen/lobby_screen.dart | 8 ++--- .../lib/{ => ui}/screen/login_screen.dart | 9 +++--- .../screen/stated_game_screen.dart} | 12 +++---- .../{ => ui}/widget/animated_bidding_bar.dart | 12 +++---- .../lib/{ => ui}/widget/bidding_bar.dart | 32 +++++++++---------- .../lib/{ => ui}/widget/bids_widget.dart | 10 +++--- .../{ => ui}/widget/button_last_trick.dart | 16 +++++----- .../lib/{ => ui}/widget/card_widget.dart | 10 +++--- .../{ => ui}/widget/cards_hand_widget.dart | 6 ++-- .../lib/{ => ui}/widget/cards_on_table.dart | 12 +++---- .../lib/{ => ui}/widget/curve_shape.dart | 0 .../lib/{ => ui}/widget/dot_player.dart | 0 .../landscape/landscape_score_widget.dart | 12 +++---- .../lib/{ => ui}/widget/middle_area.dart | 17 +++++----- .../lib/{ => ui}/widget/neu_round_inset.dart | 6 ++-- .../{ => ui}/widget/neumorphic_container.dart | 2 +- .../{ => ui}/widget/neumorphic_no_state.dart | 4 +-- .../lib/{ => ui}/widget/only_score.dart | 18 +++++------ .../lib/{ => ui}/widget/player_avatar.dart | 14 ++++---- .../portrait/portrait_score_widget.dart | 12 +++---- .../lib/{ => ui}/widget/recap_widget.dart | 6 ++-- .../lib/{ => ui}/widget/table_widget.dart | 22 ++++++------- .../lib/{ => ui}/widget/waiting_players.dart | 4 +-- FlutterCoinche/test/json_test.dart | 5 +-- FlutterCoinche/test/widget_test.dart | 8 ++--- 49 files changed, 201 insertions(+), 203 deletions(-) delete mode 100644 FlutterCoinche/lib/bloc/bloc_base.dart rename FlutterCoinche/lib/{ => domain}/dto/belote.dart (100%) rename FlutterCoinche/lib/{ => domain}/dto/bid.dart (97%) rename FlutterCoinche/lib/{ => domain}/dto/card.dart (96%) rename FlutterCoinche/lib/{ => domain}/dto/game.dart (83%) rename FlutterCoinche/lib/{ => domain}/dto/game_empty.dart (93%) rename FlutterCoinche/lib/{ => domain}/dto/nicknames.dart (94%) rename FlutterCoinche/lib/{ => domain}/dto/player_position.dart (100%) rename FlutterCoinche/lib/{ => domain}/dto/score.dart (100%) rename FlutterCoinche/lib/{ => domain}/dto/table_state.dart (100%) rename FlutterCoinche/lib/{ => domain}/extensions/bid_extension.dart (83%) rename FlutterCoinche/lib/{ => domain}/extensions/game_extensions.dart (94%) rename FlutterCoinche/lib/{business => domain/logic}/calculus.dart (95%) rename FlutterCoinche/lib/{ => domain}/type/callbacks.dart (100%) rename FlutterCoinche/lib/{fire => service/network}/fire_auth_service.dart (89%) create mode 100644 FlutterCoinche/lib/service/network/my_auth_user.dart rename FlutterCoinche/lib/{rest => service/network}/server_communication.dart (94%) rename FlutterCoinche/lib/{widget => state}/game_inherited.dart (97%) rename FlutterCoinche/lib/{bloc => state}/games_bloc.dart (91%) rename FlutterCoinche/lib/{ => ui}/resources/colors.dart (100%) rename FlutterCoinche/lib/{ => ui}/resources/dimens.dart (100%) rename FlutterCoinche/lib/{ => ui}/screen/all_games_screen.dart (94%) rename FlutterCoinche/lib/{ => ui}/screen/game_screen.dart (85%) rename FlutterCoinche/lib/{ => ui}/screen/lobby_screen.dart (88%) rename FlutterCoinche/lib/{ => ui}/screen/login_screen.dart (96%) rename FlutterCoinche/lib/{screen/StatedGameScreen.dart => ui/screen/stated_game_screen.dart} (92%) rename FlutterCoinche/lib/{ => ui}/widget/animated_bidding_bar.dart (80%) rename FlutterCoinche/lib/{ => ui}/widget/bidding_bar.dart (94%) rename FlutterCoinche/lib/{ => ui}/widget/bids_widget.dart (88%) rename FlutterCoinche/lib/{ => ui}/widget/button_last_trick.dart (88%) rename FlutterCoinche/lib/{ => ui}/widget/card_widget.dart (91%) rename FlutterCoinche/lib/{ => ui}/widget/cards_hand_widget.dart (95%) rename FlutterCoinche/lib/{ => ui}/widget/cards_on_table.dart (94%) rename FlutterCoinche/lib/{ => ui}/widget/curve_shape.dart (100%) rename FlutterCoinche/lib/{ => ui}/widget/dot_player.dart (100%) rename FlutterCoinche/lib/{ => ui}/widget/landscape/landscape_score_widget.dart (88%) rename FlutterCoinche/lib/{ => ui}/widget/middle_area.dart (88%) rename FlutterCoinche/lib/{ => ui}/widget/neu_round_inset.dart (92%) rename FlutterCoinche/lib/{ => ui}/widget/neumorphic_container.dart (96%) rename FlutterCoinche/lib/{ => ui}/widget/neumorphic_no_state.dart (95%) rename FlutterCoinche/lib/{ => ui}/widget/only_score.dart (85%) rename FlutterCoinche/lib/{ => ui}/widget/player_avatar.dart (94%) rename FlutterCoinche/lib/{ => ui}/widget/portrait/portrait_score_widget.dart (87%) rename FlutterCoinche/lib/{ => ui}/widget/recap_widget.dart (76%) rename FlutterCoinche/lib/{ => ui}/widget/table_widget.dart (90%) rename FlutterCoinche/lib/{ => ui}/widget/waiting_players.dart (86%) diff --git a/FlutterCoinche/lib/bloc/bloc_base.dart b/FlutterCoinche/lib/bloc/bloc_base.dart deleted file mode 100644 index a03e0b2..0000000 --- a/FlutterCoinche/lib/bloc/bloc_base.dart +++ /dev/null @@ -1,3 +0,0 @@ -abstract class BlocBase { - void dispose(); -} diff --git a/FlutterCoinche/lib/dto/belote.dart b/FlutterCoinche/lib/domain/dto/belote.dart similarity index 100% rename from FlutterCoinche/lib/dto/belote.dart rename to FlutterCoinche/lib/domain/dto/belote.dart diff --git a/FlutterCoinche/lib/dto/bid.dart b/FlutterCoinche/lib/domain/dto/bid.dart similarity index 97% rename from FlutterCoinche/lib/dto/bid.dart rename to FlutterCoinche/lib/domain/dto/bid.dart index b0340dd..e7e2558 100644 --- a/FlutterCoinche/lib/dto/bid.dart +++ b/FlutterCoinche/lib/domain/dto/bid.dart @@ -1,7 +1,7 @@ -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/dot_player.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/widget/dot_player.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; diff --git a/FlutterCoinche/lib/dto/card.dart b/FlutterCoinche/lib/domain/dto/card.dart similarity index 96% rename from FlutterCoinche/lib/dto/card.dart rename to FlutterCoinche/lib/domain/dto/card.dart index eb87392..08a4a47 100644 --- a/FlutterCoinche/lib/dto/card.dart +++ b/FlutterCoinche/lib/domain/dto/card.dart @@ -1,5 +1,5 @@ -import 'package:FlutterCoinche/dto/belote.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/belote.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; diff --git a/FlutterCoinche/lib/dto/game.dart b/FlutterCoinche/lib/domain/dto/game.dart similarity index 83% rename from FlutterCoinche/lib/dto/game.dart rename to FlutterCoinche/lib/domain/dto/game.dart index ef4ba79..df2c6f5 100644 --- a/FlutterCoinche/lib/dto/game.dart +++ b/FlutterCoinche/lib/domain/dto/game.dart @@ -1,9 +1,9 @@ -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/nicknames.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/dto/score.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/nicknames.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/score.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; diff --git a/FlutterCoinche/lib/dto/game_empty.dart b/FlutterCoinche/lib/domain/dto/game_empty.dart similarity index 93% rename from FlutterCoinche/lib/dto/game_empty.dart rename to FlutterCoinche/lib/domain/dto/game_empty.dart index e90db38..96e1530 100644 --- a/FlutterCoinche/lib/dto/game_empty.dart +++ b/FlutterCoinche/lib/domain/dto/game_empty.dart @@ -1,4 +1,4 @@ -import 'package:FlutterCoinche/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; import 'package:json_annotation/json_annotation.dart'; part 'game_empty.g.dart'; diff --git a/FlutterCoinche/lib/dto/nicknames.dart b/FlutterCoinche/lib/domain/dto/nicknames.dart similarity index 94% rename from FlutterCoinche/lib/dto/nicknames.dart rename to FlutterCoinche/lib/domain/dto/nicknames.dart index 56970ee..49ba8c4 100644 --- a/FlutterCoinche/lib/dto/nicknames.dart +++ b/FlutterCoinche/lib/domain/dto/nicknames.dart @@ -1,4 +1,4 @@ -import 'package:FlutterCoinche/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; import 'package:equatable/equatable.dart'; import 'package:json_annotation/json_annotation.dart'; diff --git a/FlutterCoinche/lib/dto/player_position.dart b/FlutterCoinche/lib/domain/dto/player_position.dart similarity index 100% rename from FlutterCoinche/lib/dto/player_position.dart rename to FlutterCoinche/lib/domain/dto/player_position.dart diff --git a/FlutterCoinche/lib/dto/score.dart b/FlutterCoinche/lib/domain/dto/score.dart similarity index 100% rename from FlutterCoinche/lib/dto/score.dart rename to FlutterCoinche/lib/domain/dto/score.dart diff --git a/FlutterCoinche/lib/dto/table_state.dart b/FlutterCoinche/lib/domain/dto/table_state.dart similarity index 100% rename from FlutterCoinche/lib/dto/table_state.dart rename to FlutterCoinche/lib/domain/dto/table_state.dart diff --git a/FlutterCoinche/lib/extensions/bid_extension.dart b/FlutterCoinche/lib/domain/extensions/bid_extension.dart similarity index 83% rename from FlutterCoinche/lib/extensions/bid_extension.dart rename to FlutterCoinche/lib/domain/extensions/bid_extension.dart index 3378dca..59fc32c 100644 --- a/FlutterCoinche/lib/extensions/bid_extension.dart +++ b/FlutterCoinche/lib/domain/extensions/bid_extension.dart @@ -1,6 +1,6 @@ -import 'package:FlutterCoinche/business/calculus.dart'; -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/logic/calculus.dart'; extension BidExtension on List { bool canCoinche(PlayerPosition me) => diff --git a/FlutterCoinche/lib/extensions/game_extensions.dart b/FlutterCoinche/lib/domain/extensions/game_extensions.dart similarity index 94% rename from FlutterCoinche/lib/extensions/game_extensions.dart rename to FlutterCoinche/lib/domain/extensions/game_extensions.dart index df18d48..5241a45 100644 --- a/FlutterCoinche/lib/extensions/game_extensions.dart +++ b/FlutterCoinche/lib/domain/extensions/game_extensions.dart @@ -1,4 +1,4 @@ -import 'package:FlutterCoinche/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:flutter/foundation.dart'; extension GameExtensions on Game { diff --git a/FlutterCoinche/lib/business/calculus.dart b/FlutterCoinche/lib/domain/logic/calculus.dart similarity index 95% rename from FlutterCoinche/lib/business/calculus.dart rename to FlutterCoinche/lib/domain/logic/calculus.dart index 980eb8e..83275d6 100644 --- a/FlutterCoinche/lib/business/calculus.dart +++ b/FlutterCoinche/lib/domain/logic/calculus.dart @@ -1,5 +1,5 @@ -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; import 'package:flutter/material.dart'; PlayerPosition _getPlayerPositionTop(PlayerPosition myPosition) { diff --git a/FlutterCoinche/lib/type/callbacks.dart b/FlutterCoinche/lib/domain/type/callbacks.dart similarity index 100% rename from FlutterCoinche/lib/type/callbacks.dart rename to FlutterCoinche/lib/domain/type/callbacks.dart diff --git a/FlutterCoinche/lib/main.dart b/FlutterCoinche/lib/main.dart index f08a32c..e36b578 100644 --- a/FlutterCoinche/lib/main.dart +++ b/FlutterCoinche/lib/main.dart @@ -1,9 +1,9 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/screen/StatedGameScreen.dart'; -import 'package:FlutterCoinche/screen/all_games_screen.dart'; -import 'package:FlutterCoinche/screen/game_screen.dart'; -import 'package:FlutterCoinche/screen/lobby_screen.dart'; -import 'package:FlutterCoinche/screen/login_screen.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/ui/screen/stated_game_screen.dart'; +import 'package:FlutterCoinche/ui/screen/all_games_screen.dart'; +import 'package:FlutterCoinche/ui/screen/game_screen.dart'; +import 'package:FlutterCoinche/ui/screen/lobby_screen.dart'; +import 'package:FlutterCoinche/ui/screen/login_screen.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/fire/fire_auth_service.dart b/FlutterCoinche/lib/service/network/fire_auth_service.dart similarity index 89% rename from FlutterCoinche/lib/fire/fire_auth_service.dart rename to FlutterCoinche/lib/service/network/fire_auth_service.dart index 0c1c513..8617043 100644 --- a/FlutterCoinche/lib/fire/fire_auth_service.dart +++ b/FlutterCoinche/lib/service/network/fire_auth_service.dart @@ -1,4 +1,5 @@ -import 'package:FlutterCoinche/rest/server_communication.dart'; +import 'package:FlutterCoinche/service/network/my_auth_user.dart'; +import 'package:FlutterCoinche/service/network/server_communication.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -116,25 +117,4 @@ FireAuthService getFireAuthService() { _fireAuthService = FireAuthService(); } return _fireAuthService; -} - -class MyAuthUser { - final String uid; - final String displayName; - final String email; - final bool isEmailVerified; - final bool isAnonymous; - - MyAuthUser({ - @required this.uid, - @required this.displayName, - @required this.email, - @required this.isEmailVerified, - @required this.isAnonymous, - }); - - @override - String toString() { - return '$displayName'; - } -} +} \ No newline at end of file diff --git a/FlutterCoinche/lib/service/network/my_auth_user.dart b/FlutterCoinche/lib/service/network/my_auth_user.dart new file mode 100644 index 0000000..993e37b --- /dev/null +++ b/FlutterCoinche/lib/service/network/my_auth_user.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +class MyAuthUser { + final String uid; + final String displayName; + final String email; + final bool isEmailVerified; + final bool isAnonymous; + + MyAuthUser({ + @required this.uid, + @required this.displayName, + @required this.email, + @required this.isEmailVerified, + @required this.isAnonymous, + }); + + @override + String toString() { + return '$displayName'; + } +} diff --git a/FlutterCoinche/lib/rest/server_communication.dart b/FlutterCoinche/lib/service/network/server_communication.dart similarity index 94% rename from FlutterCoinche/lib/rest/server_communication.dart rename to FlutterCoinche/lib/service/network/server_communication.dart index b9b5b56..18d58df 100644 --- a/FlutterCoinche/lib/rest/server_communication.dart +++ b/FlutterCoinche/lib/service/network/server_communication.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'dart:convert'; import 'package:FlutterCoinche/.env.dart'; -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/game_empty.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/game_empty.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:requests/requests.dart'; diff --git a/FlutterCoinche/lib/widget/game_inherited.dart b/FlutterCoinche/lib/state/game_inherited.dart similarity index 97% rename from FlutterCoinche/lib/widget/game_inherited.dart rename to FlutterCoinche/lib/state/game_inherited.dart index 5c05809..984eb29 100644 --- a/FlutterCoinche/lib/widget/game_inherited.dart +++ b/FlutterCoinche/lib/state/game_inherited.dart @@ -1,4 +1,4 @@ -import 'package:FlutterCoinche/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; diff --git a/FlutterCoinche/lib/bloc/games_bloc.dart b/FlutterCoinche/lib/state/games_bloc.dart similarity index 91% rename from FlutterCoinche/lib/bloc/games_bloc.dart rename to FlutterCoinche/lib/state/games_bloc.dart index d2d7a8e..17b1213 100644 --- a/FlutterCoinche/lib/bloc/games_bloc.dart +++ b/FlutterCoinche/lib/state/games_bloc.dart @@ -1,8 +1,8 @@ import 'dart:async'; -import 'package:FlutterCoinche/dto/game.dart'; -import 'package:FlutterCoinche/dto/game_empty.dart'; -import 'package:FlutterCoinche/fire/fire_auth_service.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/game_empty.dart'; +import 'package:FlutterCoinche/service/network/my_auth_user.dart'; import 'package:audioplayers/audio_cache.dart'; import 'package:audioplayers/audioplayers.dart'; import 'package:bloc_provider/bloc_provider.dart'; diff --git a/FlutterCoinche/lib/resources/colors.dart b/FlutterCoinche/lib/ui/resources/colors.dart similarity index 100% rename from FlutterCoinche/lib/resources/colors.dart rename to FlutterCoinche/lib/ui/resources/colors.dart diff --git a/FlutterCoinche/lib/resources/dimens.dart b/FlutterCoinche/lib/ui/resources/dimens.dart similarity index 100% rename from FlutterCoinche/lib/resources/dimens.dart rename to FlutterCoinche/lib/ui/resources/dimens.dart diff --git a/FlutterCoinche/lib/screen/all_games_screen.dart b/FlutterCoinche/lib/ui/screen/all_games_screen.dart similarity index 94% rename from FlutterCoinche/lib/screen/all_games_screen.dart rename to FlutterCoinche/lib/ui/screen/all_games_screen.dart index 75fc53d..6b47d85 100644 --- a/FlutterCoinche/lib/screen/all_games_screen.dart +++ b/FlutterCoinche/lib/ui/screen/all_games_screen.dart @@ -1,12 +1,12 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/dto/game_empty.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/rest/server_communication.dart'; -import 'package:FlutterCoinche/screen/lobby_screen.dart'; -import 'package:FlutterCoinche/screen/login_screen.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/domain/dto/game_empty.dart'; +import 'package:FlutterCoinche/service/network/server_communication.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/inner_shadow.dart'; -import 'package:FlutterCoinche/widget/neu_round_inset.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/screen/lobby_screen.dart'; +import 'package:FlutterCoinche/ui/screen/login_screen.dart'; +import 'package:FlutterCoinche/ui/widget/neu_round_inset.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flushbar/flushbar.dart'; import 'package:flushbar/flushbar_helper.dart'; diff --git a/FlutterCoinche/lib/screen/game_screen.dart b/FlutterCoinche/lib/ui/screen/game_screen.dart similarity index 85% rename from FlutterCoinche/lib/screen/game_screen.dart rename to FlutterCoinche/lib/ui/screen/game_screen.dart index bf5025c..5466d73 100644 --- a/FlutterCoinche/lib/screen/game_screen.dart +++ b/FlutterCoinche/lib/ui/screen/game_screen.dart @@ -1,10 +1,10 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/game.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/table_widget.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/table_widget.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/FlutterCoinche/lib/screen/lobby_screen.dart b/FlutterCoinche/lib/ui/screen/lobby_screen.dart similarity index 88% rename from FlutterCoinche/lib/screen/lobby_screen.dart rename to FlutterCoinche/lib/ui/screen/lobby_screen.dart index b456fa5..77c1e1f 100644 --- a/FlutterCoinche/lib/screen/lobby_screen.dart +++ b/FlutterCoinche/lib/ui/screen/lobby_screen.dart @@ -1,7 +1,7 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/dto/game.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/screen/StatedGameScreen.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/ui/screen/stated_game_screen.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/screen/login_screen.dart b/FlutterCoinche/lib/ui/screen/login_screen.dart similarity index 96% rename from FlutterCoinche/lib/screen/login_screen.dart rename to FlutterCoinche/lib/ui/screen/login_screen.dart index 2bb7f67..79b09b4 100644 --- a/FlutterCoinche/lib/screen/login_screen.dart +++ b/FlutterCoinche/lib/ui/screen/login_screen.dart @@ -1,7 +1,8 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/fire/fire_auth_service.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/screen/all_games_screen.dart'; +import 'package:FlutterCoinche/service/network/fire_auth_service.dart'; +import 'package:FlutterCoinche/service/network/my_auth_user.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/screen/all_games_screen.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flushbar/flushbar.dart'; import 'package:flutter/cupertino.dart'; diff --git a/FlutterCoinche/lib/screen/StatedGameScreen.dart b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart similarity index 92% rename from FlutterCoinche/lib/screen/StatedGameScreen.dart rename to FlutterCoinche/lib/ui/screen/stated_game_screen.dart index 0c89a85..103a60a 100644 --- a/FlutterCoinche/lib/screen/StatedGameScreen.dart +++ b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart @@ -1,9 +1,9 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/game.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/FlutterCoinche/lib/widget/animated_bidding_bar.dart b/FlutterCoinche/lib/ui/widget/animated_bidding_bar.dart similarity index 80% rename from FlutterCoinche/lib/widget/animated_bidding_bar.dart rename to FlutterCoinche/lib/ui/widget/animated_bidding_bar.dart index d9eba43..fd432ce 100644 --- a/FlutterCoinche/lib/widget/animated_bidding_bar.dart +++ b/FlutterCoinche/lib/ui/widget/animated_bidding_bar.dart @@ -1,9 +1,9 @@ -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/resources/dimens.dart'; -import 'package:FlutterCoinche/rest/server_communication.dart'; -import 'package:FlutterCoinche/widget/bidding_bar.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/service/network/server_communication.dart'; +import 'package:FlutterCoinche/ui/resources/dimens.dart'; +import 'package:FlutterCoinche/ui/widget/bidding_bar.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/widget/bidding_bar.dart b/FlutterCoinche/lib/ui/widget/bidding_bar.dart similarity index 94% rename from FlutterCoinche/lib/widget/bidding_bar.dart rename to FlutterCoinche/lib/ui/widget/bidding_bar.dart index a270640..9312e24 100644 --- a/FlutterCoinche/lib/widget/bidding_bar.dart +++ b/FlutterCoinche/lib/ui/widget/bidding_bar.dart @@ -1,13 +1,13 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/card.dart' as cardModel; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/extensions/bid_extension.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/resources/dimens.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/extensions/bid_extension.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/resources/dimens.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -33,7 +33,7 @@ class BiddingBar extends StatefulWidget { class _BiddingBarState extends State { int points; - cardModel.CardColor _cardColor; + CardColor _cardColor; bool _belote; @@ -47,20 +47,20 @@ class _BiddingBarState extends State { points = 80; _belote = false; bidType = widget.initialBidType; - _cardColor = cardModel.CardColor.HEART; + _cardColor = CardColor.HEART; } Widget _getDropDownSuit(Size screenSize) { return DropdownButtonHideUnderline( - child: DropdownButton( + child: DropdownButton( value: _cardColor, - items: cardModel.CardColor.values - .map((e) => DropdownMenuItem( + items: CardColor.values + .map((e) => DropdownMenuItem( value: e, child: Container( width: isLargeScreen(screenSize) ? 50 : 30, child: Image.asset( - cardModel.getAssetImageFromColor(e), + getAssetImageFromColor(e), fit: BoxFit.contain, ), ))) diff --git a/FlutterCoinche/lib/widget/bids_widget.dart b/FlutterCoinche/lib/ui/widget/bids_widget.dart similarity index 88% rename from FlutterCoinche/lib/widget/bids_widget.dart rename to FlutterCoinche/lib/ui/widget/bids_widget.dart index cbb6dea..bd7e94c 100644 --- a/FlutterCoinche/lib/widget/bids_widget.dart +++ b/FlutterCoinche/lib/ui/widget/bids_widget.dart @@ -1,8 +1,8 @@ -import 'package:FlutterCoinche/business/calculus.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/logic/calculus.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:bubble/bubble.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/widget/button_last_trick.dart b/FlutterCoinche/lib/ui/widget/button_last_trick.dart similarity index 88% rename from FlutterCoinche/lib/widget/button_last_trick.dart rename to FlutterCoinche/lib/ui/widget/button_last_trick.dart index 6c38546..48c5ada 100644 --- a/FlutterCoinche/lib/widget/button_last_trick.dart +++ b/FlutterCoinche/lib/ui/widget/button_last_trick.dart @@ -1,11 +1,11 @@ -import 'package:FlutterCoinche/business/calculus.dart'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/card_widget.dart'; -import 'package:FlutterCoinche/widget/dot_player.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/logic/calculus.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/widget/card_widget.dart'; +import 'package:FlutterCoinche/ui/widget/dot_player.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:flutter/material.dart'; class ButtonLastTrick extends StatelessWidget { diff --git a/FlutterCoinche/lib/widget/card_widget.dart b/FlutterCoinche/lib/ui/widget/card_widget.dart similarity index 91% rename from FlutterCoinche/lib/widget/card_widget.dart rename to FlutterCoinche/lib/ui/widget/card_widget.dart index 16e5cae..c574472 100644 --- a/FlutterCoinche/lib/widget/card_widget.dart +++ b/FlutterCoinche/lib/ui/widget/card_widget.dart @@ -1,10 +1,10 @@ import 'dart:math'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/resources/dimens.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/resources/dimens.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/material.dart'; class CardWidget extends StatelessWidget { diff --git a/FlutterCoinche/lib/widget/cards_hand_widget.dart b/FlutterCoinche/lib/ui/widget/cards_hand_widget.dart similarity index 95% rename from FlutterCoinche/lib/widget/cards_hand_widget.dart rename to FlutterCoinche/lib/ui/widget/cards_hand_widget.dart index d2b7b36..2fc3ec0 100644 --- a/FlutterCoinche/lib/widget/cards_hand_widget.dart +++ b/FlutterCoinche/lib/ui/widget/cards_hand_widget.dart @@ -1,6 +1,6 @@ -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/widget/card_widget.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/ui/widget/card_widget.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:flutter/material.dart'; class CardsInHandWidget extends StatelessWidget { diff --git a/FlutterCoinche/lib/widget/cards_on_table.dart b/FlutterCoinche/lib/ui/widget/cards_on_table.dart similarity index 94% rename from FlutterCoinche/lib/widget/cards_on_table.dart rename to FlutterCoinche/lib/ui/widget/cards_on_table.dart index efa24d0..2fb2146 100644 --- a/FlutterCoinche/lib/widget/cards_on_table.dart +++ b/FlutterCoinche/lib/ui/widget/cards_on_table.dart @@ -1,11 +1,11 @@ import 'dart:math'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/resources/dimens.dart'; -import 'package:FlutterCoinche/widget/card_widget.dart'; -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/ui/resources/dimens.dart'; +import 'package:FlutterCoinche/ui/widget/card_widget.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/widget/curve_shape.dart b/FlutterCoinche/lib/ui/widget/curve_shape.dart similarity index 100% rename from FlutterCoinche/lib/widget/curve_shape.dart rename to FlutterCoinche/lib/ui/widget/curve_shape.dart diff --git a/FlutterCoinche/lib/widget/dot_player.dart b/FlutterCoinche/lib/ui/widget/dot_player.dart similarity index 100% rename from FlutterCoinche/lib/widget/dot_player.dart rename to FlutterCoinche/lib/ui/widget/dot_player.dart diff --git a/FlutterCoinche/lib/widget/landscape/landscape_score_widget.dart b/FlutterCoinche/lib/ui/widget/landscape/landscape_score_widget.dart similarity index 88% rename from FlutterCoinche/lib/widget/landscape/landscape_score_widget.dart rename to FlutterCoinche/lib/ui/widget/landscape/landscape_score_widget.dart index a3db1d0..f93baac 100644 --- a/FlutterCoinche/lib/widget/landscape/landscape_score_widget.dart +++ b/FlutterCoinche/lib/ui/widget/landscape/landscape_score_widget.dart @@ -1,9 +1,9 @@ -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/only_score.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/only_score.dart'; import 'package:flutter/material.dart'; class LandscapeScoreWidget extends StatelessWidget { diff --git a/FlutterCoinche/lib/widget/middle_area.dart b/FlutterCoinche/lib/ui/widget/middle_area.dart similarity index 88% rename from FlutterCoinche/lib/widget/middle_area.dart rename to FlutterCoinche/lib/ui/widget/middle_area.dart index 96728e5..1be99ed 100644 --- a/FlutterCoinche/lib/widget/middle_area.dart +++ b/FlutterCoinche/lib/ui/widget/middle_area.dart @@ -1,12 +1,11 @@ -import 'package:FlutterCoinche/bloc/games_bloc.dart'; -import 'package:FlutterCoinche/business/calculus.dart'; -import 'package:FlutterCoinche/dto/card.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/resources/dimens.dart'; -import 'package:FlutterCoinche/rest/server_communication.dart'; -import 'package:FlutterCoinche/widget/card_widget.dart'; -import 'package:FlutterCoinche/widget/cards_on_table.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/logic/calculus.dart'; +import 'package:FlutterCoinche/service/network/server_communication.dart'; +import 'package:FlutterCoinche/ui/resources/dimens.dart'; +import 'package:FlutterCoinche/ui/widget/card_widget.dart'; +import 'package:FlutterCoinche/ui/widget/cards_on_table.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/widget/neu_round_inset.dart b/FlutterCoinche/lib/ui/widget/neu_round_inset.dart similarity index 92% rename from FlutterCoinche/lib/widget/neu_round_inset.dart rename to FlutterCoinche/lib/ui/widget/neu_round_inset.dart index 4da17f3..ad034df 100644 --- a/FlutterCoinche/lib/widget/neu_round_inset.dart +++ b/FlutterCoinche/lib/ui/widget/neu_round_inset.dart @@ -1,7 +1,7 @@ -import 'package:FlutterCoinche/resources/colors.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/inner_shadow.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/material.dart'; class NeuRoundInset extends StatefulWidget { diff --git a/FlutterCoinche/lib/widget/neumorphic_container.dart b/FlutterCoinche/lib/ui/widget/neumorphic_container.dart similarity index 96% rename from FlutterCoinche/lib/widget/neumorphic_container.dart rename to FlutterCoinche/lib/ui/widget/neumorphic_container.dart index 1f7560f..4b5fabd 100644 --- a/FlutterCoinche/lib/widget/neumorphic_container.dart +++ b/FlutterCoinche/lib/ui/widget/neumorphic_container.dart @@ -1,4 +1,4 @@ -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/material.dart'; class NeumorphicWidget extends StatefulWidget { diff --git a/FlutterCoinche/lib/widget/neumorphic_no_state.dart b/FlutterCoinche/lib/ui/widget/neumorphic_no_state.dart similarity index 95% rename from FlutterCoinche/lib/widget/neumorphic_no_state.dart rename to FlutterCoinche/lib/ui/widget/neumorphic_no_state.dart index ac55050..4f42e20 100644 --- a/FlutterCoinche/lib/widget/neumorphic_no_state.dart +++ b/FlutterCoinche/lib/ui/widget/neumorphic_no_state.dart @@ -1,5 +1,5 @@ -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:flutter/material.dart'; const double kBlur1 = 2, diff --git a/FlutterCoinche/lib/widget/only_score.dart b/FlutterCoinche/lib/ui/widget/only_score.dart similarity index 85% rename from FlutterCoinche/lib/widget/only_score.dart rename to FlutterCoinche/lib/ui/widget/only_score.dart index 01d3186..f2b4b49 100644 --- a/FlutterCoinche/lib/widget/only_score.dart +++ b/FlutterCoinche/lib/ui/widget/only_score.dart @@ -1,12 +1,12 @@ -import 'package:FlutterCoinche/business/calculus.dart'; -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/player_position.dart' show PlayerPosition; -import 'package:FlutterCoinche/dto/score.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/dot_player.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart' show PlayerPosition; +import 'package:FlutterCoinche/domain/dto/score.dart'; +import 'package:FlutterCoinche/domain/logic/calculus.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/widget/dot_player.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/material.dart'; class OnlyScoreWidget extends StatelessWidget { diff --git a/FlutterCoinche/lib/widget/player_avatar.dart b/FlutterCoinche/lib/ui/widget/player_avatar.dart similarity index 94% rename from FlutterCoinche/lib/widget/player_avatar.dart rename to FlutterCoinche/lib/ui/widget/player_avatar.dart index b4720bd..f64695e 100644 --- a/FlutterCoinche/lib/widget/player_avatar.dart +++ b/FlutterCoinche/lib/ui/widget/player_avatar.dart @@ -1,11 +1,11 @@ -import 'package:FlutterCoinche/business/calculus.dart'; -import 'package:FlutterCoinche/dto/player_position.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/logic/calculus.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/inner_shadow.dart'; -import 'package:FlutterCoinche/widget/dot_player.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/ui/widget/dot_player.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/widget/portrait/portrait_score_widget.dart b/FlutterCoinche/lib/ui/widget/portrait/portrait_score_widget.dart similarity index 87% rename from FlutterCoinche/lib/widget/portrait/portrait_score_widget.dart rename to FlutterCoinche/lib/ui/widget/portrait/portrait_score_widget.dart index d99ad78..c9dabe7 100644 --- a/FlutterCoinche/lib/widget/portrait/portrait_score_widget.dart +++ b/FlutterCoinche/lib/ui/widget/portrait/portrait_score_widget.dart @@ -1,9 +1,9 @@ -import 'package:FlutterCoinche/dto/bid.dart'; -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/resources/colors.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/only_score.dart'; +import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/only_score.dart'; import 'package:flutter/material.dart'; class PortraitScoreWidget extends StatelessWidget { diff --git a/FlutterCoinche/lib/widget/recap_widget.dart b/FlutterCoinche/lib/ui/widget/recap_widget.dart similarity index 76% rename from FlutterCoinche/lib/widget/recap_widget.dart rename to FlutterCoinche/lib/ui/widget/recap_widget.dart index b5673b8..eaf1c44 100644 --- a/FlutterCoinche/lib/widget/recap_widget.dart +++ b/FlutterCoinche/lib/ui/widget/recap_widget.dart @@ -1,6 +1,6 @@ -import 'package:FlutterCoinche/widget/game_inherited.dart'; -import 'package:FlutterCoinche/widget/neumorphic_container.dart'; -import 'package:FlutterCoinche/widget/neumorphic_no_state.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; +import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/material.dart'; class RecapWidget extends StatelessWidget { diff --git a/FlutterCoinche/lib/widget/table_widget.dart b/FlutterCoinche/lib/ui/widget/table_widget.dart similarity index 90% rename from FlutterCoinche/lib/widget/table_widget.dart rename to FlutterCoinche/lib/ui/widget/table_widget.dart index d1faca4..5913710 100644 --- a/FlutterCoinche/lib/widget/table_widget.dart +++ b/FlutterCoinche/lib/ui/widget/table_widget.dart @@ -1,14 +1,14 @@ -import 'package:FlutterCoinche/resources/dimens.dart'; -import 'package:FlutterCoinche/widget/animated_bidding_bar.dart'; -import 'package:FlutterCoinche/widget/bids_widget.dart'; -import 'package:FlutterCoinche/widget/button_last_trick.dart'; -import 'package:FlutterCoinche/widget/cards_hand_widget.dart'; -import 'package:FlutterCoinche/widget/landscape/landscape_score_widget.dart'; -import 'package:FlutterCoinche/widget/middle_area.dart'; -import 'package:FlutterCoinche/widget/player_avatar.dart'; -import 'package:FlutterCoinche/widget/portrait/portrait_score_widget.dart'; -import 'package:FlutterCoinche/widget/recap_widget.dart'; -import 'package:FlutterCoinche/widget/waiting_players.dart'; +import 'package:FlutterCoinche/ui/resources/dimens.dart'; +import 'package:FlutterCoinche/ui/widget/animated_bidding_bar.dart'; +import 'package:FlutterCoinche/ui/widget/bids_widget.dart'; +import 'package:FlutterCoinche/ui/widget/button_last_trick.dart'; +import 'package:FlutterCoinche/ui/widget/cards_hand_widget.dart'; +import 'package:FlutterCoinche/ui/widget/landscape/landscape_score_widget.dart'; +import 'package:FlutterCoinche/ui/widget/middle_area.dart'; +import 'package:FlutterCoinche/ui/widget/player_avatar.dart'; +import 'package:FlutterCoinche/ui/widget/portrait/portrait_score_widget.dart'; +import 'package:FlutterCoinche/ui/widget/recap_widget.dart'; +import 'package:FlutterCoinche/ui/widget/waiting_players.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/FlutterCoinche/lib/widget/waiting_players.dart b/FlutterCoinche/lib/ui/widget/waiting_players.dart similarity index 86% rename from FlutterCoinche/lib/widget/waiting_players.dart rename to FlutterCoinche/lib/ui/widget/waiting_players.dart index f753924..baf0876 100644 --- a/FlutterCoinche/lib/widget/waiting_players.dart +++ b/FlutterCoinche/lib/ui/widget/waiting_players.dart @@ -1,5 +1,5 @@ -import 'package:FlutterCoinche/dto/table_state.dart'; -import 'package:FlutterCoinche/widget/game_inherited.dart'; +import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:flutter/material.dart'; class WaitingPlayersWidget extends StatelessWidget { diff --git a/FlutterCoinche/test/json_test.dart b/FlutterCoinche/test/json_test.dart index da01970..c331c59 100644 --- a/FlutterCoinche/test/json_test.dart +++ b/FlutterCoinche/test/json_test.dart @@ -1,11 +1,12 @@ import 'dart:convert'; -import 'package:FlutterCoinche/dto/game_empty.dart'; +import 'package:FlutterCoinche/domain/dto/game_empty.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test("Parses allGames.json", () { - const jsonString = """[{"id":"NGfygSoelRxeF04SHcaU","nbJoined":4,"name":"AUTOMATEDme","nicknameCreator":"Jess","state":"PLAYING","inRoom":true},{"id":"hOnpWLvxKSEjD9ppz7vT","nbJoined":1,"name":"gameboy","nicknameCreator":"ieok","state":"JOINING","inRoom":false},{"id":"pcxbJ6Ehd27W7F90uihW","nbJoined":1,"name":"AAAutomated","nicknameCreator":"ieok","state":"JOINING","inRoom":false}]"""; + const jsonString = + """[{"id":"NGfygSoelRxeF04SHcaU","nbJoined":4,"name":"AUTOMATEDme","nicknameCreator":"Jess","state":"PLAYING","inRoom":true},{"id":"hOnpWLvxKSEjD9ppz7vT","nbJoined":1,"name":"gameboy","nicknameCreator":"ieok","state":"JOINING","inRoom":false},{"id":"pcxbJ6Ehd27W7F90uihW","nbJoined":1,"name":"AAAutomated","nicknameCreator":"ieok","state":"JOINING","inRoom":false}]"""; expect( (jsonDecode(jsonString) as List) .map((e) => GameEmpty.fromJson(e)) diff --git a/FlutterCoinche/test/widget_test.dart b/FlutterCoinche/test/widget_test.dart index 4c99d0c..a73e9cc 100644 --- a/FlutterCoinche/test/widget_test.dart +++ b/FlutterCoinche/test/widget_test.dart @@ -5,8 +5,8 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. -import 'package:FlutterCoinche/dto/card.dart' ; -import 'package:FlutterCoinche/widget/card_widget.dart'; +import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/ui/widget/card_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter/src/widgets/container.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -21,9 +21,7 @@ void main() { height: 60, child: CardWidget( card: CardModel( - color: CardColor.CLUB, - playable: true, - value: CardValue.KING), + color: CardColor.CLUB, playable: true, value: CardValue.KING), width: 40, height: 60, displayPlayable: true, From 84863f011dff4e91f84e4b5e148ef1b83022b2c6 Mon Sep 17 00:00:00 2001 From: OroshiX Date: Thu, 7 May 2020 13:55:06 +0200 Subject: [PATCH 4/7] [Flutter] First working hierarchy states_builder --- .../lib/ui/screen/stated_game_screen.dart | 161 +++++++++++------- 1 file changed, 99 insertions(+), 62 deletions(-) diff --git a/FlutterCoinche/lib/ui/screen/stated_game_screen.dart b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart index 103a60a..5613498 100644 --- a/FlutterCoinche/lib/ui/screen/stated_game_screen.dart +++ b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart @@ -1,10 +1,12 @@ -import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/domain/dto/bid.dart'; import 'package:FlutterCoinche/domain/dto/card.dart'; import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/player_position.dart'; import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:bloc_provider/bloc_provider.dart'; +import 'package:flushbar/flushbar_helper.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:states_rebuilder/states_rebuilder.dart'; @@ -19,69 +21,89 @@ class StatedGameScreen extends StatelessWidget { onWillPop: () async { return (await _quit(context)) ?? false; }, - child: Injector( - inject: [ - Inject.stream(() => BlocProvider.of(context).game, - name: "game"), - Inject(() => Game()), - Inject.future(() => getPosTableToColors()) - ], - initState: () { - // To be executed in the initState of StatefulWidget - }, - builder: (BuildContext context) { - final ReactiveModel gameFire = - Injector.getAsReactive(name: "game"); - final ReactiveModel game = Injector.getAsReactive(); - - return StateBuilder( - models: [gameFire], - onSetState: (_, model) { - game.setValue(() => gameFire.value); - }, - builder: (_, __) { - return Scaffold( - appBar: AppBar( - title: Text("${game.value.id}"), - actions: [ - FlatButton( - onPressed: () { - game.setState( - (game) => game.bids.add(SimpleBid( - points: 90, - color: CardColor.HEART, - position: PlayerPosition.EAST)), - filterTags: [Aspects.BIDS], - catchError: true, - onSetState: (context) { - if (game.hasError) { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Icon(Icons.error), - content: Text("${game.error}"), - ), - ); - } - }, - ); - }, - child: Text("add a bid")) - ], - ), - floatingActionButton: FloatingActionButton( - child: Icon(Icons.sort_by_alpha), - onPressed: () => - game.setState((Game g) => g.sortCards())), - body: TestWidget()); - }, - ); - }, - ), + child: _top(context), ), ); } + Widget _top(BuildContext context) { + return StateBuilder( + observe: () => + RM.stream(BlocProvider.of(context).game, name: "gameFire"), + builder: (context, model) => WhenRebuilder( + models: [model], + onIdle: () => _buildEmpty(), + onWaiting: () => _buildWaiting(), + onError: (e) => _buildEmpty(), + onData: (gameFire) { + var model = Inject(() => gameFire); + return Injector( + inject: [model], + builder: (BuildContext buildContext) { + return _build(model.getReactive()); + }); + }), + ); + /* + return Injector( + inject: [ + Inject.stream(() => BlocProvider.of(context).game, + name: "game") + ], + builder: (BuildContext buildContext) { + return WhenRebuilder( + observe: () => RM.get(name: "game"), + onIdle: () => _buildEmpty(), + onWaiting: () => _buildWaiting(), + onError: (e) => _buildEmpty(), + onData: (gameFire) { +// var reactiveModel = RM.create(gameFire).asNew(); + return StateBuilder( + onSetState: (context, model) { + model.setValue(() => gameFire); + }, + observe: () => RM.create(gameFire), +// observeMany: [ +// () => reactiveModel, +// () => RM.future(getPosTableToColors()), +// ], + builder: + (BuildContext context, ReactiveModel gameModel) { + if (gameModel.state != null) return _build(gameModel); + return _buildEmpty(); + }); + }); + }, + ); + */ + } + + Widget _build(ReactiveModel gameModel) { + return Scaffold( + appBar: AppBar( + title: Text("${gameModel.state.id}"), + actions: [ + FlatButton( + onPressed: () { + gameModel.setState( + (g) => g.bids.add(SimpleBid( + points: 90, + color: CardColor.HEART, + position: PlayerPosition.EAST)), + filterTags: [Aspects.BIDS], + catchError: true, + onSetState: (context) {}, + ); + }, + child: Text("add a bid")) + ], + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.sort_by_alpha), + onPressed: () => gameModel.setState((Game g) => g.sortCards())), + body: TestWidget()); + } + Future _quit(BuildContext context) { return showDialog( context: context, @@ -101,16 +123,31 @@ class StatedGameScreen extends StatelessWidget { ), ); } + + Widget _buildWaiting() { + return Center( + child: CircularProgressIndicator(), + ); + } + + Widget _buildEmpty() { + return Center( + child: Text("Empty"), + ); + } } class TestWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final ReactiveModel game = - Injector.getAsReactive(context: context); + final ReactiveModel game = RM.get(); return StateBuilder( models: [game], tag: Aspects.BIDS, + onSetState: (context, model) { + FlushbarHelper.createInformation(message: "Hi, new Bids!") + .show(context); + }, builder: (context, model) => Padding( padding: const EdgeInsets.all(20.0), child: Center(child: Text("${game.value}")), From 4726665c2170d70a0c1160f68a71a0a42b97dad0 Mon Sep 17 00:00:00 2001 From: OroshiX Date: Thu, 7 May 2020 16:34:33 +0200 Subject: [PATCH 5/7] [Flutter] Converted all GameInherited to StatesBuilder --- FlutterCoinche/lib/domain/dto/bid.dart | 2 +- .../lib/domain/dto/player_position.dart | 6 +- .../lib/domain/dto/pos_table_to_colors.dart | 9 + .../domain/extensions/game_extensions.dart | 1 + FlutterCoinche/lib/ui/screen/game_screen.dart | 10 +- .../lib/ui/screen/stated_game_screen.dart | 58 ++++-- .../lib/ui/widget/animated_bidding_bar.dart | 62 +++--- FlutterCoinche/lib/ui/widget/bidding_bar.dart | 162 ++++++++------- FlutterCoinche/lib/ui/widget/bids_widget.dart | 120 ++++++----- .../lib/ui/widget/button_last_trick.dart | 148 +++++++------ .../lib/ui/widget/cards_hand_widget.dart | 155 +++++++------- .../landscape/landscape_score_widget.dart | 133 ++++++------ FlutterCoinche/lib/ui/widget/middle_area.dart | 180 ++++++++-------- FlutterCoinche/lib/ui/widget/only_score.dart | 157 +++++++------- .../lib/ui/widget/player_avatar.dart | 196 ++++++++++-------- .../portrait/portrait_score_widget.dart | 125 +++++------ .../lib/ui/widget/recap_widget.dart | 43 ++-- .../lib/ui/widget/waiting_players.dart | 42 ++-- 18 files changed, 865 insertions(+), 744 deletions(-) create mode 100644 FlutterCoinche/lib/domain/dto/pos_table_to_colors.dart diff --git a/FlutterCoinche/lib/domain/dto/bid.dart b/FlutterCoinche/lib/domain/dto/bid.dart index e7e2558..1575f18 100644 --- a/FlutterCoinche/lib/domain/dto/bid.dart +++ b/FlutterCoinche/lib/domain/dto/bid.dart @@ -127,7 +127,7 @@ class Bid { bool operator ==(other) { if (identical(this, other)) return true; if (runtimeType != other.runtimeType || other is! Bid) return false; - var bid = other as Bid; + Bid bid = other; if (bid.type != this.type) return false; if (this is SimpleBid) return this as SimpleBid == bid; if (this is General) return this as General == bid; diff --git a/FlutterCoinche/lib/domain/dto/player_position.dart b/FlutterCoinche/lib/domain/dto/player_position.dart index d27ecf9..589dd77 100644 --- a/FlutterCoinche/lib/domain/dto/player_position.dart +++ b/FlutterCoinche/lib/domain/dto/player_position.dart @@ -1,3 +1,4 @@ +import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -68,6 +69,7 @@ extension TablePosition on AxisDirection { break; } } + print("getAvatar: $file"); return file; } @@ -77,12 +79,12 @@ extension TablePosition on AxisDirection { } } -Future>> getPosTableToColors() async { +Future getPosTableToColors() async { var preferences = await SharedPreferences.getInstance(); Map> res = {}; AxisDirection.values.forEach((element) { res[element] = Tuple2(element._getColor(preferences), element._getAvatar(preferences)); }); - return res; + return PosTableToColor(res); } diff --git a/FlutterCoinche/lib/domain/dto/pos_table_to_colors.dart b/FlutterCoinche/lib/domain/dto/pos_table_to_colors.dart new file mode 100644 index 0000000..f839202 --- /dev/null +++ b/FlutterCoinche/lib/domain/dto/pos_table_to_colors.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; +import 'package:tuple/tuple.dart'; + +@immutable +class PosTableToColor { + final Map> value; + + PosTableToColor(this.value); +} diff --git a/FlutterCoinche/lib/domain/extensions/game_extensions.dart b/FlutterCoinche/lib/domain/extensions/game_extensions.dart index 5241a45..b3b9343 100644 --- a/FlutterCoinche/lib/domain/extensions/game_extensions.dart +++ b/FlutterCoinche/lib/domain/extensions/game_extensions.dart @@ -3,6 +3,7 @@ import 'package:flutter/foundation.dart'; extension GameExtensions on Game { List different(Game old) { + if(old == null) return Aspects.values; List res = []; if (old.id != id) res.add(Aspects.ID); if (old.cards != cards) res.add(Aspects.CARDS); diff --git a/FlutterCoinche/lib/ui/screen/game_screen.dart b/FlutterCoinche/lib/ui/screen/game_screen.dart index 5466d73..7b2957c 100644 --- a/FlutterCoinche/lib/ui/screen/game_screen.dart +++ b/FlutterCoinche/lib/ui/screen/game_screen.dart @@ -1,14 +1,14 @@ -import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/domain/dto/card.dart'; import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/player_position.dart'; -import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/widget/table_widget.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:tuple/tuple.dart'; class GameScreen extends StatefulWidget { static const routeName = "/game"; @@ -58,7 +58,7 @@ class _GameScreenState extends State { }, child: Container( color: colorLightBlue, - child: FutureBuilder>>( + child: FutureBuilder( future: getPosTableToColors(), builder: (ctx, snapshotMap) => StreamBuilder( stream: gamesBloc.game, @@ -75,7 +75,7 @@ class _GameScreenState extends State { } return GameInherited( game: snapshot.data, - map: snapshotMap.data, + map: snapshotMap.data.value, child: TableWidget( quit: _quit, ), diff --git a/FlutterCoinche/lib/ui/screen/stated_game_screen.dart b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart index 5613498..fdd3d56 100644 --- a/FlutterCoinche/lib/ui/screen/stated_game_screen.dart +++ b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart @@ -2,8 +2,11 @@ import 'package:FlutterCoinche/domain/dto/bid.dart'; import 'package:FlutterCoinche/domain/dto/card.dart'; import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/player_position.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/state/games_bloc.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; +import 'package:FlutterCoinche/ui/widget/table_widget.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/cupertino.dart'; @@ -21,28 +24,47 @@ class StatedGameScreen extends StatelessWidget { onWillPop: () async { return (await _quit(context)) ?? false; }, - child: _top(context), + child: Container( + color: colorLightBlue, + child: _top(context), + ), ), ); } Widget _top(BuildContext context) { - return StateBuilder( - observe: () => - RM.stream(BlocProvider.of(context).game, name: "gameFire"), - builder: (context, model) => WhenRebuilder( - models: [model], - onIdle: () => _buildEmpty(), - onWaiting: () => _buildWaiting(), - onError: (e) => _buildEmpty(), - onData: (gameFire) { - var model = Inject(() => gameFire); - return Injector( - inject: [model], - builder: (BuildContext buildContext) { - return _build(model.getReactive()); - }); - }), + return Injector( + inject: [ + Inject(() => Game()), + Inject.future(() => getPosTableToColors()) + ], + builder: (_) => StateBuilder( + observe: () => RM + .stream(BlocProvider.of(context).game, name: "gameFire") +// .asNew("mySeed") +// ..setState((s) => s.sortCards()) + , + builder: (_, modelFire) { + final currentModel = RM.get(); + final pos = RM.get(); + return WhenRebuilder( + models: [modelFire, pos], + onIdle: () => _buildEmpty(), + onWaiting: () => _buildWaiting(), + onError: (e) => _buildEmpty(), + onSetState: (_, rmFire) { + if (rmFire.hasData && rmFire.state != null) { + var different = rmFire.state.different(currentModel.state); + currentModel.setValue(() => rmFire.state, + filterTags: different); + } + }, + onData: (_) { + return TableWidget(quit: _quit); +// return _build(model.getReactive()); + }); + }, + ), ); /* return Injector( diff --git a/FlutterCoinche/lib/ui/widget/animated_bidding_bar.dart b/FlutterCoinche/lib/ui/widget/animated_bidding_bar.dart index fd432ce..30fb762 100644 --- a/FlutterCoinche/lib/ui/widget/animated_bidding_bar.dart +++ b/FlutterCoinche/lib/ui/widget/animated_bidding_bar.dart @@ -1,11 +1,13 @@ import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/service/network/server_communication.dart'; import 'package:FlutterCoinche/ui/resources/dimens.dart'; import 'package:FlutterCoinche/ui/widget/bidding_bar.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class AnimatedBiddingBar extends StatelessWidget { final Size screenSize; @@ -18,35 +20,41 @@ class AnimatedBiddingBar extends StatelessWidget { @override Widget build(BuildContext context) { - final state = - GameInherited.of(context, aspectType: Aspects.STATE).game.state; - final id = GameInherited.of(context, aspectType: Aspects.ID).game.id; + return StateBuilder( + models: [RM.get()], + tag: [Aspects.STATE, Aspects.ID], + builder: (context, model) { + final state = model.state.state; + final id = model.state.id; - return AnimatedPositioned( - bottom: getBottomOfBiddingBar(screenSize), - left: state == TableState.BIDDING - ? screenSize.width / 2 - widthContainerName * 2 - : -screenSize.width, - duration: Duration(milliseconds: 500), - child: AnimatedOpacity( - duration: Duration(milliseconds: 500), - opacity: state == TableState.BIDDING ? 1 : 0, - child: BiddingBar( + return AnimatedPositioned( + bottom: getBottomOfBiddingBar(screenSize), + left: state == TableState.BIDDING + ? screenSize.width / 2 - widthContainerName * 2 + : -screenSize.width, + duration: Duration(milliseconds: 500), + child: AnimatedOpacity( + duration: Duration(milliseconds: 500), + opacity: state == TableState.BIDDING ? 1 : 0, + child: BiddingBar( // height: heightBiddingBar, - onBid: (Bid bid) { - ServerCommunication.bid(bid, id).then((success) { - print("success"); - FlushbarHelper.createSuccess(message: "bid $bid placed") - .show(context); - }, onError: (error) { - print("Error: $error"); - FlushbarHelper.createError(message: "Error placing bid: $error") - .show(context); - }); - }, + onBid: (Bid bid) { + ServerCommunication.bid(bid, id).then((success) { + print("success"); + FlushbarHelper.createSuccess(message: "bid $bid placed") + .show(context); + }, onError: (error) { + print("Error: $error"); + FlushbarHelper.createError( + message: "Error placing bid: $error") + .show(context); + }); + }, // screenWidth: screenSize.width, - ), - ), + ), + ), + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/bidding_bar.dart b/FlutterCoinche/lib/ui/widget/bidding_bar.dart index 9312e24..a399c47 100644 --- a/FlutterCoinche/lib/ui/widget/bidding_bar.dart +++ b/FlutterCoinche/lib/ui/widget/bidding_bar.dart @@ -1,16 +1,18 @@ -import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/domain/dto/bid.dart'; import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/player_position.dart'; import 'package:FlutterCoinche/domain/extensions/bid_extension.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/resources/dimens.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class BiddingBar extends StatefulWidget { // final double screenWidth; @@ -175,89 +177,91 @@ class _BiddingBarState extends State { Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final portrait = MediaQuery.of(context).orientation == Orientation.portrait; - final bids = GameInherited.of(context, aspectType: Aspects.BIDS).game.bids; - final me = GameInherited.of(context, aspectType: Aspects.MY_POSITION) - .game - .myPosition; - final nextPlayer = - GameInherited.of(context, aspectType: Aspects.NEXT_PLAYER) - .game - .nextPlayer; - final enabledBid = nextPlayer == me; + return StateBuilder( + models: [RM.get()], + tag: [Aspects.BIDS, Aspects.MY_POSITION, Aspects.NEXT_PLAYER], + builder: (context, model) { + final bids = model.state.bids; + final me = model.state.myPosition; + final nextPlayer = model.state.nextPlayer; + final enabledBid = nextPlayer == me; - final canSurcoinche = bids?.canSurcoinche(me) ?? false; - final canCoinche = bids?.canCoinche(me) ?? false; - final lastBid = bids?.lastBidCapotGeneral(); - final minPoints = (bids?.lastWhere( - (element) => element is SimpleBid, - orElse: () => SimpleBid(points: 70), - ) as SimpleBid) - .points + - 10; - assert(!(canSurcoinche && canCoinche)); - return Container( - padding: const EdgeInsets.only(left: 2), - child: portrait - ? IntrinsicWidth( - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _coincheWidget( - canCoinche: canCoinche, - lastSimpleBid: lastBid, - me: me), - _surcoincheWidget( - canSurcoinche: canSurcoinche, - lastSimpleBid: lastBid, - me: me), - _passWidget(me: me, enabledBid: enabledBid) - ], - ), - SizedBox( - height: isLargeScreen(screenSize) ? 10 : 5, - ), - _mainWidget(screenSize, - me: me, minPoints: minPoints, enabledBid: enabledBid) - ], - ), - ) - : Row( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - _mainWidget(screenSize, - me: me, minPoints: minPoints, enabledBid: enabledBid), - SizedBox( - width: isLargeScreen(screenSize) ? 20 : 10, - ), - IntrinsicWidth( + final canSurcoinche = bids?.canSurcoinche(me) ?? false; + final canCoinche = bids?.canCoinche(me) ?? false; + final lastBid = bids?.lastBidCapotGeneral(); + final minPoints = (bids?.lastWhere( + (element) => element is SimpleBid, + orElse: () => SimpleBid(points: 70), + ) as SimpleBid) + .points + + 10; + assert(!(canSurcoinche && canCoinche)); + + return Container( + padding: const EdgeInsets.only(left: 2), + child: portrait + ? IntrinsicWidth( child: Column( - mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - _coincheWidget( - canCoinche: canCoinche, - lastSimpleBid: lastBid, - me: me), - _surcoincheWidget( - canSurcoinche: canSurcoinche, - lastSimpleBid: lastBid, - me: me), - _passWidget(me: me, enabledBid: enabledBid), + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _coincheWidget( + canCoinche: canCoinche, + lastSimpleBid: lastBid, + me: me), + _surcoincheWidget( + canSurcoinche: canSurcoinche, + lastSimpleBid: lastBid, + me: me), + _passWidget(me: me, enabledBid: enabledBid) + ], + ), + SizedBox( + height: isLargeScreen(screenSize) ? 10 : 5, + ), + _mainWidget(screenSize, + me: me, minPoints: minPoints, enabledBid: enabledBid) ], ), + ) + : Row( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + _mainWidget(screenSize, + me: me, minPoints: minPoints, enabledBid: enabledBid), + SizedBox( + width: isLargeScreen(screenSize) ? 20 : 10, + ), + IntrinsicWidth( + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _coincheWidget( + canCoinche: canCoinche, + lastSimpleBid: lastBid, + me: me), + _surcoincheWidget( + canSurcoinche: canSurcoinche, + lastSimpleBid: lastBid, + me: me), + _passWidget(me: me, enabledBid: enabledBid), + ], + ), + ), + ], ), - ], - ), + ); + }, ); } diff --git a/FlutterCoinche/lib/ui/widget/bids_widget.dart b/FlutterCoinche/lib/ui/widget/bids_widget.dart index bd7e94c..f1a6552 100644 --- a/FlutterCoinche/lib/ui/widget/bids_widget.dart +++ b/FlutterCoinche/lib/ui/widget/bids_widget.dart @@ -1,10 +1,13 @@ +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/domain/logic/calculus.dart'; import 'package:FlutterCoinche/ui/resources/colors.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:bubble/bubble.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class BidsWidget extends StatelessWidget { final AxisDirection posTable; @@ -19,63 +22,66 @@ class BidsWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final me = GameInherited.of(context, aspectType: Aspects.MY_POSITION) - .game - .myPosition; - final PlayerPosition cardinalPosition = getPosTableToCardinal(me)[posTable]; - final theBids = GameInherited.of(context, aspectType: Aspects.BIDS) - .game - .bids - ?.where((element) => element.position == cardinalPosition) ?? - []; - final state = - GameInherited.of(context, aspectType: Aspects.STATE).game.state; - final mapToColor = - GameInherited.of(context, aspectType: Aspects.COLORS).map; - if (state != TableState.BIDDING || theBids.isEmpty) return SizedBox(); - Alignment alignment; - BubbleNip bubbleNip; - double dx = 0, dy = 0; - switch (posTable) { - case AxisDirection.up: - alignment = Alignment.topCenter; - bubbleNip = BubbleNip.leftTop; - dx = widthAvatar; - dy = 2; - break; - case AxisDirection.right: - alignment = Alignment.centerRight; - bubbleNip = BubbleNip.rightTop; - dx = -widthAvatar; - break; - case AxisDirection.down: - alignment = Alignment.bottomRight; - bubbleNip = BubbleNip.no; - dy = -heightAvatar; - break; - case AxisDirection.left: - alignment = Alignment.centerLeft; - bubbleNip = BubbleNip.leftTop; - dx = widthAvatar; - break; - } + return StateBuilder( + tag: [Aspects.MY_POSITION, Aspects.BIDS, Aspects.STATE], + models: [RM.get()], + builder: (context, model) { + final me = model.state.myPosition; + final PlayerPosition cardinalPosition = + getPosTableToCardinal(me)[posTable]; + final theBids = model.state.bids + ?.where((element) => element.position == cardinalPosition) ?? + []; + final state = model.state.state; + final mapToColor = RM.get().state.value; + if (state != TableState.BIDDING || theBids.isEmpty) return SizedBox(); + Alignment alignment; + BubbleNip bubbleNip; + double dx = 0, dy = 0; + switch (posTable) { + case AxisDirection.up: + alignment = Alignment.topCenter; + bubbleNip = BubbleNip.leftTop; + dx = widthAvatar; + dy = 2; + break; + case AxisDirection.right: + alignment = Alignment.centerRight; + bubbleNip = BubbleNip.rightTop; + dx = -widthAvatar; + break; + case AxisDirection.down: + alignment = Alignment.bottomRight; + bubbleNip = BubbleNip.no; + dy = -heightAvatar; + break; + case AxisDirection.left: + alignment = Alignment.centerLeft; + bubbleNip = BubbleNip.leftTop; + dx = widthAvatar; + break; + } - Map cardinalToPosTable = getCardinalToPosTable(me) - .map((key, value) => MapEntry(key, mapToColor[value].item1)); - return Transform.translate( - offset: Offset(dx, dy), - child: Bubble( - color: colorLightBlue, - child: Column( - mainAxisSize: MainAxisSize.min, - children: theBids - .map((e) => e.getReadableBidRow(12, 7, cardinalToPosTable, displayBy: false)) - .toList(), - ), - alignment: alignment, - nip: bubbleNip, - elevation: 4, - ), + Map cardinalToPosTable = + getCardinalToPosTable(me) + .map((key, value) => MapEntry(key, mapToColor[value].item1)); + return Transform.translate( + offset: Offset(dx, dy), + child: Bubble( + color: colorLightBlue, + child: Column( + mainAxisSize: MainAxisSize.min, + children: theBids + .map((e) => e.getReadableBidRow(12, 7, cardinalToPosTable, + displayBy: false)) + .toList(), + ), + alignment: alignment, + nip: bubbleNip, + elevation: 4, + ), + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/button_last_trick.dart b/FlutterCoinche/lib/ui/widget/button_last_trick.dart index 48c5ada..42359e7 100644 --- a/FlutterCoinche/lib/ui/widget/button_last_trick.dart +++ b/FlutterCoinche/lib/ui/widget/button_last_trick.dart @@ -1,90 +1,100 @@ import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/domain/logic/calculus.dart'; import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/widget/card_widget.dart'; import 'package:FlutterCoinche/ui/widget/dot_player.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class ButtonLastTrick extends StatelessWidget { const ButtonLastTrick({Key key}) : super(key: key); @override Widget build(BuildContext context) { - final game = GameInherited.of(context, aspectType: Aspects.LAST_TRICK).game; - final state = - GameInherited.of(context, aspectType: Aspects.STATE).game.state; - final me = GameInherited.of(context, aspectType: Aspects.MY_POSITION) - .game - .myPosition; - final cardinalToPosTable = getCardinalToPosTable(me); - final mapColor = GameInherited.of(context, aspectType: Aspects.COLORS) - .map - .map((key, value) => MapEntry(key, value.item1)); - final List lastTrick = game.lastTrick; - final winner = game.winnerLastTrick; - return Visibility( - visible: state == TableState.PLAYING && winner != null, - child: Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: NeumorphicWidget( - onTap: () { - showDialog( - context: context, - builder: (context) { - return Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: DotPlayer( - dotSize: 20, - color: mapColor[cardinalToPosTable[winner]], - ), - ), - Row( + return StateBuilder( + models: [RM.get()], + tag: [Aspects.LAST_TRICK, Aspects.STATE, Aspects.MY_POSITION], + builder: (context, model) { + final game = model.state; + final state = game.state; + final me = game.myPosition; + final cardinalToPosTable = getCardinalToPosTable(me); + final mapColor = RM + .get() + .state + .value + .map((key, value) => MapEntry(key, value.item1)); + final List lastTrick = game.lastTrick; + final winner = game.winnerLastTrick; + + return Visibility( + visible: state == TableState.PLAYING && winner != null, + child: Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: NeumorphicWidget( + onTap: () { + showDialog( + context: context, + builder: (context) { + return Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, - children: lastTrick - .map((e) => Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(10), - color: mapColor[ - cardinalToPosTable[e.position]], - ), - padding: EdgeInsets.all(8), - child: CardWidget( - card: CardModel( - color: e.card.color, - value: e.card.value, - playable: null), - width: 40, - height: 60)), - )) - .toList(), - ), - ]); + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: DotPlayer( + dotSize: 20, + color: mapColor[cardinalToPosTable[winner]], + ), + ), + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: lastTrick + .map((e) => Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(10), + color: mapColor[ + cardinalToPosTable[ + e.position]], + ), + padding: EdgeInsets.all(8), + child: CardWidget( + card: CardModel( + color: e.card.color, + value: e.card.value, + playable: null), + width: 40, + height: 60)), + )) + .toList(), + ), + ]); + }, + ); }, - ); - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), - child: Text( - "Last Trick", - style: TextStyle(color: colorTextDark), - )), - sizeShadow: SizeShadow.SMALL, - borderRadius: 10, - interactable: true), - ), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + child: Text( + "Last Trick", + style: TextStyle(color: colorTextDark), + )), + sizeShadow: SizeShadow.SMALL, + borderRadius: 10, + interactable: true), + ), + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/cards_hand_widget.dart b/FlutterCoinche/lib/ui/widget/cards_hand_widget.dart index 2fc3ec0..2958d2f 100644 --- a/FlutterCoinche/lib/ui/widget/cards_hand_widget.dart +++ b/FlutterCoinche/lib/ui/widget/cards_hand_widget.dart @@ -1,7 +1,9 @@ +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/ui/widget/card_widget.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class CardsInHandWidget extends StatelessWidget { final double cardHeight, cardWidth, screenWidth; @@ -17,86 +19,91 @@ class CardsInHandWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final cards = - GameInherited.of(context, aspectType: Aspects.CARDS).game.cards; - final me = GameInherited.of(context, aspectType: Aspects.MY_POSITION) - .game - .myPosition; - final nextPlayer = - GameInherited.of(context, aspectType: Aspects.NEXT_PLAYER) - .game - .nextPlayer; - final myTurn = me == nextPlayer; - final inPlayMode = - GameInherited.of(context, aspectType: Aspects.STATE).game.state == - TableState.PLAYING; - return Container( + return StateBuilder( + models: [RM.get()], + tag: [ + Aspects.CARDS, + Aspects.MY_POSITION, + Aspects.NEXT_PLAYER, + Aspects.STATE + ], + builder: (context, model) { + final cards = model.state.cards; + final me = model.state.myPosition; + final nextPlayer = model.state.nextPlayer; + final myTurn = me == nextPlayer; + final inPlayMode = model.state.state == TableState.PLAYING; + return Container( // color: colorLightBlue, // padding: EdgeInsets.all(20), - height: cardHeight + paddingVertical * 2, - width: screenWidth, - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: cards.length, - itemBuilder: (context, index) { - final card = cards[index]; - return Padding( - padding: EdgeInsets.symmetric( - vertical: paddingVertical, horizontal: 4), - child: Draggable( - maxSimultaneousDrags: - inPlayMode && myTurn && card.playable != null ? 1 : 0, + height: cardHeight + paddingVertical * 2, + width: screenWidth, + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: cards.length, + itemBuilder: (context, index) { + final card = cards[index]; + return Padding( + padding: EdgeInsets.symmetric( + vertical: paddingVertical, horizontal: 4), + child: Draggable( + maxSimultaneousDrags: + inPlayMode && myTurn && card.playable != null + ? 1 + : 0, // hapticFeedbackOnStart: true, - data: card, - childWhenDragging: Container( - constraints: - BoxConstraints.tight(Size(cardWidth, cardHeight)), - decoration: BoxDecoration( - color: Colors.transparent, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.grey[800], - offset: Offset(1, 1), - blurRadius: 4, - spreadRadius: 1), - BoxShadow( - color: Colors.grey[600], - offset: Offset(-3, -3), - blurRadius: 0, - spreadRadius: 2) - ]), - ), - feedback: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - boxShadow: [ - BoxShadow( - color: Colors.white, - spreadRadius: 2, - blurRadius: 2, - ) - ], + data: card, + childWhenDragging: Container( + constraints: + BoxConstraints.tight(Size(cardWidth, cardHeight)), + decoration: BoxDecoration( + color: Colors.transparent, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.grey[800], + offset: Offset(1, 1), + blurRadius: 4, + spreadRadius: 1), + BoxShadow( + color: Colors.grey[600], + offset: Offset(-3, -3), + blurRadius: 0, + spreadRadius: 2) + ]), + ), + feedback: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.white, + spreadRadius: 2, + blurRadius: 2, + ) + ], // color: Colors.white, - ), - child: Padding( - padding: const EdgeInsets.all(5.0), + ), + child: Padding( + padding: const EdgeInsets.all(5.0), + child: CardWidget( + height: cardHeight, + width: cardWidth, + card: cards[index], + displayPlayable: inPlayMode && myTurn, + ), + ), + ), child: CardWidget( - height: cardHeight, width: cardWidth, + height: cardHeight, card: cards[index], displayPlayable: inPlayMode && myTurn, - ), - ), - ), - child: CardWidget( - width: cardWidth, - height: cardHeight, - card: cards[index], - displayPlayable: inPlayMode && myTurn, - )), - ); - })); + )), + ); + })); + }, + ); } } diff --git a/FlutterCoinche/lib/ui/widget/landscape/landscape_score_widget.dart b/FlutterCoinche/lib/ui/widget/landscape/landscape_score_widget.dart index f93baac..2c8142a 100644 --- a/FlutterCoinche/lib/ui/widget/landscape/landscape_score_widget.dart +++ b/FlutterCoinche/lib/ui/widget/landscape/landscape_score_widget.dart @@ -1,10 +1,12 @@ import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/ui/resources/colors.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:FlutterCoinche/ui/widget/only_score.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class LandscapeScoreWidget extends StatelessWidget { final Function onTapExit, onTapMessages; @@ -14,76 +16,81 @@ class LandscapeScoreWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final state = - GameInherited.of(context, aspectType: Aspects.STATE).game.state; - final Bid currentBidGame = - GameInherited.of(context, aspectType: Aspects.CURRENT_BID) - .game - .currentBid; - final Bid currentBid = state != TableState.PLAYING ? null : currentBidGame; - const iconSize = 20.0; const paddingButton = 8.0; const distanceButtons = 10.0; const topBottomButtons = 4.0; - const minWidth = - paddingButton * 2 + iconSize * 2 + distanceButtons + topBottomButtons * 2; - return IntrinsicHeight( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.only( - bottom: topBottomButtons, - top: topBottomButtons, - left: 4, - right: 4), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - NeumorphicWidget( - onTap: onTapExit, - sizeShadow: SizeShadow.SMALL, - child: Padding( - padding: const EdgeInsets.all(paddingButton), - child: Icon( - Icons.exit_to_app, - size: iconSize, - color: colorTextDark, + const minWidth = paddingButton * 2 + + iconSize * 2 + + distanceButtons + + topBottomButtons * 2; + return StateBuilder( + models: [RM.get()], + tag: [Aspects.STATE, Aspects.CURRENT_BID], + builder: (context, model) { + final state = model.state.state; + final Bid currentBidGame = model.state.currentBid; + final Bid currentBid = + state != TableState.PLAYING ? null : currentBidGame; + + return IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.only( + bottom: topBottomButtons, + top: topBottomButtons, + left: 4, + right: 4), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + NeumorphicWidget( + onTap: onTapExit, + sizeShadow: SizeShadow.SMALL, + child: Padding( + padding: const EdgeInsets.all(paddingButton), + child: Icon( + Icons.exit_to_app, + size: iconSize, + color: colorTextDark, + ), + ), ), - ), + SizedBox( + height: distanceButtons, + ), + NeumorphicWidget( + onTap: onTapMessages, + sizeShadow: SizeShadow.SMALL, + child: Padding( + padding: const EdgeInsets.all(paddingButton), + child: Icon( + Icons.message, + size: iconSize, + color: colorTextDark, + ), + ), + ) + ], ), - SizedBox( - height: distanceButtons, + ), + Padding( + padding: const EdgeInsets.only( + left: 4.0, right: 4, top: 4, bottom: 4), + child: OnlyScoreWidget( + currentBid: currentBid, + minWidth: minWidth, ), - NeumorphicWidget( - onTap: onTapMessages, - sizeShadow: SizeShadow.SMALL, - child: Padding( - padding: const EdgeInsets.all(paddingButton), - child: Icon( - Icons.message, - size: iconSize, - color: colorTextDark, - ), - ), - ) - ], - ), + ) + ], ), - Padding( - padding: - const EdgeInsets.only(left: 4.0, right: 4, top: 4, bottom: 4), - child: OnlyScoreWidget( - currentBid: currentBid, - minWidth: minWidth, - ), - ) - ], - ), + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/middle_area.dart b/FlutterCoinche/lib/ui/widget/middle_area.dart index 1be99ed..4151049 100644 --- a/FlutterCoinche/lib/ui/widget/middle_area.dart +++ b/FlutterCoinche/lib/ui/widget/middle_area.dart @@ -1,14 +1,16 @@ -import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/domain/dto/card.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/domain/logic/calculus.dart'; import 'package:FlutterCoinche/service/network/server_communication.dart'; +import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/ui/resources/dimens.dart'; import 'package:FlutterCoinche/ui/widget/card_widget.dart'; import 'package:FlutterCoinche/ui/widget/cards_on_table.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class MiddleArea extends StatelessWidget { final double cardWidth, cardHeight; @@ -22,96 +24,100 @@ class MiddleArea extends StatelessWidget { @override Widget build(BuildContext context) { - final state = - GameInherited.of(context, aspectType: Aspects.STATE).game.state; - final id = GameInherited.of(context, aspectType: Aspects.ID).game.id; - final myPosition = - GameInherited.of(context, aspectType: Aspects.MY_POSITION) - .game - .myPosition; - final posTableToCardinal = getPosTableToCardinal(myPosition); - final onTable = - GameInherited.of(context, aspectType: Aspects.ON_TABLE).game.onTable; - final nextPlayer = - GameInherited.of(context, aspectType: Aspects.NEXT_PLAYER) - .game - .nextPlayer; - return Stack( - children: [ - CardsOnTable( - state: state, - cardsOnTable: onTable, - posTableToCardinal: posTableToCardinal, - minPadding: 2, - ), - Center( - child: DragTarget( - onWillAccept: (data) { - // if it is my turn and the card is playable - return myPosition == nextPlayer && - data.playable != null && - data.playable; - }, - onAccept: (data) { - return ServerCommunication.playCard(data, id).then((void _) {}, - onError: (error) { - BlocProvider.of(context).playError(); - return FlushbarHelper.createError( - message: "Error: ${error["message"]}", - duration: Duration(seconds: 5)) - .show(context); - }); - }, - builder: (context, candidateData, rejectedData) { - if (candidateData.isNotEmpty) { - return SizedBox.expand( - child: Center( - child: Transform.translate( - offset: Offset(0, cardHeight * 2 / 2), - child: Container( - width: cardWidth, - height: cardHeight, - child: CardWidget( - displayPlayable: false, - card: candidateData.last, - height: cardHeight, - width: cardWidth, + return StateBuilder( + models: [RM.get()], + tag: [ + Aspects.STATE, + Aspects.ID, + Aspects.MY_POSITION, + Aspects.ON_TABLE, + Aspects.NEXT_PLAYER + ], + builder: (context, model) { + final state = model.state.state; + final id = model.state.id; + final myPosition = model.state.myPosition; + final posTableToCardinal = getPosTableToCardinal(myPosition); + final onTable = model.state.onTable; + final nextPlayer = model.state.nextPlayer; + return Stack( + children: [ + CardsOnTable( + state: state, + cardsOnTable: onTable, + posTableToCardinal: posTableToCardinal, + minPadding: 2, + ), + Center( + child: DragTarget( + onWillAccept: (data) { + // if it is my turn and the card is playable + return myPosition == nextPlayer && + data.playable != null && + data.playable; + }, + onAccept: (data) { + return ServerCommunication.playCard(data, id) + .then((void _) {}, onError: (error) { + BlocProvider.of(context).playError(); + return FlushbarHelper.createError( + message: "Error: ${error["message"]}", + duration: Duration(seconds: 5)) + .show(context); + }); + }, + builder: (context, candidateData, rejectedData) { + if (candidateData.isNotEmpty) { + return SizedBox.expand( + child: Center( + child: Transform.translate( + offset: Offset(0, cardHeight * 2 / 2), + child: Container( + width: cardWidth, + height: cardHeight, + child: CardWidget( + displayPlayable: false, + card: candidateData.last, + height: cardHeight, + width: cardWidth, + ), + ), ), ), - ), - ), - ); - } - if (rejectedData.isNotEmpty) { - return SizedBox.expand( - child: Center( - child: Transform.translate( - offset: Offset(0, cardHeight * 2 / 2), - child: Container( - decoration: BoxDecoration( - color: Colors.red[900], - borderRadius: BorderRadius.circular( - isLargeScreen(screenSize) ? 20 : 10), - ), - width: cardWidth, - height: cardHeight, - child: Center( - child: Icon( - Icons.do_not_disturb_alt, - color: Colors.white, - size: cardWidth * 9 / 10, + ); + } + if (rejectedData.isNotEmpty) { + return SizedBox.expand( + child: Center( + child: Transform.translate( + offset: Offset(0, cardHeight * 2 / 2), + child: Container( + decoration: BoxDecoration( + color: Colors.red[900], + borderRadius: BorderRadius.circular( + isLargeScreen(screenSize) ? 20 : 10), + ), + width: cardWidth, + height: cardHeight, + child: Center( + child: Icon( + Icons.do_not_disturb_alt, + color: Colors.white, + size: cardWidth * 9 / 10, + ), + ), ), ), ), - ), - ), - ); - } - return SizedBox.expand(child: Container()); - }, - ), - ), - ], + ); + } + return SizedBox.expand(child: Container()); + }, + ), + ), + ], + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/only_score.dart b/FlutterCoinche/lib/ui/widget/only_score.dart index f2b4b49..ba0de70 100644 --- a/FlutterCoinche/lib/ui/widget/only_score.dart +++ b/FlutterCoinche/lib/ui/widget/only_score.dart @@ -1,13 +1,17 @@ import 'package:FlutterCoinche/domain/dto/bid.dart'; -import 'package:FlutterCoinche/domain/dto/player_position.dart' show PlayerPosition; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/dto/player_position.dart' + show PlayerPosition; +import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; import 'package:FlutterCoinche/domain/dto/score.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/domain/logic/calculus.dart'; import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/widget/dot_player.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class OnlyScoreWidget extends StatelessWidget { final Bid currentBid; @@ -25,84 +29,89 @@ class OnlyScoreWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final Score score = - GameInherited.of(context, aspectType: Aspects.SCORE).game.score; - final Map mapColor = - GameInherited.of(context, aspectType: Aspects.COLORS) - .map - .map((key, value) => MapEntry(key, value.item1)); - Map playerPosToColor = - getCardinalToPosTable( - GameInherited.of(context, aspectType: Aspects.MY_POSITION) - .game - .myPosition).map((key, value) => MapEntry(key, mapColor[value])); + final Map mapColor = RM + .get() + .state + .value + .map((key, value) => MapEntry(key, value.item1)); const textSize = 14.0; const dotSize = 7.0; - return NeumorphicNoStateWidget( - borderRadius: 10, - sizeShadow: SizeShadow.SMALL, - pressed: false, - child: Padding( - padding: const EdgeInsets.all(8), - child: IntrinsicWidth( - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - SizedBox( - width: minWidth, - ), - if (currentBid != null) - currentBid.getReadableBidRow(textSize, dotSize, playerPosToColor), - if (currentBid != null) - Padding( - padding: const EdgeInsets.only(top: 4.0, bottom: 4), - child: Container( - color: colorText, - height: 1, - ), - ), - Table( - defaultVerticalAlignment: TableCellVerticalAlignment.middle, - columnWidths: {2: FractionColumnWidth(0.55)}, + return StateBuilder( + models: [RM.get()], + tag: [Aspects.SCORE, Aspects.MY_POSITION], + builder: (context, model) { + final Score score = model.state.score; + Map playerPosToColor = + getCardinalToPosTable(model.state.myPosition) + .map((key, value) => MapEntry(key, mapColor[value])); + return NeumorphicNoStateWidget( + borderRadius: 10, + sizeShadow: SizeShadow.SMALL, + pressed: false, + child: Padding( + padding: const EdgeInsets.all(8), + child: IntrinsicWidth( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - TableRow(children: [ - DotPlayer( - dotSize: dotSize, - color: playerPosToColor[PlayerPosition.NORTH], - ), - DotPlayer( - dotSize: dotSize, - color: playerPosToColor[PlayerPosition.SOUTH], - ), - Text( - score?.northSouth?.toString() ?? "", - textAlign: TextAlign.right, - style: - TextStyle(color: colorTextDark, fontSize: textSize), - ), - ]), - TableRow(children: [ - DotPlayer( - dotSize: dotSize, - color: playerPosToColor[PlayerPosition.EAST], - ), - DotPlayer( - dotSize: dotSize, - color: playerPosToColor[PlayerPosition.WEST], - ), - Text( - score?.eastWest?.toString() ?? "", - textAlign: TextAlign.right, - style: - TextStyle(color: colorTextDark, fontSize: textSize), + SizedBox( + width: minWidth, + ), + if (currentBid != null) + currentBid.getReadableBidRow( + textSize, dotSize, playerPosToColor), + if (currentBid != null) + Padding( + padding: const EdgeInsets.only(top: 4.0, bottom: 4), + child: Container( + color: colorText, + height: 1, + ), ), - ]) + Table( + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + columnWidths: {2: FractionColumnWidth(0.55)}, + children: [ + TableRow(children: [ + DotPlayer( + dotSize: dotSize, + color: playerPosToColor[PlayerPosition.NORTH], + ), + DotPlayer( + dotSize: dotSize, + color: playerPosToColor[PlayerPosition.SOUTH], + ), + Text( + score?.northSouth?.toString() ?? "", + textAlign: TextAlign.right, + style: TextStyle( + color: colorTextDark, fontSize: textSize), + ), + ]), + TableRow(children: [ + DotPlayer( + dotSize: dotSize, + color: playerPosToColor[PlayerPosition.EAST], + ), + DotPlayer( + dotSize: dotSize, + color: playerPosToColor[PlayerPosition.WEST], + ), + Text( + score?.eastWest?.toString() ?? "", + textAlign: TextAlign.right, + style: TextStyle( + color: colorTextDark, fontSize: textSize), + ), + ]) + ], + ) ], - ) - ], + ), + ), ), - ), - ), + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/player_avatar.dart b/FlutterCoinche/lib/ui/widget/player_avatar.dart index f64695e..9ee48fc 100644 --- a/FlutterCoinche/lib/ui/widget/player_avatar.dart +++ b/FlutterCoinche/lib/ui/widget/player_avatar.dart @@ -1,15 +1,18 @@ +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/player_position.dart'; +import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/domain/logic/calculus.dart'; -import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/inner_shadow.dart'; +import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/widget/dot_player.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class PlayerAvatar extends StatelessWidget { final AutoSizeGroup autoSizeGroup; @@ -26,100 +29,109 @@ class PlayerAvatar extends StatelessWidget { @override Widget build(BuildContext context) { - final PlayerPosition me = - GameInherited.of(context, aspectType: Aspects.MY_POSITION) - .game - .myPosition; - final map = getPosTableToCardinal(me); - final bool myTurn = - GameInherited.of(context, aspectType: Aspects.NEXT_PLAYER) - .game - .nextPlayer == - map[posTable]; - final nick = GameInherited.of(context, aspectType: Aspects.NICKNAMES) - .game - .nicknames - .fromPosition(map[posTable]); - final mapColorAvatar = - GameInherited.of(context, aspectType: Aspects.COLORS).map; - final color = mapColorAvatar[posTable].item1; - final avatar = mapColorAvatar[posTable].item2; final portrait = MediaQuery.of(context).orientation == Orientation.portrait; - return Container( - width: portrait ? width : 130, - height: portrait ? height : width, - child: NeumorphicNoStateWidget( - sizeShadow: SizeShadow.SMALL, - borderRadius: 2, - pressed: true, - child: Padding( - padding: - const EdgeInsets.only(top: 4.0, bottom: 4, left: 2, right: 2), - child: portrait - ? Stack(children: [ - Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - _RoundAvatar( - color: color, - pictureSvg: avatar, - ), - SizedBox( - height: 3, - ), - _BoxName( - autoSizeGroup: autoSizeGroup, - nick: nick, - color: color, - ) - ]), - Positioned( - right: 0, - top: 0, - child: AnimatedOpacity( - opacity: myTurn ? 1 : 0, - duration: Duration(milliseconds: 400), - child: DotPlayer( - color: color, - dotSize: 5, - ), - )) - ]) - : Stack( - children: [ - Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + var modelColor = RM.get(); + return StateBuilder( + models: [RM.get()], + tag: [ + Aspects.MY_POSITION, + Aspects.NEXT_PLAYER, + Aspects.NICKNAMES, + Aspects.COLORS + ], + builder: (context, model) { + if (model.hasError || model.state == null) return _empty(); + + final PlayerPosition me = model.state.myPosition; + final map = getPosTableToCardinal(me); + final bool myTurn = model.state.nextPlayer == map[posTable]; + final nick = model.state.nicknames.fromPosition(map[posTable]); + final mapColorAvatar = modelColor.state.value; + final color = mapColorAvatar[posTable].item1; + final avatar = mapColorAvatar[posTable].item2; + return Container( + width: portrait ? width : 130, + height: portrait ? height : width, + child: NeumorphicNoStateWidget( + sizeShadow: SizeShadow.SMALL, + borderRadius: 2, + pressed: true, + child: Padding( + padding: const EdgeInsets.only( + top: 4.0, bottom: 4, left: 2, right: 2), + child: portrait + ? Stack(children: [ + Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _RoundAvatar( + color: color, + pictureSvg: avatar, + ), + SizedBox( + height: 3, + ), + _BoxName( + autoSizeGroup: autoSizeGroup, + nick: nick, + color: color, + ) + ]), + Positioned( + right: 0, + top: 0, + child: AnimatedOpacity( + opacity: myTurn ? 1 : 0, + duration: Duration(milliseconds: 400), + child: DotPlayer( + color: color, + dotSize: 5, + ), + )) + ]) + : Stack( children: [ - _RoundAvatar(color: color, pictureSvg: avatar), - SizedBox( - width: 3, + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _RoundAvatar(color: color, pictureSvg: avatar), + SizedBox( + width: 3, + ), + _BoxName( + nick: nick, + autoSizeGroup: autoSizeGroup, + color: color), + ], ), - _BoxName( - nick: nick, - autoSizeGroup: autoSizeGroup, - color: color), + Positioned( + left: 0, + top: 0, + child: AnimatedOpacity( + opacity: myTurn ? 1 : 0, + duration: Duration( + milliseconds: 400, + ), + child: DotPlayer( + color: color, + dotSize: 5, + ), + )) ], - ), - Positioned( - left: 0, - top: 0, - child: AnimatedOpacity( - opacity: myTurn ? 1 : 0, - duration: Duration( - milliseconds: 400, - ), - child: DotPlayer( - color: color, - dotSize: 5, - ), - )) - ], - )), - ), + )), + ), + ); + }, + ); + } + + Widget _empty() { + return Center( + child: Text("empty"), ); } } diff --git a/FlutterCoinche/lib/ui/widget/portrait/portrait_score_widget.dart b/FlutterCoinche/lib/ui/widget/portrait/portrait_score_widget.dart index c9dabe7..2a08f1e 100644 --- a/FlutterCoinche/lib/ui/widget/portrait/portrait_score_widget.dart +++ b/FlutterCoinche/lib/ui/widget/portrait/portrait_score_widget.dart @@ -1,10 +1,12 @@ import 'package:FlutterCoinche/domain/dto/bid.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/table_state.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/ui/resources/colors.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:FlutterCoinche/ui/widget/only_score.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class PortraitScoreWidget extends StatelessWidget { final Function onTapExit, onTapMessages; @@ -16,73 +18,76 @@ class PortraitScoreWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final state = - GameInherited.of(context, aspectType: Aspects.STATE).game.state; - final Bid currentBidGame = - GameInherited.of(context, aspectType: Aspects.CURRENT_BID) - .game - .currentBid; - final Bid currentBid = state != TableState.PLAYING ? null : currentBidGame; - const iconSize = 20.0; const paddingButton = 8.0; const distanceButtons = 10.0; const leftRightButtons = 4.0; - return IntrinsicWidth( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Padding( - padding: const EdgeInsets.only( - bottom: 8.0, - top: 4, - left: leftRightButtons, - right: leftRightButtons), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - NeumorphicWidget( - onTap: onTapExit, - sizeShadow: SizeShadow.SMALL, - child: Padding( - padding: const EdgeInsets.all(paddingButton), - child: Icon( - Icons.exit_to_app, - size: iconSize, - color: colorTextDark, + return StateBuilder( + models: [RM.get()], + tag: [Aspects.STATE, Aspects.CURRENT_BID], + builder: (context, model) { + if (model.state == null || model.hasError) return Text("error"); + final state = model.state.state; + final Bid currentBidGame = model.state.currentBid; + final Bid currentBid = + state != TableState.PLAYING ? null : currentBidGame; + return IntrinsicWidth( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.only( + bottom: 8.0, + top: 4, + left: leftRightButtons, + right: leftRightButtons), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + NeumorphicWidget( + onTap: onTapExit, + sizeShadow: SizeShadow.SMALL, + child: Padding( + padding: const EdgeInsets.all(paddingButton), + child: Icon( + Icons.exit_to_app, + size: iconSize, + color: colorTextDark, + ), + ), + ), + SizedBox( + width: distanceButtons, ), - ), + NeumorphicWidget( + onTap: onTapMessages, + sizeShadow: SizeShadow.SMALL, + child: Padding( + padding: const EdgeInsets.all(paddingButton), + child: Icon( + Icons.message, + size: iconSize, + color: colorTextDark, + ), + ), + ) + ], ), - SizedBox( - width: distanceButtons, + ), + Padding( + padding: const EdgeInsets.only(left: 4.0, right: 4), + child: OnlyScoreWidget( + currentBid: currentBid, + minWidth: 0, ), - NeumorphicWidget( - onTap: onTapMessages, - sizeShadow: SizeShadow.SMALL, - child: Padding( - padding: const EdgeInsets.all(paddingButton), - child: Icon( - Icons.message, - size: iconSize, - color: colorTextDark, - ), - ), - ) - ], - ), + ) + ], ), - Padding( - padding: const EdgeInsets.only(left: 4.0, right: 4), - child: OnlyScoreWidget( - currentBid: currentBid, - minWidth: 0, - ), - ) - ], - ), + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/recap_widget.dart b/FlutterCoinche/lib/ui/widget/recap_widget.dart index eaf1c44..df0df28 100644 --- a/FlutterCoinche/lib/ui/widget/recap_widget.dart +++ b/FlutterCoinche/lib/ui/widget/recap_widget.dart @@ -1,29 +1,36 @@ -import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/domain/dto/game.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_container.dart'; import 'package:FlutterCoinche/ui/widget/neumorphic_no_state.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class RecapWidget extends StatelessWidget { - - const RecapWidget({Key key}) - : super(key: key); + const RecapWidget({Key key}) : super(key: key); @override Widget build(BuildContext context) { - final state = - GameInherited.of(context, aspectType: Aspects.STATE).game.state; - return NeumorphicNoStateWidget( - pressed: false, - borderRadius: 10, - sizeShadow: SizeShadow.MEDIUM, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - children: [ - Text("Phase: ${state.toString().split(".").last.toLowerCase()}"), - ], - ), - ), + return StateBuilder( + models: [RM.get()], + tag: [Aspects.STATE], + builder: (context, model) { + final state = model.state.state; + + return NeumorphicNoStateWidget( + pressed: false, + borderRadius: 10, + sizeShadow: SizeShadow.MEDIUM, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + "Phase: ${state.toString().split(".").last.toLowerCase()}"), + ], + ), + ), + ); + }, ); } } diff --git a/FlutterCoinche/lib/ui/widget/waiting_players.dart b/FlutterCoinche/lib/ui/widget/waiting_players.dart index baf0876..4c57ae6 100644 --- a/FlutterCoinche/lib/ui/widget/waiting_players.dart +++ b/FlutterCoinche/lib/ui/widget/waiting_players.dart @@ -1,30 +1,36 @@ +import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/table_state.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; +import 'package:FlutterCoinche/domain/extensions/game_extensions.dart'; import 'package:flutter/material.dart'; +import 'package:states_rebuilder/states_rebuilder.dart'; class WaitingPlayersWidget extends StatelessWidget { const WaitingPlayersWidget({Key key}) : super(key: key); @override Widget build(BuildContext context) { - final joining = - GameInherited.of(context, aspectType: Aspects.STATE).game.state == - TableState.JOINING; - return AnimatedOpacity( - opacity: joining ? 1 : 0, - duration: Duration(milliseconds: 400), - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text("Players are joining this game..."), - SizedBox( - height: 10, + return StateBuilder( + models: [RM.get()], + tag: [Aspects.STATE], + builder: (context, model) { + final joining = model.state.state == TableState.JOINING; + return AnimatedOpacity( + opacity: joining ? 1 : 0, + duration: Duration(milliseconds: 400), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text("Players are joining this game..."), + SizedBox( + height: 10, + ), + CircularProgressIndicator(), + ], ), - CircularProgressIndicator(), - ], - ), - ), + ), + ); + }, ); } } From d56e8023ef8875d449751c01aefc056a32961952 Mon Sep 17 00:00:00 2001 From: OroshiX Date: Thu, 7 May 2020 19:08:45 +0200 Subject: [PATCH 6/7] [Flutter] Init with correct values --- FlutterCoinche/lib/domain/dto/bid.dart | 2 +- FlutterCoinche/lib/domain/dto/card.dart | 2 +- FlutterCoinche/lib/domain/dto/game.dart | 16 ++-- FlutterCoinche/lib/domain/dto/nicknames.dart | 7 +- FlutterCoinche/lib/domain/dto/score.dart | 4 +- FlutterCoinche/lib/main.dart | 2 - FlutterCoinche/lib/state/game_inherited.dart | 64 ------------- FlutterCoinche/lib/ui/screen/game_screen.dart | 89 ------------------ .../lib/ui/screen/stated_game_screen.dart | 93 +------------------ FlutterCoinche/lib/ui/widget/bids_widget.dart | 2 +- .../lib/ui/widget/button_last_trick.dart | 3 +- FlutterCoinche/lib/ui/widget/only_score.dart | 3 +- .../lib/ui/widget/player_avatar.dart | 4 +- .../lib/ui/widget/table_widget.dart | 6 -- 14 files changed, 28 insertions(+), 269 deletions(-) delete mode 100644 FlutterCoinche/lib/state/game_inherited.dart delete mode 100644 FlutterCoinche/lib/ui/screen/game_screen.dart diff --git a/FlutterCoinche/lib/domain/dto/bid.dart b/FlutterCoinche/lib/domain/dto/bid.dart index 1575f18..3ba48c2 100644 --- a/FlutterCoinche/lib/domain/dto/bid.dart +++ b/FlutterCoinche/lib/domain/dto/bid.dart @@ -94,7 +94,7 @@ class Bid { readableValueBid(), style: TextStyle(fontSize: fontSize, color: colorTextDark), ), - Image.asset( + if(this is! Pass) Image.asset( getAssetImageFromColor(cardColor()), width: fontSize, ), diff --git a/FlutterCoinche/lib/domain/dto/card.dart b/FlutterCoinche/lib/domain/dto/card.dart index 08a4a47..e6b31a3 100644 --- a/FlutterCoinche/lib/domain/dto/card.dart +++ b/FlutterCoinche/lib/domain/dto/card.dart @@ -126,7 +126,7 @@ class CardPlayed extends Equatable { } String getAssetImageFromColor(CardColor e) { - var file = ""; + var file = "heart.png"; switch (e) { case CardColor.DIAMOND: file = "diamond.png"; diff --git a/FlutterCoinche/lib/domain/dto/game.dart b/FlutterCoinche/lib/domain/dto/game.dart index df2c6f5..9c05d14 100644 --- a/FlutterCoinche/lib/domain/dto/game.dart +++ b/FlutterCoinche/lib/domain/dto/game.dart @@ -27,17 +27,17 @@ class Game extends Equatable { Game( {this.id, - this.nicknames, - this.cards, - this.onTable, - this.state, - this.nextPlayer, - this.myPosition, + this.nicknames = const Nicknames(), + this.cards = const [], + this.onTable = const [], + this.state = TableState.JOINING, + this.nextPlayer = PlayerPosition.NORTH, + this.myPosition = PlayerPosition.NORTH, this.bids = const [], this.currentBid, - this.score, + this.score = const Score(), this.winnerLastTrick, - this.lastTrick}); + this.lastTrick = const []}); factory Game.fromJson(Map json) => _$GameFromJson(json); diff --git a/FlutterCoinche/lib/domain/dto/nicknames.dart b/FlutterCoinche/lib/domain/dto/nicknames.dart index 49ba8c4..a014216 100644 --- a/FlutterCoinche/lib/domain/dto/nicknames.dart +++ b/FlutterCoinche/lib/domain/dto/nicknames.dart @@ -15,7 +15,12 @@ class Nicknames extends Equatable { @JsonKey(name: "WEST") final String west; - Nicknames({this.north, this.south, this.east, this.west}); + const Nicknames({ + this.north = "", + this.south = "", + this.east = "", + this.west = "", + }); factory Nicknames.fromJson(Map json) => _$NicknamesFromJson(json); diff --git a/FlutterCoinche/lib/domain/dto/score.dart b/FlutterCoinche/lib/domain/dto/score.dart index 39c2d73..2f21907 100644 --- a/FlutterCoinche/lib/domain/dto/score.dart +++ b/FlutterCoinche/lib/domain/dto/score.dart @@ -4,11 +4,11 @@ import 'package:json_annotation/json_annotation.dart'; part 'score.g.dart'; @JsonSerializable(explicitToJson: true) -class Score extends Equatable{ +class Score extends Equatable { final int northSouth; final int eastWest; - Score({this.northSouth, this.eastWest}); + const Score({this.northSouth = 0, this.eastWest = 0}); factory Score.fromJson(Map json) => _$ScoreFromJson(json); diff --git a/FlutterCoinche/lib/main.dart b/FlutterCoinche/lib/main.dart index e36b578..2c70a11 100644 --- a/FlutterCoinche/lib/main.dart +++ b/FlutterCoinche/lib/main.dart @@ -1,7 +1,6 @@ import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/ui/screen/stated_game_screen.dart'; import 'package:FlutterCoinche/ui/screen/all_games_screen.dart'; -import 'package:FlutterCoinche/ui/screen/game_screen.dart'; import 'package:FlutterCoinche/ui/screen/lobby_screen.dart'; import 'package:FlutterCoinche/ui/screen/login_screen.dart'; import 'package:bloc_provider/bloc_provider.dart'; @@ -35,7 +34,6 @@ class MyApp extends StatelessWidget { routes: { LoginScreen.routeName: (context) => LoginScreen(), AllGamesScreen.routeName: (context) => AllGamesScreen(), - GameScreen.routeName: (context) => GameScreen(), StatedGameScreen.routeName: (context) => StatedGameScreen(), LobbyScreen.routeName: (context) => LobbyScreen(), }, diff --git a/FlutterCoinche/lib/state/game_inherited.dart b/FlutterCoinche/lib/state/game_inherited.dart deleted file mode 100644 index 984eb29..0000000 --- a/FlutterCoinche/lib/state/game_inherited.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:FlutterCoinche/domain/dto/game.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:tuple/tuple.dart'; - -class GameInherited extends InheritedModel { - final Game game; - final Map> map; - - const GameInherited( - {@required this.game, @required this.map, @required Widget child}) - : super(child: child); - - @override - bool updateShouldNotify(GameInherited old) { - print("changed: ${old.game} -> $game NO ASPECTS"); - return game != old.game || !mapEquals(map, old.map); - } - - @override - bool updateShouldNotifyDependent(GameInherited old, Set aspects) { - final res = (aspects.contains(Aspects.ID) && old.game.id != game.id) || - (aspects.contains(Aspects.CARDS) && old.game.cards != game.cards) || - (aspects.contains(Aspects.SCORE) && old.game.score != game.score) || - (aspects.contains(Aspects.STATE) && old.game.state != game.state) || - (aspects.contains(Aspects.BIDS) && old.game.bids != game.bids) || - (aspects.contains(Aspects.NICKNAMES) && - old.game.nicknames != game.nicknames) || - (aspects.contains(Aspects.ON_TABLE) && - !listEquals(old.game.onTable, game.onTable)) || - (aspects.contains(Aspects.NEXT_PLAYER) && - old.game.nextPlayer != game.nextPlayer) || - (aspects.contains(Aspects.MY_POSITION) && - old.game.myPosition != game.myPosition) || - (aspects.contains(Aspects.LAST_TRICK) && - (old.game.lastTrick != game.lastTrick || - old.game.winnerLastTrick != game.winnerLastTrick)) || - (aspects.contains(Aspects.CURRENT_BID) && - old.game.currentBid != game.currentBid) || - (aspects.contains(Aspects.COLORS) && !mapEquals(old.map, map)); - print("-> ${res ? "================\n\nchanged: ${old.game} -> $game [aspects: $aspects]" : "same"}"); - return res; - } - - static GameInherited of(BuildContext context, {Aspects aspectType}) { - return InheritedModel.inheritFrom(context, - aspect: aspectType); - } -} - -enum Aspects { - ID, - CARDS, - STATE, - BIDS, - SCORE, - NICKNAMES, - ON_TABLE, - NEXT_PLAYER, - MY_POSITION, - CURRENT_BID, - LAST_TRICK, - COLORS, -} diff --git a/FlutterCoinche/lib/ui/screen/game_screen.dart b/FlutterCoinche/lib/ui/screen/game_screen.dart deleted file mode 100644 index 7b2957c..0000000 --- a/FlutterCoinche/lib/ui/screen/game_screen.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:FlutterCoinche/domain/dto/card.dart'; -import 'package:FlutterCoinche/domain/dto/game.dart'; -import 'package:FlutterCoinche/domain/dto/player_position.dart'; -import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; -import 'package:FlutterCoinche/state/game_inherited.dart'; -import 'package:FlutterCoinche/state/games_bloc.dart'; -import 'package:FlutterCoinche/ui/resources/colors.dart'; -import 'package:FlutterCoinche/ui/widget/table_widget.dart'; -import 'package:bloc_provider/bloc_provider.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -class GameScreen extends StatefulWidget { - static const routeName = "/game"; - - @override - _GameScreenState createState() => _GameScreenState(); -} - -class _GameScreenState extends State { - List myCards; - GamesBloc gamesBloc; - - @override - void initState() { - super.initState(); - gamesBloc = BlocProvider.of(context); - myCards = []; - } - - Future _quit() { - return showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text("Exit game?"), - actions: [ - FlatButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text("No, stay here")), - FlatButton( - onPressed: () { - Navigator.of(context).pop(true); - SystemChrome.restoreSystemUIOverlays(); - }, - child: Text("Yes, exit!")) - ], - ), - ); - } - - @override - Widget build(BuildContext context) { - SystemChrome.setEnabledSystemUIOverlays([]); - return Material( - child: WillPopScope( - onWillPop: () async { - return (await _quit()) ?? false; - }, - child: Container( - color: colorLightBlue, - child: FutureBuilder( - future: getPosTableToColors(), - builder: (ctx, snapshotMap) => StreamBuilder( - stream: gamesBloc.game, - builder: (context, snapshot) { - if (snapshot.hasError) { - return Center( - child: Text("Error: ${snapshot.error}"), - ); - } - if (!snapshot.hasData) { - return Center( - child: Text("No data"), - ); - } - return GameInherited( - game: snapshot.data, - map: snapshotMap.data.value, - child: TableWidget( - quit: _quit, - ), - ); - }), - ), - ), - ), - ); - } -} diff --git a/FlutterCoinche/lib/ui/screen/stated_game_screen.dart b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart index fdd3d56..d54d6e3 100644 --- a/FlutterCoinche/lib/ui/screen/stated_game_screen.dart +++ b/FlutterCoinche/lib/ui/screen/stated_game_screen.dart @@ -1,5 +1,3 @@ -import 'package:FlutterCoinche/domain/dto/bid.dart'; -import 'package:FlutterCoinche/domain/dto/card.dart'; import 'package:FlutterCoinche/domain/dto/game.dart'; import 'package:FlutterCoinche/domain/dto/player_position.dart'; import 'package:FlutterCoinche/domain/dto/pos_table_to_colors.dart'; @@ -8,7 +6,6 @@ import 'package:FlutterCoinche/state/games_bloc.dart'; import 'package:FlutterCoinche/ui/resources/colors.dart'; import 'package:FlutterCoinche/ui/widget/table_widget.dart'; import 'package:bloc_provider/bloc_provider.dart'; -import 'package:flushbar/flushbar_helper.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -19,6 +16,7 @@ class StatedGameScreen extends StatelessWidget { @override Widget build(BuildContext context) { + SystemChrome.setEnabledSystemUIOverlays([]); return Material( child: WillPopScope( onWillPop: () async { @@ -39,23 +37,19 @@ class StatedGameScreen extends StatelessWidget { Inject.future(() => getPosTableToColors()) ], builder: (_) => StateBuilder( - observe: () => RM - .stream(BlocProvider.of(context).game, name: "gameFire") -// .asNew("mySeed") -// ..setState((s) => s.sortCards()) - , + observe: () => RM.stream(BlocProvider.of(context).game, name: "gameFire"), builder: (_, modelFire) { final currentModel = RM.get(); - final pos = RM.get(); + Injector.get(); return WhenRebuilder( - models: [modelFire, pos], + models: [modelFire, RM.get()], onIdle: () => _buildEmpty(), onWaiting: () => _buildWaiting(), onError: (e) => _buildEmpty(), onSetState: (_, rmFire) { if (rmFire.hasData && rmFire.state != null) { var different = rmFire.state.different(currentModel.state); - currentModel.setValue(() => rmFire.state, + currentModel.setValue(() => rmFire.state..sortCards(), filterTags: different); } }, @@ -66,64 +60,6 @@ class StatedGameScreen extends StatelessWidget { }, ), ); - /* - return Injector( - inject: [ - Inject.stream(() => BlocProvider.of(context).game, - name: "game") - ], - builder: (BuildContext buildContext) { - return WhenRebuilder( - observe: () => RM.get(name: "game"), - onIdle: () => _buildEmpty(), - onWaiting: () => _buildWaiting(), - onError: (e) => _buildEmpty(), - onData: (gameFire) { -// var reactiveModel = RM.create(gameFire).asNew(); - return StateBuilder( - onSetState: (context, model) { - model.setValue(() => gameFire); - }, - observe: () => RM.create(gameFire), -// observeMany: [ -// () => reactiveModel, -// () => RM.future(getPosTableToColors()), -// ], - builder: - (BuildContext context, ReactiveModel gameModel) { - if (gameModel.state != null) return _build(gameModel); - return _buildEmpty(); - }); - }); - }, - ); - */ - } - - Widget _build(ReactiveModel gameModel) { - return Scaffold( - appBar: AppBar( - title: Text("${gameModel.state.id}"), - actions: [ - FlatButton( - onPressed: () { - gameModel.setState( - (g) => g.bids.add(SimpleBid( - points: 90, - color: CardColor.HEART, - position: PlayerPosition.EAST)), - filterTags: [Aspects.BIDS], - catchError: true, - onSetState: (context) {}, - ); - }, - child: Text("add a bid")) - ], - ), - floatingActionButton: FloatingActionButton( - child: Icon(Icons.sort_by_alpha), - onPressed: () => gameModel.setState((Game g) => g.sortCards())), - body: TestWidget()); } Future _quit(BuildContext context) { @@ -158,22 +94,3 @@ class StatedGameScreen extends StatelessWidget { ); } } - -class TestWidget extends StatelessWidget { - @override - Widget build(BuildContext context) { - final ReactiveModel game = RM.get(); - return StateBuilder( - models: [game], - tag: Aspects.BIDS, - onSetState: (context, model) { - FlushbarHelper.createInformation(message: "Hi, new Bids!") - .show(context); - }, - builder: (context, model) => Padding( - padding: const EdgeInsets.all(20.0), - child: Center(child: Text("${game.value}")), - ), - ); - } -} diff --git a/FlutterCoinche/lib/ui/widget/bids_widget.dart b/FlutterCoinche/lib/ui/widget/bids_widget.dart index f1a6552..ff71d91 100644 --- a/FlutterCoinche/lib/ui/widget/bids_widget.dart +++ b/FlutterCoinche/lib/ui/widget/bids_widget.dart @@ -33,7 +33,7 @@ class BidsWidget extends StatelessWidget { ?.where((element) => element.position == cardinalPosition) ?? []; final state = model.state.state; - final mapToColor = RM.get().state.value; + final mapToColor = Injector.get().value; if (state != TableState.BIDDING || theBids.isEmpty) return SizedBox(); Alignment alignment; BubbleNip bubbleNip; diff --git a/FlutterCoinche/lib/ui/widget/button_last_trick.dart b/FlutterCoinche/lib/ui/widget/button_last_trick.dart index 42359e7..e804ea5 100644 --- a/FlutterCoinche/lib/ui/widget/button_last_trick.dart +++ b/FlutterCoinche/lib/ui/widget/button_last_trick.dart @@ -24,9 +24,8 @@ class ButtonLastTrick extends StatelessWidget { final state = game.state; final me = game.myPosition; final cardinalToPosTable = getCardinalToPosTable(me); - final mapColor = RM + final mapColor = Injector .get() - .state .value .map((key, value) => MapEntry(key, value.item1)); final List lastTrick = game.lastTrick; diff --git a/FlutterCoinche/lib/ui/widget/only_score.dart b/FlutterCoinche/lib/ui/widget/only_score.dart index ba0de70..81a8bb1 100644 --- a/FlutterCoinche/lib/ui/widget/only_score.dart +++ b/FlutterCoinche/lib/ui/widget/only_score.dart @@ -29,9 +29,8 @@ class OnlyScoreWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final Map mapColor = RM + final Map mapColor = Injector .get() - .state .value .map((key, value) => MapEntry(key, value.item1)); const textSize = 14.0; diff --git a/FlutterCoinche/lib/ui/widget/player_avatar.dart b/FlutterCoinche/lib/ui/widget/player_avatar.dart index 9ee48fc..75ff286 100644 --- a/FlutterCoinche/lib/ui/widget/player_avatar.dart +++ b/FlutterCoinche/lib/ui/widget/player_avatar.dart @@ -30,7 +30,7 @@ class PlayerAvatar extends StatelessWidget { @override Widget build(BuildContext context) { final portrait = MediaQuery.of(context).orientation == Orientation.portrait; - var modelColor = RM.get(); + var modelColor = Injector.get(); return StateBuilder( models: [RM.get()], tag: [ @@ -46,7 +46,7 @@ class PlayerAvatar extends StatelessWidget { final map = getPosTableToCardinal(me); final bool myTurn = model.state.nextPlayer == map[posTable]; final nick = model.state.nicknames.fromPosition(map[posTable]); - final mapColorAvatar = modelColor.state.value; + final mapColorAvatar = modelColor.value; final color = mapColorAvatar[posTable].item1; final avatar = mapColorAvatar[posTable].item2; return Container( diff --git a/FlutterCoinche/lib/ui/widget/table_widget.dart b/FlutterCoinche/lib/ui/widget/table_widget.dart index 5913710..72b92ba 100644 --- a/FlutterCoinche/lib/ui/widget/table_widget.dart +++ b/FlutterCoinche/lib/ui/widget/table_widget.dart @@ -141,12 +141,6 @@ class _TableWidgetState extends State { screenSize: screenSize, widthContainerName: widthContainerName, ), - // Top right recap widget - Positioned( - top: 10, - right: 10, - child: const RecapWidget(), - ), if (portrait) Align( alignment: Alignment.bottomRight, From 282cfe5a417374c68735c7abdee283b89de32581 Mon Sep 17 00:00:00 2001 From: OroshiX Date: Thu, 7 May 2020 19:09:06 +0200 Subject: [PATCH 7/7] [Flutter] remove unsupported svg tag --- FlutterCoinche/images/vampire.svg | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/FlutterCoinche/images/vampire.svg b/FlutterCoinche/images/vampire.svg index 6bbd74a..78decb0 100644 --- a/FlutterCoinche/images/vampire.svg +++ b/FlutterCoinche/images/vampire.svg @@ -1,9 +1,7 @@ - - - + @@ -21,7 +19,6 @@ -