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

Use ActivityParameters widgets from flutter_custom_toolbox

parent ae2d4cd9
No related branches found
No related tags found
1 merge request!27Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7050 passed
This commit is part of merge request !27. Comments created here will be created in the context of that merge request.
Showing
with 182 additions and 976 deletions
Use ActivityParameters widgets from flutter_custom_toolbox.
Utilisation des widgets ActivityParameters de flutter_custom_toolbox.
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/common/ui/pages/game.dart';
import 'package:snake/common/ui/pages/parameters.dart';
import 'package:snake/cubit/activity/activity_cubit.dart';
import 'package:snake/config/application_config.dart';
import 'package:snake/models/activity/activity.dart';
import 'package:snake/ui/pages/game.dart';
class ActivityPageItem {
final String code;
final Icon icon;
final Widget page;
final Widget Function({required Activity currentActivity})? builder;
const ActivityPageItem({
required this.code,
required this.icon,
required this.page,
required this.builder,
});
}
......@@ -20,20 +22,27 @@ class ActivityPage {
static const bool displayBottomNavBar = false;
static const indexHome = 0;
static const pageHome = ActivityPageItem(
static final ActivityPageItem pageHome = ActivityPageItem(
code: 'page_home',
icon: Icon(UniconsLine.home),
page: PageParameters(),
builder: ({required Activity currentActivity}) {
return PageParameters(
config: ApplicationConfig.config,
canBeResumed: currentActivity.canBeResumed,
);
},
);
static const indexGame = 1;
static const pageGame = ActivityPageItem(
static final pageGame = ActivityPageItem(
code: 'page_game',
icon: Icon(UniconsLine.star),
page: PageGame(),
builder: ({required Activity currentActivity}) {
return PageGame();
},
);
static const Map<int, ActivityPageItem> items = {
static final Map<int, ActivityPageItem> items = {
indexHome: pageHome,
indexGame: pageGame,
};
......@@ -45,6 +54,16 @@ class ActivityPage {
}
static Widget getWidget(int pageIndex) {
return items[pageIndex]?.page ?? pageHome.page;
return BlocBuilder<ActivityCubit, ActivityState>(
builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity;
if (items.keys.contains(pageIndex)) {
return items[pageIndex]?.builder!(currentActivity: currentActivity) ?? Text('oups');
} else {
return getWidget(defaultPageIndex);
}
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/common/cubit/nav/nav_cubit_pages.dart';
import 'package:snake/common/ui/parameters/parameter_widget.dart';
import 'package:snake/config/default_activity_settings.dart';
import 'package:snake/config/default_global_settings.dart';
import 'package:snake/cubit/activity/activity_cubit.dart';
import 'package:snake/cubit/settings/settings_activity_cubit.dart';
import 'package:snake/cubit/settings/settings_global_cubit.dart';
import 'package:snake/models/activity/activity.dart';
class PageParameters extends StatelessWidget {
const PageParameters({super.key});
final double separatorHeight = 8.0;
@override
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>(
builder: (BuildContext context, ActivityState activityState) {
final Activity currentActivity = activityState.currentActivity;
final List<Widget> lines = [];
// Activity settings
for (String code in DefaultActivitySettings.availableParameters) {
lines.add(Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: buildParametersLine(
code: code,
isGlobal: false,
),
));
lines.add(SizedBox(height: separatorHeight));
}
lines.add(Expanded(
child: SizedBox(height: separatorHeight),
));
if (currentActivity.canBeResumed == false) {
// Start new activity
lines.add(
AspectRatio(
aspectRatio: 3,
child: ActivityButtonStartNew(
onPressed: () {
BlocProvider.of<ActivityCubit>(context).startNewActivity(
activitySettings: activitySettingsState.settings,
globalSettings: globalSettingsState.settings,
);
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
),
),
);
} else {
// Resume activity
lines.add(AspectRatio(
aspectRatio: 3,
child: ActivityButtonResumeSaved(
onPressed: () {
BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
),
));
// Delete saved activity
lines.add(SizedBox.square(
dimension: MediaQuery.of(context).size.width / 5,
child: ActivityButtonDeleteSaved(
onPressed: () {
BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
},
),
));
}
lines.add(SizedBox(height: separatorHeight));
// Global settings
for (String code in DefaultGlobalSettings.availableParameters) {
lines.add(Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: buildParametersLine(
code: code,
isGlobal: true,
),
));
lines.add(SizedBox(height: separatorHeight));
}
return Column(
children: lines,
);
},
);
},
);
},
);
}
List<Widget> buildParametersLine({
required String code,
required bool isGlobal,
}) {
final List<Widget> parameterButtons = [];
final List<String> availableValues = isGlobal
? DefaultGlobalSettings.getAvailableValues(code)
: DefaultActivitySettings.getAvailableValues(code);
if (availableValues.length <= 1) {
return [];
}
for (String value in availableValues) {
final Widget parameterButton = BlocBuilder<ActivitySettingsCubit, ActivitySettingsState>(
builder: (BuildContext context, ActivitySettingsState activitySettingsState) {
return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
final ActivitySettingsCubit activitySettingsCubit =
BlocProvider.of<ActivitySettingsCubit>(context);
final GlobalSettingsCubit globalSettingsCubit =
BlocProvider.of<GlobalSettingsCubit>(context);
final String currentValue = isGlobal
? globalSettingsCubit.getParameterValue(code)
: activitySettingsCubit.getParameterValue(code);
final bool isSelected = (value == currentValue);
final double displayWidth = MediaQuery.of(context).size.width;
final double itemWidth = displayWidth / availableValues.length - 4;
return SizedBox.square(
dimension: itemWidth,
child: ParameterWidget(
code: code,
value: value,
isSelected: isSelected,
size: itemWidth,
activitySettings: activitySettingsState.settings,
globalSettings: globalSettingsState.settings,
onPressed: () {
isGlobal
? globalSettingsCubit.setParameterValue(code, value)
: activitySettingsCubit.setParameterValue(code, value);
},
),
);
},
);
},
);
parameterButtons.add(parameterButton);
}
return parameterButtons;
}
}
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/default_activity_settings.dart';
import 'package:snake/config/default_global_settings.dart';
import 'package:snake/models/settings/settings_activity.dart';
import 'package:snake/models/settings/settings_global.dart';
class ParameterPainter extends CustomPainter {
const ParameterPainter({
required this.code,
required this.value,
required this.activitySettings,
required this.globalSettings,
});
final String code;
final String value;
final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
@override
void paint(Canvas canvas, Size size) {
// force square
final double canvasSize = min(size.width, size.height);
// content
switch (code) {
case DefaultActivitySettings.parameterCodeDifficultyLevel:
paintDifficultyLevelParameterItem(canvas, canvasSize);
break;
case DefaultActivitySettings.parameterCodeBoardSize:
paintBoardSizeParameterItem(canvas, canvasSize);
break;
case DefaultGlobalSettings.parameterCodeSkin:
paintSkinParameterItem(canvas, canvasSize);
break;
default:
printlog('Unknown parameter: $code/$value');
paintUnknownParameterItem(canvas, canvasSize);
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
// "unknown" parameter -> simple block with text
void paintUnknownParameterItem(
final Canvas canvas,
final double size,
) {
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3;
final textSpan = TextSpan(
text: '$code\n$value',
style: const TextStyle(
color: Colors.black,
fontSize: 18,
fontWeight: FontWeight.bold,
),
);
final textPainter = TextPainter(
text: textSpan,
textDirection: TextDirection.ltr,
textAlign: TextAlign.center,
);
textPainter.layout();
textPainter.paint(
canvas,
Offset(
(size - textPainter.width) * 0.5,
(size - textPainter.height) * 0.5,
),
);
}
void paintDifficultyLevelParameterItem(
final Canvas canvas,
final double size,
) {
final List<dynamic> stars = [];
switch (value) {
case DefaultActivitySettings.difficultyLevelValueEasy:
stars.add([0.5, 0.5]);
break;
case DefaultActivitySettings.difficultyLevelValueMedium:
stars.add([0.3, 0.5]);
stars.add([0.7, 0.5]);
break;
case DefaultActivitySettings.difficultyLevelValueHard:
stars.add([0.3, 0.3]);
stars.add([0.7, 0.3]);
stars.add([0.5, 0.7]);
break;
case DefaultActivitySettings.difficultyLevelValueNightmare:
stars.add([0.3, 0.3]);
stars.add([0.7, 0.3]);
stars.add([0.3, 0.7]);
stars.add([0.7, 0.7]);
break;
default:
printlog('Wrong value for level parameter value: $value');
}
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3 / 100 * size;
// Stars
final textSpan = TextSpan(
text: '⭐',
style: TextStyle(
color: Colors.black,
fontSize: size / 3,
fontWeight: FontWeight.bold,
),
);
final textPainter = TextPainter(
text: textSpan,
textDirection: TextDirection.ltr,
textAlign: TextAlign.center,
);
textPainter.layout();
for (var center in stars) {
textPainter.paint(
canvas,
Offset(
size * center[0] - textPainter.width * 0.5,
size * center[1] - textPainter.height * 0.5,
),
);
}
}
void paintBoardSizeParameterItem(
final Canvas canvas,
final double size,
) {
int gridWidth = 1;
switch (value) {
case DefaultActivitySettings.boardSizeValueSmall:
gridWidth = 2;
break;
case DefaultActivitySettings.boardSizeValueMedium:
gridWidth = 3;
break;
case DefaultActivitySettings.boardSizeValueLarge:
gridWidth = 4;
break;
case DefaultActivitySettings.boardSizeValueExtra:
gridWidth = 5;
break;
default:
printlog('Wrong value for boardSize parameter value: $value');
}
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3 / 100 * size;
// Mini grid
final squareBackgroundColor = Colors.grey.shade200;
final squareBorderColor = Colors.grey.shade800;
final double cellSize = size / 7;
final double origin = (size - gridWidth * cellSize) / 2;
for (int row = 0; row < gridWidth; row++) {
for (int col = 0; col < gridWidth; col++) {
final Offset topLeft = Offset(origin + col * cellSize, origin + row * cellSize);
final Offset bottomRight = topLeft + Offset(cellSize, cellSize);
paint.color = squareBackgroundColor;
paint.style = PaintingStyle.fill;
canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
paint.color = squareBorderColor;
paint.style = PaintingStyle.stroke;
canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
}
}
}
void paintSkinParameterItem(
final Canvas canvas,
final double size,
) {
const int gridWidth = 4;
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3;
// Mini grid
final borderColor = Colors.grey.shade800;
final double cellSize = size / gridWidth;
final double origin = (size - gridWidth * cellSize) / 2;
for (int row = 0; row < gridWidth; row++) {
for (int col = 0; col < gridWidth; col++) {
final Offset topLeft = Offset(origin + col * cellSize, origin + row * cellSize);
final Offset bottomRight = topLeft + Offset(cellSize, cellSize);
const squareColor = Colors.pink;
paint.color = squareColor;
paint.style = PaintingStyle.fill;
canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
paint.color = borderColor;
paint.style = PaintingStyle.stroke;
canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
}
}
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/common/ui/parameters/parameter_painter.dart';
import 'package:snake/config/default_activity_settings.dart';
import 'package:snake/config/default_global_settings.dart';
import 'package:snake/models/settings/settings_activity.dart';
import 'package:snake/models/settings/settings_global.dart';
class ParameterWidget extends StatelessWidget {
const ParameterWidget({
super.key,
required this.code,
required this.value,
required this.isSelected,
required this.size,
required this.activitySettings,
required this.globalSettings,
required this.onPressed,
});
final String code;
final String value;
final bool isSelected;
final double size;
final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
final VoidCallback onPressed;
static const Color buttonColorActive = Colors.blue;
static const Color buttonColorInactive = Colors.white;
static const double buttonBorderWidth = 4.0;
static const double buttonBorderRadius = 12.0;
@override
Widget build(BuildContext context) {
Widget content = const SizedBox.shrink();
switch (code) {
case DefaultActivitySettings.parameterCodeDifficultyLevel:
content = getDifficultyLevelParameterItem();
break;
case DefaultActivitySettings.parameterCodeBoardSize:
content = getBoardSizeParameterItem();
break;
case DefaultGlobalSettings.parameterCodeSkin:
content = getSkinParameterItem();
break;
default:
printlog('Unknown parameter: $code/$value');
content = getUnknownParameterItem();
}
final Color buttonColor = isSelected ? buttonColorActive : buttonColorInactive;
return Container(
decoration: BoxDecoration(
color: buttonColor,
borderRadius: BorderRadius.circular(buttonBorderRadius),
border: Border.all(
color: buttonColor,
width: buttonBorderWidth,
),
),
child: content,
);
}
// "unknown" parameter -> simple block with text
Widget getUnknownParameterItem() {
return StyledButton.text(
caption: '$code / $value',
color: Colors.grey,
onPressed: null,
);
}
Widget getDifficultyLevelParameterItem() {
Color backgroundColor = Colors.grey;
switch (value) {
case DefaultActivitySettings.difficultyLevelValueEasy:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.difficultyLevelValueMedium:
backgroundColor = Colors.orange;
break;
case DefaultActivitySettings.difficultyLevelValueHard:
backgroundColor = Colors.red;
break;
case DefaultActivitySettings.difficultyLevelValueNightmare:
backgroundColor = Colors.purple;
break;
default:
printlog('Wrong value for level parameter value: $value');
}
return StyledButton(
color: backgroundColor,
onPressed: onPressed,
child: CustomPaint(
size: Size(size, size),
willChange: false,
painter: ParameterPainter(
code: code,
value: value,
activitySettings: activitySettings,
globalSettings: globalSettings,
),
isComplex: true,
),
);
}
Widget getBoardSizeParameterItem() {
Color backgroundColor = Colors.grey;
switch (value) {
case DefaultActivitySettings.boardSizeValueSmall:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.boardSizeValueMedium:
backgroundColor = Colors.orange;
break;
case DefaultActivitySettings.boardSizeValueLarge:
backgroundColor = Colors.red;
break;
case DefaultActivitySettings.boardSizeValueExtra:
backgroundColor = Colors.purple;
break;
default:
printlog('Wrong value for boardSize parameter value: $value');
}
return StyledButton(
color: backgroundColor,
onPressed: onPressed,
child: CustomPaint(
size: Size(size, size),
willChange: false,
painter: ParameterPainter(
code: code,
value: value,
activitySettings: activitySettings,
globalSettings: globalSettings,
),
isComplex: true,
),
);
}
Widget getSkinParameterItem() {
Color backgroundColor = Colors.grey;
return StyledButton(
color: backgroundColor,
onPressed: onPressed,
child: CustomPaint(
size: Size(size, size),
willChange: false,
painter: ParameterPainter(
code: code,
value: value,
activitySettings: activitySettings,
globalSettings: globalSettings,
),
isComplex: true,
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/common/cubit/nav/nav_cubit_pages.dart';
import 'package:snake/cubit/activity/activity_cubit.dart';
import 'package:snake/ui/parameters/parameter_painter_board_size.dart';
import 'package:snake/ui/parameters/parameter_painter_difficulty_level.dart';
class ApplicationConfig {
static const String appTitle = 'Snake';
static const String parameterCodeSkin = 'global.skin';
static const String parameterCodeDifficultyLevel = 'difficultyLevel';
static const String parameterCodeBoardSize = 'boardSize';
static const String skinValueColors = 'colors';
static const String difficultyLevelValueEasy = 'easy';
static const String difficultyLevelValueMedium = 'medium';
static const String difficultyLevelValueHard = 'hard';
static const String difficultyLevelValueNightmare = 'nightmare';
static const String boardSizeValueSmall = 'small';
static const String boardSizeValueMedium = 'medium';
static const String boardSizeValueLarge = 'large';
static const String boardSizeValueExtraLarge = 'extra';
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Snake',
activitySettings: [
// skin
ApplicationSettingsParameter(
code: parameterCodeSkin,
values: [
ApplicationSettingsParameterItemValue(
value: skinValueColors,
isDefault: true,
),
],
),
// difficulty level
ApplicationSettingsParameter(
code: parameterCodeDifficultyLevel,
values: [
ApplicationSettingsParameterItemValue(
value: difficultyLevelValueEasy,
color: Colors.green,
),
ApplicationSettingsParameterItemValue(
value: difficultyLevelValueMedium,
color: Colors.orange,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: difficultyLevelValueHard,
color: Colors.red,
),
ApplicationSettingsParameterItemValue(
value: difficultyLevelValueNightmare,
color: Colors.purple,
),
],
customPainter: (context, value) => ParameterPainterDifficultyLevel(
context: context,
value: value,
),
),
// board size
ApplicationSettingsParameter(
code: parameterCodeBoardSize,
values: [
ApplicationSettingsParameterItemValue(
value: boardSizeValueSmall,
color: Colors.green,
),
ApplicationSettingsParameterItemValue(
value: boardSizeValueMedium,
color: Colors.orange,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: boardSizeValueLarge,
color: Colors.red,
),
ApplicationSettingsParameterItemValue(
value: boardSizeValueExtraLarge,
color: Colors.purple,
),
],
customPainter: (context, value) => ParameterPainterBoardSize(
context: context,
value: value,
),
intValueGetter: (String value) {
const Map<String, int> intValues = {
boardSizeValueSmall: 6,
boardSizeValueMedium: 10,
boardSizeValueLarge: 14,
boardSizeValueExtraLarge: 20,
};
return intValues[value] ?? 1;
},
),
],
startNewActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
deleteCurrentActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
},
resumeActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
);
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
class DefaultActivitySettings {
// available game parameters codes
static const String parameterCodeDifficultyLevel = 'difficultyLevel';
static const String parameterCodeBoardSize = 'boardSize';
static const List<String> availableParameters = [
parameterCodeDifficultyLevel,
parameterCodeBoardSize,
];
// difficulty level: available values
static const String difficultyLevelValueEasy = 'easy';
static const String difficultyLevelValueMedium = 'medium';
static const String difficultyLevelValueHard = 'hard';
static const String difficultyLevelValueNightmare = 'nightmare';
static const List<String> allowedDifficultyLevelValues = [
difficultyLevelValueEasy,
difficultyLevelValueMedium,
difficultyLevelValueHard,
difficultyLevelValueNightmare,
];
// difficulty level: default value
static const String defaultDifficultyLevelValue = difficultyLevelValueMedium;
// board size: available values
static const String boardSizeValueSmall = 'small';
static const String boardSizeValueMedium = 'medium';
static const String boardSizeValueLarge = 'large';
static const String boardSizeValueExtra = 'extra';
static const List<String> allowedBoardSizeValues = [
boardSizeValueSmall,
boardSizeValueMedium,
boardSizeValueLarge,
boardSizeValueExtra,
];
// board size: default value
static const String defaultBoardSizeValue = boardSizeValueMedium;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeDifficultyLevel:
return DefaultActivitySettings.allowedDifficultyLevelValues;
case parameterCodeBoardSize:
return DefaultActivitySettings.allowedBoardSizeValues;
}
printlog('Did not find any available value for game parameter "$parameterCode".');
return [];
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
class DefaultGlobalSettings {
// available global parameters codes
static const String parameterCodeSkin = 'skin';
static const List<String> availableParameters = [
parameterCodeSkin,
];
// skin: available values
static const String skinValueColors = 'colors';
static const String skinValueRetro = 'retro';
static const List<String> allowedSkinValues = [
skinValueColors,
// skinValueRetro,
];
// skin: default value
static const String defaultSkinValue = skinValueRetro;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeSkin:
return DefaultGlobalSettings.allowedSkinValues;
}
printlog('Did not find any available value for global parameter "$parameterCode".');
return [];
}
}
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/models/activity/activity.dart';
import 'package:snake/models/settings/settings_activity.dart';
import 'package:snake/models/settings/settings_global.dart';
part 'activity_state.dart';
......@@ -24,7 +21,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
final Activity activity = Activity(
// Settings
activitySettings: state.currentActivity.activitySettings,
globalSettings: state.currentActivity.globalSettings,
// State
isRunning: state.currentActivity.isRunning,
isStarted: state.currentActivity.isStarted,
......@@ -43,14 +39,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
updateState(activity);
}
void startNewActivity({
required ActivitySettings activitySettings,
required GlobalSettings globalSettings,
}) {
void startNewActivity(BuildContext context) {
final ActivitySettingsCubit activitySettingsCubit =
BlocProvider.of<ActivitySettingsCubit>(context);
final Activity newActivity = Activity.createNew(
// Settings
activitySettings: activitySettings,
globalSettings: globalSettings,
activitySettings: activitySettingsCubit.state.settings,
);
newActivity.dump();
......@@ -63,6 +58,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
refresh();
}
bool canBeResumed() {
return state.currentActivity.canBeResumed;
}
void quitActivity() {
state.currentActivity.isRunning = false;
refresh();
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/default_activity_settings.dart';
import 'package:snake/models/settings/settings_activity.dart';
part 'settings_activity_state.dart';
class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({
String? difficultyLevel,
String? boardSize,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
difficultyLevel: difficultyLevel ?? state.settings.difficultyLevel,
parameterSize: boardSize ?? state.settings.parameterSize,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodeDifficultyLevel:
return ActivitySettings.getLevelValueFromUnsafe(state.settings.difficultyLevel);
case DefaultActivitySettings.parameterCodeBoardSize:
return ActivitySettings.getSizeValueFromUnsafe(state.settings.parameterSize);
}
return '';
}
void setParameterValue(String code, String value) {
final String difficultyLevel =
(code == DefaultActivitySettings.parameterCodeDifficultyLevel)
? value
: getParameterValue(DefaultActivitySettings.parameterCodeDifficultyLevel);
final String boardSize = (code == DefaultActivitySettings.parameterCodeBoardSize)
? value
: getParameterValue(DefaultActivitySettings.parameterCodeBoardSize);
setValues(
difficultyLevel: difficultyLevel,
boardSize: boardSize,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String difficultyLevel =
json[DefaultActivitySettings.parameterCodeDifficultyLevel] as String;
final String boardSize = json[DefaultActivitySettings.parameterCodeBoardSize] as String;
return ActivitySettingsState(
settings: ActivitySettings(
difficultyLevel: difficultyLevel,
parameterSize: boardSize,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeDifficultyLevel: state.settings.difficultyLevel,
DefaultActivitySettings.parameterCodeBoardSize: state.settings.parameterSize,
};
}
}
part of 'settings_activity_cubit.dart';
@immutable
class ActivitySettingsState extends Equatable {
const ActivitySettingsState({
required this.settings,
});
final ActivitySettings settings;
@override
List<dynamic> get props => <dynamic>[
settings,
];
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/default_global_settings.dart';
import 'package:snake/models/settings/settings_global.dart';
part 'settings_global_state.dart';
class GlobalSettingsCubit extends HydratedCubit<GlobalSettingsState> {
GlobalSettingsCubit() : super(GlobalSettingsState(settings: GlobalSettings.createDefault()));
void setValues({
String? skin,
}) {
emit(
GlobalSettingsState(
settings: GlobalSettings(
skin: skin ?? state.settings.skin,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultGlobalSettings.parameterCodeSkin:
return GlobalSettings.getSkinValueFromUnsafe(state.settings.skin);
}
return '';
}
void setParameterValue(String code, String value) {
final String skin = (code == DefaultGlobalSettings.parameterCodeSkin)
? value
: getParameterValue(DefaultGlobalSettings.parameterCodeSkin);
setValues(
skin: skin,
);
}
@override
GlobalSettingsState? fromJson(Map<String, dynamic> json) {
final String skin = json[DefaultGlobalSettings.parameterCodeSkin] as String;
return GlobalSettingsState(
settings: GlobalSettings(
skin: skin,
),
);
}
@override
Map<String, dynamic>? toJson(GlobalSettingsState state) {
return <String, dynamic>{
DefaultGlobalSettings.parameterCodeSkin: state.settings.skin,
};
}
}
part of 'settings_global_cubit.dart';
@immutable
class GlobalSettingsState extends Equatable {
const GlobalSettingsState({
required this.settings,
});
final GlobalSettings settings;
@override
List<dynamic> get props => <dynamic>[
settings,
];
}
......@@ -8,10 +8,7 @@ import 'package:snake/common/cubit/nav/nav_cubit_pages.dart';
import 'package:snake/common/cubit/nav/nav_cubit_screens.dart';
import 'package:snake/config/application_config.dart';
import 'package:snake/config/default_global_settings.dart';
import 'package:snake/cubit/activity/activity_cubit.dart';
import 'package:snake/cubit/settings/settings_activity_cubit.dart';
import 'package:snake/cubit/settings/settings_global_cubit.dart';
import 'package:snake/ui/skeleton.dart';
void main() async {
......@@ -62,17 +59,14 @@ class MyApp extends StatelessWidget {
BlocProvider<ActivityCubit>(
create: (context) => ActivityCubit(),
),
BlocProvider<GlobalSettingsCubit>(
create: (context) => GlobalSettingsCubit(),
),
BlocProvider<ActivitySettingsCubit>(
create: (context) => ActivitySettingsCubit(),
create: (context) => ActivitySettingsCubit(appConfig: ApplicationConfig.config),
),
],
child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
builder: (BuildContext context, ApplicationThemeModeState state) {
return MaterialApp(
title: ApplicationConfig.appTitle,
title: ApplicationConfig.config.appTitle,
home: const SkeletonScreen(),
// Theme stuff
......@@ -111,7 +105,9 @@ class MyApp extends StatelessWidget {
'head',
];
for (String skin in DefaultGlobalSettings.allowedSkinValues) {
for (String skin in ApplicationConfig.config
.getFromCode(ApplicationConfig.parameterCodeSkin)
.allowedValues) {
for (String image in skinImages) {
assets.add('assets/skins/${skin}_$image.png');
}
......
......@@ -2,18 +2,16 @@ import 'dart:math';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/application_config.dart';
import 'package:snake/models/activity/board.dart';
import 'package:snake/models/activity/cell.dart';
import 'package:snake/models/activity/cell_location.dart';
import 'package:snake/models/activity/snake.dart';
import 'package:snake/models/settings/settings_activity.dart';
import 'package:snake/models/settings/settings_global.dart';
class Activity {
Activity({
// Settings
required this.activitySettings,
required this.globalSettings,
// State
this.isRunning = false,
......@@ -33,7 +31,6 @@ class Activity {
// Settings
final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
// State
bool isRunning;
......@@ -51,38 +48,34 @@ class Activity {
bool gameWon;
factory Activity.createEmpty() {
final ActivitySettings defaultActivitySettings = ActivitySettings.createDefault();
final GlobalSettings defaultGlobalSettings = GlobalSettings.createDefault();
final ActivitySettings defaultActivitySettings =
ActivitySettings.createDefault(appConfig: ApplicationConfig.config);
return Activity(
// Settings
activitySettings: defaultActivitySettings,
globalSettings: defaultGlobalSettings,
// Base data
snake: Snake.create(defaultActivitySettings),
board: Board.createEmpty(defaultActivitySettings),
boardSize: defaultActivitySettings.boardSize,
boardSize: defaultActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize),
);
}
factory Activity.createNew({
ActivitySettings? activitySettings,
GlobalSettings? globalSettings,
}) {
final ActivitySettings newActivitySettings =
activitySettings ?? ActivitySettings.createDefault();
final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
final ActivitySettings newActivitySettings = activitySettings ??
ActivitySettings.createDefault(appConfig: ApplicationConfig.config);
Activity newActivity = Activity(
// Settings
activitySettings: newActivitySettings,
globalSettings: newGlobalSettings,
// State
isRunning: true,
// Base data
snake: Snake.create(newActivitySettings),
board: Board.createEmpty(newActivitySettings),
boardSize: newActivitySettings.boardSize,
boardSize: newActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize),
// Game data
score: 0,
);
......@@ -241,7 +234,6 @@ class Activity {
printlog('$Activity:');
printlog(' Settings');
activitySettings.dump();
globalSettings.dump();
printlog(' State');
printlog(' isRunning: $isRunning');
printlog(' isStarted: $isStarted');
......@@ -264,7 +256,6 @@ class Activity {
return <String, dynamic>{
// Settings
'activitySettings': activitySettings.toJson(),
'globalSettings': globalSettings.toJson(),
// State
'isRunning': isRunning,
'isStarted': isStarted,
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/application_config.dart';
import 'package:snake/models/activity/cell.dart';
import 'package:snake/models/activity/cell_location.dart';
import 'package:snake/models/settings/settings_activity.dart';
typedef BoardCells = List<List<Cell>>;
......@@ -12,8 +14,10 @@ class Board {
});
factory Board.createEmpty(ActivitySettings activitySettings) {
final int boardSizeHorizontal = activitySettings.boardSize;
final int boardSizeVertical = activitySettings.boardSize;
final int boardSizeHorizontal =
activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
final int boardSizeVertical =
activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
BoardCells cells = [];
for (int rowIndex = 0; rowIndex < boardSizeVertical; rowIndex++) {
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/application_config.dart';
import 'package:snake/models/activity/cell_location.dart';
import 'package:snake/models/settings/settings_activity.dart';
typedef SnakeCells = List<CellLocation>;
......@@ -22,8 +24,10 @@ class Snake {
const int initialLength = 3;
// ~ center cell:
final int middleColumn = activitySettings.boardSize ~/ 2;
final int middleRow = activitySettings.boardSize ~/ 2;
final int middleColumn =
activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize) ~/ 2;
final int middleRow =
activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize) ~/ 2;
SnakeCells cells = [
CellLocation.go(middleRow, middleColumn),
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/default_activity_settings.dart';
class ActivitySettings {
String difficultyLevel;
String parameterSize;
ActivitySettings({
required this.difficultyLevel,
required this.parameterSize,
});
static String getLevelValueFromUnsafe(String level) {
if (DefaultActivitySettings.allowedDifficultyLevelValues.contains(level)) {
return level;
}
return DefaultActivitySettings.defaultDifficultyLevelValue;
}
static String getSizeValueFromUnsafe(String size) {
if (DefaultActivitySettings.allowedBoardSizeValues.contains(size)) {
return size;
}
return DefaultActivitySettings.defaultBoardSizeValue;
}
factory ActivitySettings.createDefault() {
return ActivitySettings(
difficultyLevel: DefaultActivitySettings.defaultDifficultyLevelValue,
parameterSize: DefaultActivitySettings.defaultBoardSizeValue,
);
}
int getBoardSizeFromParameter(String parameterSize) {
const Map<String, int> values = {
DefaultActivitySettings.boardSizeValueSmall: 12,
DefaultActivitySettings.boardSizeValueMedium: 20,
DefaultActivitySettings.boardSizeValueLarge: 30,
DefaultActivitySettings.boardSizeValueExtra: 40,
};
return values[parameterSize] ??
getBoardSizeFromParameter(DefaultActivitySettings.defaultBoardSizeValue);
}
int get boardSize => getBoardSizeFromParameter(parameterSize);
void dump() {
printlog('$ActivitySettings:');
printlog(' ${DefaultActivitySettings.parameterCodeDifficultyLevel}: $difficultyLevel');
printlog(' ${DefaultActivitySettings.parameterCodeBoardSize}: $parameterSize');
printlog('');
}
@override
String toString() {
return '$ActivitySettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeDifficultyLevel: difficultyLevel,
DefaultActivitySettings.parameterCodeBoardSize: parameterSize,
};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:snake/config/default_global_settings.dart';
class GlobalSettings {
String skin;
GlobalSettings({
required this.skin,
});
static String getSkinValueFromUnsafe(String skin) {
if (DefaultGlobalSettings.allowedSkinValues.contains(skin)) {
return skin;
}
return DefaultGlobalSettings.defaultSkinValue;
}
factory GlobalSettings.createDefault() {
return GlobalSettings(
skin: DefaultGlobalSettings.defaultSkinValue,
);
}
void dump() {
printlog('$GlobalSettings: ');
printlog(' ${DefaultGlobalSettings.parameterCodeSkin}: $skin');
printlog('');
}
@override
String toString() {
return '$GlobalSettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultGlobalSettings.parameterCodeSkin: skin,
};
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment