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

Use ActivityParameters widgets from flutter_custom_toolbox

parent 828d43ad
No related branches found
No related tags found
1 merge request!52Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7040 passed
Showing
with 325 additions and 1037 deletions
Use ActivityParameters widgets from flutter_custom_toolbox.
Utilisation des widgets ActivityParameters de flutter_custom_toolbox.
flutter_01.png

173 KiB

import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:colors/common/ui/pages/game.dart';
import 'package:colors/common/ui/pages/parameters.dart';
import 'package:colors/cubit/activity/activity_cubit.dart';
import 'package:colors/config/application_config.dart';
import 'package:colors/models/activity/activity.dart';
import 'package:colors/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,
};
......@@ -44,7 +53,17 @@ class ActivityPage {
return items.keys.contains(pageIndex);
}
static Widget getWidget(int pageIndex) {
return items[pageIndex]?.page ?? pageHome.page;
static Widget getWidget(int pageIndex, BuildContext context) {
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, context);
}
},
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:colors/common/cubit/nav/nav_cubit_pages.dart';
import 'package:colors/common/ui/parameters/parameter_widget.dart';
import 'package:colors/config/default_activity_settings.dart';
import 'package:colors/config/default_global_settings.dart';
import 'package:colors/cubit/activity/activity_cubit.dart';
import 'package:colors/cubit/settings/settings_activity_cubit.dart';
import 'package:colors/cubit/settings/settings_global_cubit.dart';
import 'package:colors/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:colors/config/color_theme.dart';
import 'package:colors/config/default_activity_settings.dart';
import 'package:colors/config/default_global_settings.dart';
import 'package:colors/models/settings/settings_activity.dart';
import 'package:colors/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 DefaultActivitySettings.parameterCodeColorsCount:
paintColorsCountParameterItem(canvas, canvasSize);
break;
case DefaultGlobalSettings.parameterCodeSkin:
paintColorsThemeParameterItem(canvas, canvasSize);
break;
default:
printlog('$ParameterPainter -> 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 paintColorsCountParameterItem(
final Canvas canvas,
final double size,
) {
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3;
// Colors preview
const List<Offset> positions = [
Offset(0, 0),
Offset(1, 0),
Offset(2, 0),
Offset(2, 1),
Offset(2, 2),
Offset(1, 2),
Offset(0, 2),
Offset(0, 1),
];
const skin = DefaultGlobalSettings.defaultSkinValue;
final double padding = 4 / 100 * size;
final double margin = 3 / 100 * size;
final double width = ((size - 2 * padding) / 3) - 2 * margin;
final int maxValue = int.parse(value);
for (int colorIndex = 0; colorIndex < maxValue; colorIndex++) {
final Offset position = positions[colorIndex];
final Offset topLeft = Offset(padding + margin + position.dx * (width + 2 * margin),
padding + margin + position.dy * (width + 2 * margin));
final Offset bottomRight = topLeft + Offset(width, width);
final squareColor = Color(ColorTheme.getColorCode(skin, colorIndex + 1));
paint.color = squareColor;
paint.style = PaintingStyle.fill;
canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
final borderColor = squareColor.darken(20);
paint.color = borderColor;
paint.style = PaintingStyle.stroke;
canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint);
}
// centered text value
final textSpan = TextSpan(
text: value.toString(),
style: TextStyle(
color: Colors.black,
fontSize: size / 4,
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 paintColorsThemeParameterItem(
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:colors/common/ui/parameters/parameter_painter.dart';
import 'package:colors/config/default_activity_settings.dart';
import 'package:colors/config/default_global_settings.dart';
import 'package:colors/models/settings/settings_activity.dart';
import 'package:colors/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 DefaultActivitySettings.parameterCodeColorsCount:
content = getColorsCountParameterItem();
break;
case DefaultGlobalSettings.parameterCodeSkin:
content = getColorsThemeParameterItem();
break;
default:
printlog('$ParameterWidget -> 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 getColorsCountParameterItem() {
Color backgroundColor = Colors.grey;
switch (value) {
case DefaultActivitySettings.colorsCountValueLow:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.colorsCountValueMedium:
backgroundColor = Colors.orange;
break;
case DefaultActivitySettings.colorsCountValueHigh:
backgroundColor = Colors.red;
break;
case DefaultActivitySettings.colorsCountValueVeryHigh:
backgroundColor = Colors.purple;
break;
default:
printlog('Wrong value for colorsCount 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 getColorsThemeParameterItem() {
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,
),
);
}
}
......@@ -11,7 +11,7 @@ class ScreenActivity extends StatelessWidget {
Widget build(BuildContext context) {
return BlocBuilder<NavCubitPage, int>(
builder: (BuildContext context, int pageIndex) {
return ActivityPage.getWidget(pageIndex);
return ActivityPage.getWidget(pageIndex, context);
},
);
}
......
import 'package:flutter/material.dart';
import 'package:colors/config/color_theme.dart';
class ColorThemeUtils {
static int getColorsCount(String colorTheme) {
if (ColorTheme.colorThemes.containsKey(colorTheme) &&
null != ColorTheme.colorThemes[colorTheme]) {
List<int> colors = ColorTheme.colorThemes[colorTheme] ?? [];
return colors.length;
}
return 0;
}
static int getColorCode(int? value, String colorTheme) {
if (value != null &&
ColorTheme.colorThemes.containsKey(colorTheme) &&
null != ColorTheme.colorThemes[colorTheme]) {
List<int> skinColors = ColorTheme.colorThemes[colorTheme] ?? [];
return (skinColors[value % getColorsCount(colorTheme)]) | 0xFF000000;
}
return ColorTheme.defaultThemeColor | 0xFF000000;
}
static Color getColor(int? value, String colorTheme) {
return Color(getColorCode(value, colorTheme));
}
static Color getDefaultBorderColor() {
return Colors.grey;
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:colors/common/cubit/nav/nav_cubit_pages.dart';
import 'package:colors/cubit/activity/activity_cubit.dart';
import 'package:colors/ui/parameters/parameter_painter_board_size.dart';
import 'package:colors/ui/parameters/parameter_painter_color_theme.dart';
import 'package:colors/ui/parameters/parameter_painter_colors_count.dart';
import 'package:colors/ui/parameters/parameter_painter_difficulty_level.dart';
class ApplicationConfig {
static const String appTitle = 'Colors';
// known parameters
static const String parameterCodeDifficultyLevel = 'activity.difficultyLevel';
static const String parameterCodeBoardSize = 'activity.boardSize';
static const String parameterCodeColorsCount = 'activity.colorsCount';
static const String parameterCodeColorTheme = 'global.colorTheme';
// difficulty level values
static const String difficultyLevelValueEasy = 'easy';
static const String difficultyLevelValueMedium = 'medium';
static const String difficultyLevelValueHard = 'hard';
static const String difficultyLevelValueNightmare = 'nightmare';
// board size values
static const String boardSizeValueSmall = 'small';
static const String boardSizeValueMedium = 'medium';
static const String boardSizeValueLarge = 'large';
static const String boardSizeValueExtraLarge = 'extra';
// colors count values
static const String colorsCountValueLow = '5';
static const String colorsCountValueMedium = '6';
static const String colorsCountValueHigh = '7';
static const String colorsCountValueVeryHigh = '8';
// colors theme values
static const String colorThemeDefault = 'default';
static const String colorThemeSweethope = 'sweethope';
static const String colorThemeNostalgicDreams = 'nostalgic-dreams';
static const String colorThemeArjibi8 = 'arjibi8';
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Colors',
activitySettings: [
// 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) {
return 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) {
return ParameterPainterBoardSize(value: value, context: context);
},
intValueGetter: (String value) {
const Map<String, int> intValues = {
boardSizeValueSmall: 6,
boardSizeValueMedium: 10,
boardSizeValueLarge: 14,
boardSizeValueExtraLarge: 20,
};
return intValues[value] ?? 0;
},
),
// colors count
ApplicationSettingsParameter(
code: parameterCodeColorsCount,
values: [
ApplicationSettingsParameterItemValue(
value: colorsCountValueLow,
color: Colors.green,
),
ApplicationSettingsParameterItemValue(
value: colorsCountValueMedium,
color: Colors.orange,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: colorsCountValueHigh,
color: Colors.red,
),
ApplicationSettingsParameterItemValue(
value: colorsCountValueVeryHigh,
color: Colors.purple,
),
],
customPainter: (context, value) {
return ParameterPainterColorsCount(value: value, context: context);
},
),
// colors theme
ApplicationSettingsParameter(
code: parameterCodeColorTheme,
displayedOnTop: false,
values: [
ApplicationSettingsParameterItemValue(
value: colorThemeDefault,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: colorThemeSweethope,
),
ApplicationSettingsParameterItemValue(
value: colorThemeNostalgicDreams,
),
ApplicationSettingsParameterItemValue(
value: colorThemeArjibi8,
),
],
customPainter: (context, value) {
return ParameterPainterColorTheme(value: value, context: context);
},
),
],
startNewActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
deleteCurrentActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
BlocProvider.of<ActivityCubit>(context).state.currentActivity.dump();
},
resumeActivity: (BuildContext context) {
BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
BlocProvider.of<NavCubitPage>(context).goToPageGame();
},
);
static int getMovesCountLimitDeltaFromLevelCode(String parameterLevel) {
const Map<String, int> values = {
difficultyLevelValueEasy: 5,
difficultyLevelValueMedium: 3,
difficultyLevelValueHard: 1,
difficultyLevelValueNightmare: -1,
};
return values[parameterLevel] ??
getMovesCountLimitDeltaFromLevelCode(ApplicationConfig.config
.getFromCode(ApplicationConfig.parameterCodeDifficultyLevel)
.defaultValue);
}
}
import 'package:colors/config/default_global_settings.dart';
import 'package:colors/config/application_config.dart';
class ColorTheme {
static const Map<String, List<int>> borderColors = {
DefaultGlobalSettings.skinValueColors: [
static const Map<String, List<int>> colorThemes = {
ApplicationConfig.colorThemeDefault: [
0xffffff,
0xe63a3f,
0x708cfd,
......@@ -13,16 +13,46 @@ class ColorTheme {
0x38ffff,
0xf2739d,
],
// https://lospec.com/palette-list/sweethope
ApplicationConfig.colorThemeSweethope: [
0xffffff,
0x615e85,
0x9c8dc2,
0xd9a3cd,
0xebc3a7,
0xe0e0dc,
0xa3d1af,
0x90b4de,
0x717fb0,
],
// https://lospec.com/palette-list/nostalgic-dreams
ApplicationConfig.colorThemeNostalgicDreams: [
0xffffff,
0xd9af80,
0xb07972,
0x524352,
0x686887,
0x7f9bb0,
0xbfd4b0,
0x90b870,
0x628c70,
],
// https://lospec.com/palette-list/arjibi8
ApplicationConfig.colorThemeArjibi8: [
0xffffff,
0x8bc7bf,
0x5796a1,
0x524bb3,
0x471b6e,
0x702782,
0xb0455a,
0xde8b6f,
0xebd694,
],
};
static const int defaultBorderColor = 0x808080;
static int getColorCode(String skin, int value) {
if (borderColors.containsKey(skin) && null != borderColors[skin]) {
final List<int>? skinColors = borderColors[skin];
if (null != skinColors) {
return skinColors.elementAt(value) | 0xFF000000;
}
}
return defaultBorderColor | 0xFF000000;
}
static const int defaultThemeColor = 0x808080;
}
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 String parameterCodeColorsCount = 'colorsCount';
static const List<String> availableParameters = [
parameterCodeDifficultyLevel,
parameterCodeBoardSize,
parameterCodeColorsCount,
];
// 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;
// colors count: available values
static const String colorsCountValueLow = '5';
static const String colorsCountValueMedium = '6';
static const String colorsCountValueHigh = '7';
static const String colorsCountValueVeryHigh = '8';
static const List<String> allowedColorsCountValues = [
colorsCountValueLow,
colorsCountValueMedium,
colorsCountValueHigh,
colorsCountValueVeryHigh,
];
// colors count: default value
static const String defaultColorsCountValue = colorsCountValueMedium;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeDifficultyLevel:
return DefaultActivitySettings.allowedDifficultyLevelValues;
case parameterCodeBoardSize:
return DefaultActivitySettings.allowedBoardSizeValues;
case parameterCodeColorsCount:
return DefaultActivitySettings.allowedColorsCountValues;
}
printlog('Did not find any available value for game parameter "$parameterCode".');
return [];
}
static int getMovesCountLimitDeltaFromLevelCode(String parameterLevel) {
const Map<String, int> values = {
difficultyLevelValueEasy: 5,
difficultyLevelValueMedium: 3,
difficultyLevelValueHard: 1,
difficultyLevelValueNightmare: -1,
};
return values[parameterLevel] ??
getMovesCountLimitDeltaFromLevelCode(
DefaultActivitySettings.defaultDifficultyLevelValue);
}
}
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 List<String> allowedSkinValues = [
skinValueColors,
];
// skin: default value
static const String defaultSkinValue = skinValueColors;
// 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 'dart:async';
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:colors/models/activity/activity.dart';
import 'package:colors/models/settings/settings_activity.dart';
import 'package:colors/models/settings/settings_global.dart';
part 'activity_state.dart';
......@@ -27,7 +24,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,19 +39,18 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
progressDelta: state.currentActivity.progressDelta,
gameWon: state.currentActivity.gameWon,
);
// game.dump();
// activity.dump();
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();
......@@ -66,6 +61,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
refresh();
}
bool canBeResumed() {
return state.currentActivity.canBeResumed;
}
void quitActivity() {
state.currentActivity.isRunning = false;
refresh();
......@@ -77,8 +76,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
}
void deleteSavedActivity() {
state.currentActivity.isRunning = false;
state.currentActivity.isFinished = true;
updateGameIsRunning(false);
updateGameIsFinished(true);
refresh();
}
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:colors/config/default_activity_settings.dart';
import 'package:colors/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,
String? colorsCount,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
difficultyLevel: difficultyLevel ?? state.settings.difficultyLevel,
parameterSize: boardSize ?? state.settings.parameterSize,
parameterColorsCount: colorsCount ?? state.settings.parameterColorsCount,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodeDifficultyLevel:
return ActivitySettings.getLevelValueFromUnsafe(state.settings.difficultyLevel);
case DefaultActivitySettings.parameterCodeBoardSize:
return ActivitySettings.getSizeValueFromUnsafe(state.settings.parameterSize);
case DefaultActivitySettings.parameterCodeColorsCount:
return ActivitySettings.getColorsValueFromUnsafe(state.settings.parameterColorsCount);
}
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);
final String colorsCount = (code == DefaultActivitySettings.parameterCodeColorsCount)
? value
: getParameterValue(DefaultActivitySettings.parameterCodeColorsCount);
setValues(
difficultyLevel: difficultyLevel,
boardSize: boardSize,
colorsCount: colorsCount,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String difficultyLevel =
json[DefaultActivitySettings.parameterCodeDifficultyLevel] as String;
final String boardSize = json[DefaultActivitySettings.parameterCodeBoardSize] as String;
final String colorsCount =
json[DefaultActivitySettings.parameterCodeColorsCount] as String;
return ActivitySettingsState(
settings: ActivitySettings(
difficultyLevel: difficultyLevel,
parameterSize: boardSize,
parameterColorsCount: colorsCount,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeDifficultyLevel: state.settings.difficultyLevel,
DefaultActivitySettings.parameterCodeBoardSize: state.settings.parameterSize,
DefaultActivitySettings.parameterCodeColorsCount: state.settings.parameterColorsCount,
};
}
}
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:colors/config/default_global_settings.dart';
import 'package:colors/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,
];
}
......@@ -9,8 +9,6 @@ import 'package:colors/common/cubit/nav/nav_cubit_screens.dart';
import 'package:colors/config/application_config.dart';
import 'package:colors/cubit/activity/activity_cubit.dart';
import 'package:colors/cubit/settings/settings_activity_cubit.dart';
import 'package:colors/cubit/settings/settings_global_cubit.dart';
import 'package:colors/ui/skeleton.dart';
void main() async {
......@@ -61,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
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:colors/config/default_activity_settings.dart';
import 'package:colors/config/application_config.dart';
import 'package:colors/models/activity/board.dart';
import 'package:colors/models/settings/settings_activity.dart';
import 'package:colors/models/settings/settings_global.dart';
class Activity {
Activity({
// Settings
required this.activitySettings,
required this.globalSettings,
// State
this.isRunning = false,
......@@ -31,7 +28,6 @@ class Activity {
// Settings
final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
// State
bool isRunning;
......@@ -53,8 +49,7 @@ class Activity {
factory Activity.createEmpty() {
return Activity(
// Settings
activitySettings: ActivitySettings.createDefault(),
globalSettings: GlobalSettings.createDefault(),
activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
// Base data
board: Board.createEmpty(),
);
......@@ -62,30 +57,30 @@ class Activity {
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);
final int baseMaxMovesCount =
(30 * (newActivitySettings.boardSize * newActivitySettings.colorsCount) / (17 * 6))
final int baseMaxMovesCount = (30 *
(newActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize) *
newActivitySettings.getAsInt(ApplicationConfig.parameterCodeColorsCount)) /
(17 * 6))
.round();
final int deltaMovesCountFromLevel =
DefaultActivitySettings.getMovesCountLimitDeltaFromLevelCode(
newActivitySettings.difficultyLevel);
ApplicationConfig.getMovesCountLimitDeltaFromLevelCode(
newActivitySettings.get(ApplicationConfig.parameterCodeDifficultyLevel));
return Activity(
// Settings
activitySettings: newActivitySettings,
globalSettings: newGlobalSettings,
// State
isRunning: true,
// Base data
board: Board.createRandom(newActivitySettings),
// Game data
progress: 1,
progressTotal: newActivitySettings.boardSize * newActivitySettings.boardSize,
progressTotal: newActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize) *
newActivitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize),
maxMovesCount: baseMaxMovesCount + deltaMovesCountFromLevel,
);
}
......@@ -96,15 +91,14 @@ class Activity {
printlog('');
printlog('## Current game dump:');
printlog('');
printlog('$Activity:');
printlog(' Settings');
activitySettings.dump();
globalSettings.dump();
printlog('$Activity:');
printlog(' State');
printlog(' isRunning: $isRunning');
printlog(' isStarted: $isStarted');
printlog(' isFinished: $isFinished');
printlog(' animationInProgress: $animationInProgress');
printlog(' canBeResumed: $canBeResumed');
printlog(' Base data');
board.dump();
printlog(' Game data');
......@@ -113,6 +107,7 @@ class Activity {
printlog(' progress: $progress');
printlog(' progressTotal: $progressTotal');
printlog(' progressDelta: $progressDelta');
printlog(' canBeResumed: $canBeResumed');
printlog(' gameWon: $gameWon');
printlog('');
}
......@@ -126,7 +121,6 @@ class Activity {
return <String, dynamic>{
// Settings
'activitySettings': activitySettings.toJson(),
'globalSettings': globalSettings.toJson(),
// State
'isRunning': isRunning,
'isStarted': isStarted,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment