Skip to content
Snippets Groups Projects
Commit 17d3bd1e authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Use activity buttons widgets from flutter_custom_toolbox

parent c8d75f04
No related branches found
No related tags found
1 merge request!29Resolve "Use activity buttons widgets from flutter_custom_toolbox"
Pipeline #6924 passed
This commit is part of merge request !29. Comments created here will be created in the context of that merge request.
Showing
with 119 additions and 199 deletions
assets/ui/button_back.png

2.37 KiB

assets/ui/button_delete_saved_game.png

7.65 KiB

assets/ui/button_resume_game.png

3.35 KiB

assets/ui/button_start.png

2.99 KiB

Use activity buttons widgets from flutter_custom_toolbox.
Utilisation des boutons d'activité à partir du package flutter_custom_toolbox.
...@@ -22,17 +22,12 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget { ...@@ -22,17 +22,12 @@ class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
final List<Widget> menuActions = []; final List<Widget> menuActions = [];
if (currentActivity.isRunning && !currentActivity.isFinished) { if (currentActivity.isRunning && !currentActivity.isFinished) {
menuActions.add(StyledButton( menuActions.add(ActivityButtonQuit(
color: Colors.red,
onPressed: () {}, onPressed: () {},
onLongPress: () { onLongPress: () {
BlocProvider.of<ActivityCubit>(context).quitActivity(); BlocProvider.of<ActivityCubit>(context).quitActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome(); BlocProvider.of<NavCubitPage>(context).goToPageHome();
}, },
child: const Image(
image: AssetImage('assets/ui/button_back.png'),
fit: BoxFit.fill,
),
)); ));
} else { } else {
if (pageIndex == Screen.indexActivity) { if (pageIndex == Screen.indexActivity) {
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/common/cubit/nav/nav_cubit_pages.dart';
import 'package:solitaire/common/ui/parameters/parameter_widget.dart'; import 'package:solitaire/common/ui/parameters/parameter_widget.dart';
import 'package:solitaire/config/default_activity_settings.dart'; import 'package:solitaire/config/default_activity_settings.dart';
...@@ -9,9 +10,6 @@ import 'package:solitaire/cubit/activity/activity_cubit.dart'; ...@@ -9,9 +10,6 @@ import 'package:solitaire/cubit/activity/activity_cubit.dart';
import 'package:solitaire/cubit/settings/settings_activity_cubit.dart'; import 'package:solitaire/cubit/settings/settings_activity_cubit.dart';
import 'package:solitaire/cubit/settings/settings_global_cubit.dart'; import 'package:solitaire/cubit/settings/settings_global_cubit.dart';
import 'package:solitaire/models/activity/activity.dart'; import 'package:solitaire/models/activity/activity.dart';
import 'package:solitaire/ui/widgets/actions/button_delete_saved_game.dart';
import 'package:solitaire/ui/widgets/actions/button_game_start_new.dart';
import 'package:solitaire/ui/widgets/actions/button_resume_saved_game.dart';
class PageParameters extends StatelessWidget { class PageParameters extends StatelessWidget {
const PageParameters({super.key}); const PageParameters({super.key});
...@@ -20,13 +18,17 @@ class PageParameters extends StatelessWidget { ...@@ -20,13 +18,17 @@ class PageParameters extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
return BlocBuilder<ActivityCubit, ActivityState>( return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) { builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity; final Activity currentActivity = activityState.currentActivity;
final List<Widget> lines = []; final List<Widget> lines = [];
// Game settings // Activity settings
for (String code in DefaultActivitySettings.availableParameters) { for (String code in DefaultActivitySettings.availableParameters) {
lines.add(Row( lines.add(Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
...@@ -44,23 +46,40 @@ class PageParameters extends StatelessWidget { ...@@ -44,23 +46,40 @@ class PageParameters extends StatelessWidget {
)); ));
if (currentActivity.canBeResumed == false) { if (currentActivity.canBeResumed == false) {
// Start new game // Start new activity
lines.add( lines.add(
const AspectRatio( AspectRatio(
aspectRatio: 3, aspectRatio: 3,
child: StartNewGameButton(), child: ActivityButtonStartNew(
onPressed: () {
BlocProvider.of<ActivityCubit>(context).startNewActivity(
activitySettings: activitySettingsState.settings,
globalSettings: globalSettingsState.settings,
);
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
),
), ),
); );
} else { } else {
// Resume game // Resume activity
lines.add(const AspectRatio( lines.add(AspectRatio(
aspectRatio: 3, aspectRatio: 3,
child: ResumeSavedGameButton(), child: ActivityButtonResumeSaved(
onPressed: () {
BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
),
)); ));
// Delete saved game // Delete saved activity
lines.add(SizedBox.square( lines.add(SizedBox.square(
dimension: MediaQuery.of(context).size.width / 5, dimension: MediaQuery.of(context).size.width / 5,
child: const DeleteSavedGameButton(), child: ActivityButtonDeleteSaved(
onPressed: () {
BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
},
),
)); ));
} }
...@@ -84,6 +103,10 @@ class PageParameters extends StatelessWidget { ...@@ -84,6 +103,10 @@ class PageParameters extends StatelessWidget {
); );
}, },
); );
},
);
},
);
} }
List<Widget> buildParametersLine({ List<Widget> buildParametersLine({
......
...@@ -94,11 +94,7 @@ class MyApp extends StatelessWidget { ...@@ -94,11 +94,7 @@ class MyApp extends StatelessWidget {
List<String> getImagesAssets() { List<String> getImagesAssets() {
final List<String> assets = []; final List<String> assets = [];
final List<String> gameImages = [ const List<String> gameImages = [
'button_back',
'button_delete_saved_game',
'button_resume_game',
'button_start',
'game_fail', 'game_fail',
'game_win', 'game_win',
'placeholder', 'placeholder',
......
...@@ -98,6 +98,12 @@ class Board { ...@@ -98,6 +98,12 @@ class Board {
return false; return false;
} }
// ensure target has a hole
if (cells[targetRow][targetCol].hasHole == false) {
// printlog('move forbidden: target does not accept peg');
return false;
}
// ensure target exists and is empty // ensure target exists and is empty
if (cells[targetRow][targetCol].hasPeg == true) { if (cells[targetRow][targetCol].hasPeg == true) {
// printlog('move forbidden: target does not exist or already with a peg'); // printlog('move forbidden: target does not exist or already with a peg');
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/common/cubit/nav/nav_cubit_pages.dart';
import 'package:solitaire/cubit/activity/activity_cubit.dart'; import 'package:solitaire/cubit/activity/activity_cubit.dart';
import 'package:solitaire/models/activity/activity.dart'; import 'package:solitaire/models/activity/activity.dart';
import 'package:solitaire/ui/widgets/actions/button_game_quit.dart';
class GameEndWidget extends StatelessWidget { class GameEndWidget extends StatelessWidget {
const GameEndWidget({super.key}); const GameEndWidget({super.key});
...@@ -20,26 +21,39 @@ class GameEndWidget extends StatelessWidget { ...@@ -20,26 +21,39 @@ class GameEndWidget extends StatelessWidget {
fit: BoxFit.fill, fit: BoxFit.fill,
); );
final double width = MediaQuery.of(context).size.width;
return Container( return Container(
margin: const EdgeInsets.all(2), margin: const EdgeInsets.all(2),
padding: const EdgeInsets.all(2), padding: const EdgeInsets.all(2),
child: Table( child: Table(
defaultColumnWidth: const IntrinsicColumnWidth(), defaultColumnWidth: FixedColumnWidth(width / 3.1),
defaultVerticalAlignment: TableCellVerticalAlignment.bottom, defaultVerticalAlignment: TableCellVerticalAlignment.bottom,
children: [ children: [
TableRow( TableRow(
children: [ children: [
Column( Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [decorationImage], children: [decorationImage],
), ),
Column( Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
currentActivity.animationInProgress == true currentActivity.animationInProgress == true
? decorationImage ? decorationImage
: const QuitGameButton() : ActivityButtonQuit(
onPressed: () {
BlocProvider.of<ActivityCubit>(context).quitActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
},
),
], ],
), ),
Column( Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [decorationImage], children: [decorationImage],
), ),
], ],
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/cubit/activity/activity_cubit.dart';
class DeleteSavedGameButton extends StatelessWidget {
const DeleteSavedGameButton({super.key});
@override
Widget build(BuildContext context) {
return StyledButton(
color: Colors.grey,
onPressed: () {
BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
},
child: const Image(
image: AssetImage('assets/ui/button_delete_saved_game.png'),
fit: BoxFit.fill,
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/common/cubit/nav/nav_cubit_pages.dart';
import 'package:solitaire/cubit/activity/activity_cubit.dart';
class QuitGameButton extends StatelessWidget {
const QuitGameButton({super.key});
@override
Widget build(BuildContext context) {
return StyledButton(
color: Colors.red,
onPressed: () {
BlocProvider.of<ActivityCubit>(context).quitActivity();
BlocProvider.of<NavCubitPage>(context).goToPageHome();
},
child: const Image(
image: AssetImage('assets/ui/button_back.png'),
fit: BoxFit.fill,
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/common/cubit/nav/nav_cubit_pages.dart';
import 'package:solitaire/cubit/activity/activity_cubit.dart';
import 'package:solitaire/cubit/settings/settings_activity_cubit.dart';
import 'package:solitaire/cubit/settings/settings_global_cubit.dart';
class StartNewGameButton extends StatelessWidget {
const StartNewGameButton({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
return StyledButton(
color: Colors.blue,
onPressed: () {
BlocProvider.of<ActivityCubit>(context).startNewActivity(
activitySettings: activitySettingsState.settings,
globalSettings: globalSettingsState.settings,
);
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
child: const Image(
image: AssetImage('assets/ui/button_start.png'),
fit: BoxFit.fill,
),
);
},
);
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:solitaire/common/cubit/nav/nav_cubit_pages.dart';
import 'package:solitaire/cubit/activity/activity_cubit.dart';
class ResumeSavedGameButton extends StatelessWidget {
const ResumeSavedGameButton({super.key});
@override
Widget build(BuildContext context) {
return StyledButton(
color: Colors.blue,
onPressed: () {
BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
child: const Image(
image: AssetImage('assets/ui/button_resume_game.png'),
fit: BoxFit.fill,
),
);
}
}
...@@ -122,11 +122,11 @@ packages: ...@@ -122,11 +122,11 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: "0.3.0" ref: "0.4.0"
resolved-ref: b24e16ca0cf72bde23640c72020d5c9da2e00e62 resolved-ref: eb9c090bd00d73324eab8737f74b3339cc24c9e8
url: "https://git.harrault.fr/android/flutter-toolbox.git" url: "https://git.harrault.fr/android/flutter-toolbox.git"
source: git source: git
version: "0.3.0" version: "0.4.0"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
......
...@@ -3,7 +3,7 @@ description: Solitaire Game ...@@ -3,7 +3,7 @@ description: Solitaire Game
publish_to: "none" publish_to: "none"
version: 0.4.1+26 version: 0.4.2+27
environment: environment:
sdk: "^3.0.0" sdk: "^3.0.0"
...@@ -16,7 +16,7 @@ dependencies: ...@@ -16,7 +16,7 @@ dependencies:
flutter_custom_toolbox: flutter_custom_toolbox:
git: git:
url: https://git.harrault.fr/android/flutter-toolbox.git url: https://git.harrault.fr/android/flutter-toolbox.git
ref: 0.3.0 ref: 0.4.0
# specific # specific
# (none) # (none)
......
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path transform="matrix(1.3783 .61747 -.61747 1.3783 45.198 93.762)" d="m11.645-14.603-44.77-4.6003 26.369-36.472z" fill="#fff" stroke="#950e4f" stroke-linecap="round" stroke-linejoin="round" stroke-width="7.2832"/></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m76.652 23.303-3.6441 58.302c-0.28153 4.5103-4.0223 8.0241-8.5413 8.0241h-35.27c-4.5189 0-8.2598-3.5138-8.5413-8.0241l-3.6441-58.302h-5.4824c-1.7723 0-3.2093-1.437-3.2093-3.2093 0-1.773 1.437-3.2093 3.2093-3.2093h70.605c1.7723 0 3.2093 1.4363 3.2093 3.2093 0 1.7723-1.437 3.2093-3.2093 3.2093zm-6.8314 0h-45.979l3.0819 55.867c0.12535 2.268 2.0008 4.0433 4.2732 4.0433h31.268c2.2724 0 4.1478-1.7752 4.2732-4.0433zm-22.99 6.4188c1.6541 0 2.9952 1.3411 2.9952 2.9952v41.08c0 1.6541-1.3411 2.9952-2.9952 2.9952-1.6542 0-2.9952-1.3411-2.9952-2.9952v-41.08c0-1.6541 1.3411-2.9952 2.9952-2.9952zm-12.837 0c1.6756 0 3.0553 1.3181 3.1312 2.9921l1.8776 41.3c0.06665 1.4664-1.0681 2.7087-2.5345 2.7762-0.04011 0.0015-0.08024 0.0021-0.12108 0.0021-1.5595 0-2.8476-1.2193-2.9328-2.7774l-2.253-41.3c-0.08524-1.5646 1.114-2.9012 2.6779-2.9864 0.05157-0.0029 0.10317-0.0042 0.15474-0.0042zm25.675 0c1.5667 0 2.8361 1.2694 2.8361 2.8361 0 0.05156-6.87e-4 0.10317-0.0036 0.15474l-2.2416 41.088c-0.09171 1.6778-1.4786 2.991-3.1586 2.991-1.5667 0-2.8361-1.2694-2.8361-2.8361 0-0.05156 7.31e-4 -0.10315 0.0036-0.15474l2.2417-41.088c0.09172-1.6778 1.4786-2.991 3.1586-2.991zm-21.397-25.675h17.117c4.7265 0 8.5578 3.8313 8.5578 8.5578v4.2795h-34.231v-4.2795c0-4.7265 3.8313-8.5578 8.5578-8.5578zm0.42837 6.4188c-1.4184 0-2.5675 1.1491-2.5675 2.5675v3.8512h21.394v-3.8512c0-1.4184-1.1491-2.5675-2.5675-2.5675z" fill="#fff" fill-rule="evenodd" stroke="#050200"/></svg>
<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-5.618)" fill="#fff" stroke="#105ea2" stroke-linecap="round" stroke-linejoin="round"><path transform="matrix(-1.3783 -.61747 .61747 -1.3783 55.567 -.086035)" d="m11.645-14.603-44.77-4.6003 26.369-36.472z" stroke-width="7.2832"/><path d="m15.535 12.852 2e-3 67.973z" stroke-width="11"/></g></svg>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment