From b79629725e67b7a2754cea6085f510c242994651 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Wed, 16 Mar 2022 12:42:04 +0100 Subject: [PATCH] feat: set character theme for leaderboard --- lib/game/view/pinball_game_page.dart | 2 +- lib/game/view/widgets/game_over_dialog.dart | 9 +++- lib/l10n/arb/app_en.arb | 4 ++ lib/leaderboard/view/leader_board_page.dart | 59 +++++++++++++++++---- 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/lib/game/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index 21bd4074..136aaf63 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -70,7 +70,7 @@ class _PinballGameViewState extends State { showDialog( context: context, builder: (_) { - return const GameOverDialog(); + return GameOverDialog(theme: widget.theme); }, ); } diff --git a/lib/game/view/widgets/game_over_dialog.dart b/lib/game/view/widgets/game_over_dialog.dart index 416da1f0..b80f668c 100644 --- a/lib/game/view/widgets/game_over_dialog.dart +++ b/lib/game/view/widgets/game_over_dialog.dart @@ -1,14 +1,19 @@ +// ignore_for_file: public_member_api_docs + import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball/l10n/l10n.dart'; import 'package:pinball/leaderboard/leader_board.dart'; +import 'package:pinball_theme/pinball_theme.dart'; /// {@template game_over_dialog} /// [Dialog] displayed when the [PinballGame] is over. /// {@endtemplate} class GameOverDialog extends StatelessWidget { /// {@macro game_over_dialog} - const GameOverDialog({Key? key}) : super(key: key); + const GameOverDialog({Key? key, required this.theme}) : super(key: key); + + final PinballTheme theme; @override Widget build(BuildContext context) { @@ -25,7 +30,7 @@ class GameOverDialog extends StatelessWidget { Text(l10n.gameOver), TextButton( onPressed: () => Navigator.of(context).push( - LeaderBoardPage.route(), + LeaderBoardPage.route(theme), ), child: Text(l10n.leadersBoard), ), diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 746b94b4..18fa9fe6 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -36,6 +36,10 @@ "@rank": { "description": "Text displayed on the leaders board page header rank column" }, + "character": "Character", + "@character": { + "description": "Text displayed on the leaders board page header character column" + }, "userName": "UserName", "@userName": { "description": "Text displayed on the leaders board page header userName column" diff --git a/lib/leaderboard/view/leader_board_page.dart b/lib/leaderboard/view/leader_board_page.dart index aea894a6..46170860 100644 --- a/lib/leaderboard/view/leader_board_page.dart +++ b/lib/leaderboard/view/leader_board_page.dart @@ -1,26 +1,27 @@ // ignore_for_file: public_member_api_docs -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:pinball/game/view/pinball_game_page.dart'; import 'package:pinball/l10n/l10n.dart'; import 'package:pinball/theme/theme.dart'; +import 'package:pinball_theme/pinball_theme.dart'; class LeaderBoardPage extends StatelessWidget { - const LeaderBoardPage({Key? key}) : super(key: key); + const LeaderBoardPage({Key? key, required this.theme}) : super(key: key); + + final PinballTheme theme; - static Route route() { + static Route route(PinballTheme theme) { return MaterialPageRoute( - builder: (_) => const LeaderBoardPage(), + builder: (_) => LeaderBoardPage(theme: theme), ); } @override Widget build(BuildContext context) { return BlocProvider( - create: (context) => ThemeCubit(), + create: (context) => + ThemeCubit()..characterSelected(theme.characterTheme), child: const LeaderBoardView(), ); } @@ -48,9 +49,7 @@ class LeaderBoardView extends StatelessWidget { const SizedBox(height: 20), TextButton( onPressed: () => Navigator.of(context).push( - PinballGamePage.route( - theme: context.read().state.theme, - ), + CharacterSelectionPage.route(), ), child: Text(l10n.retry), ), @@ -92,6 +91,7 @@ class _LeaderBoardHeaders extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ _LeaderBoardHeaderItem(title: l10n.rank), + _LeaderBoardHeaderItem(title: l10n.character), _LeaderBoardHeaderItem(title: l10n.userName), _LeaderBoardHeaderItem(title: l10n.score), ], @@ -131,6 +131,7 @@ class _LeaderBoardList extends StatelessWidget { itemBuilder: (_, index) => _LeaderBoardCompetitor( competitor: Competitor( rank: index, + characterTheme: const SparkyTheme(), userName: 'user$index', score: 0, ), @@ -152,6 +153,9 @@ class _LeaderBoardCompetitor extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ _LeaderBoardCompetitorField(text: competitor.rank.toString()), + _LeaderBoardCompetitorCharacter( + characterTheme: competitor.characterTheme, + ), _LeaderBoardCompetitorField(text: competitor.userName), _LeaderBoardCompetitorField(text: competitor.score.toString()), ], @@ -184,10 +188,43 @@ class _LeaderBoardCompetitorField extends StatelessWidget { } } +class _LeaderBoardCompetitorCharacter extends StatelessWidget { + const _LeaderBoardCompetitorCharacter({ + Key? key, + required this.characterTheme, + }) : super(key: key); + final CharacterTheme characterTheme; + + @override + Widget build(BuildContext context) { + return Expanded( + child: DecoratedBox( + decoration: BoxDecoration( + border: Border.all( + color: + context.read().state.theme.characterTheme.ballColor, + width: 2, + ), + ), + child: SizedBox( + height: 30, + child: characterTheme.characterAsset.image(), + ), + ), + ); + } +} + class Competitor { - Competitor({required this.rank, required this.userName, required this.score}); + Competitor({ + required this.rank, + required this.characterTheme, + required this.userName, + required this.score, + }); final int rank; + final CharacterTheme characterTheme; final String userName; final int score; }