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

Use ActivityParameters widgets from flutter_custom_toolbox

parent baf036ba
No related branches found
No related tags found
1 merge request!90Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7059 passed
Showing
with 338 additions and 735 deletions
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:random/common/ui/pages/api.dart'; import 'package:random/common/ui/pages/api.dart';
import 'package:random/common/ui/pages/camera.dart'; import 'package:random/common/ui/pages/camera.dart';
import 'package:random/common/ui/pages/demo.dart'; import 'package:random/common/ui/pages/demo.dart';
import 'package:random/common/ui/pages/game.dart';
import 'package:random/common/ui/pages/graph.dart'; import 'package:random/common/ui/pages/graph.dart';
import 'package:random/common/ui/pages/game.dart'; import 'package:random/config/application_config.dart';
import 'package:random/common/ui/pages/parameters.dart';
import 'package:random/cubit/activity/activity_cubit.dart';
import 'package:random/models/activity/activity.dart';
class ActivityPageItem { class ActivityPageItem {
final String code; final String code;
final Icon icon; final Icon icon;
final Widget page; final Widget Function({required Activity currentActivity})? builder;
const ActivityPageItem({ const ActivityPageItem({
required this.code, required this.code,
required this.icon, required this.icon,
required this.page, required this.builder,
}); });
} }
...@@ -24,48 +28,63 @@ class ActivityPage { ...@@ -24,48 +28,63 @@ class ActivityPage {
static const bool displayBottomNavBar = true; static const bool displayBottomNavBar = true;
static const indexHome = 0; static const indexHome = 0;
static const pageHome = ActivityPageItem( static final pageHome = ActivityPageItem(
code: 'page_home', code: 'page_home',
icon: Icon(UniconsLine.home), icon: Icon(UniconsLine.home),
page: PageParameters(), builder: ({required Activity currentActivity}) {
return PageParameters(
config: ApplicationConfig.config,
canBeResumed: currentActivity.canBeResumed,
);
},
); );
static const indexDemo = 1; static const indexDemo = 1;
static const pageDemo = ActivityPageItem( static final pageDemo = ActivityPageItem(
code: 'page_demo', code: 'page_demo',
icon: Icon(UniconsLine.eye), icon: Icon(UniconsLine.eye),
page: PageDemo(), builder: ({required Activity currentActivity}) {
return PageDemo();
},
); );
static const indexGame = 2; static const indexGame = 2;
static const pageGame = ActivityPageItem( static final pageGame = ActivityPageItem(
code: 'page_game', code: 'page_game',
icon: Icon(UniconsLine.star), icon: Icon(UniconsLine.star),
page: PageGame(), builder: ({required Activity currentActivity}) {
return PageGame();
},
); );
static const indexCamera = 3; static const indexCamera = 3;
static const pageCamera = ActivityPageItem( static final pageCamera = ActivityPageItem(
code: 'page_camera', code: 'page_camera',
icon: Icon(UniconsLine.camera), icon: Icon(UniconsLine.camera),
page: PageCamera(), builder: ({required Activity currentActivity}) {
return PageCamera();
},
); );
static const indexGraph = 4; static const indexGraph = 4;
static const pageGraph = ActivityPageItem( static final pageGraph = ActivityPageItem(
code: 'page_graph', code: 'page_graph',
icon: Icon(UniconsLine.pen), icon: Icon(UniconsLine.pen),
page: PageGraph(), builder: ({required Activity currentActivity}) {
return PageGraph();
},
); );
static const indexApi = 5; static const indexApi = 5;
static const pageApi = ActivityPageItem( static final pageApi = ActivityPageItem(
code: 'page_api', code: 'page_api',
icon: Icon(UniconsLine.link), icon: Icon(UniconsLine.link),
page: PageApi(), builder: ({required Activity currentActivity}) {
return PageApi();
},
); );
static const Map<int, ActivityPageItem> items = { static final Map<int, ActivityPageItem> items = {
indexHome: pageHome, indexHome: pageHome,
indexDemo: pageDemo, indexDemo: pageDemo,
indexGame: pageGame, indexGame: pageGame,
...@@ -81,6 +100,16 @@ class ActivityPage { ...@@ -81,6 +100,16 @@ class ActivityPage {
} }
static Widget getWidget(int pageIndex) { 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:random/common/cubit/nav/nav_cubit_pages.dart';
import 'package:random/common/ui/parameters/parameter_widget.dart';
import 'package:random/config/default_activity_settings.dart';
import 'package:random/config/default_global_settings.dart';
import 'package:random/cubit/activity/activity_cubit.dart';
import 'package:random/cubit/settings/settings_activity_cubit.dart';
import 'package:random/cubit/settings/settings_global_cubit.dart';
import 'package:random/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 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/common/ui/parameters/parameter_painter.dart';
import 'package:random/config/default_activity_settings.dart';
import 'package:random/config/default_global_settings.dart';
import 'package:random/models/settings/settings_activity.dart';
import 'package:random/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.parameterCodeBoardSize:
content = getBoardSizeParameterItem();
break;
case DefaultActivitySettings.parameterCodeColorsCount:
content = getColorsCountParameterItem();
break;
case DefaultGlobalSettings.parameterCodeSkin:
content = getSkinParameterItem();
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 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.boardSizeValueExtraLarge:
backgroundColor = Colors.purple;
break;
default:
printlog('Wrong value for size 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.colorsCountVeryLow:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.colorsCountLow:
backgroundColor = Colors.orange;
break;
case DefaultActivitySettings.colorsCountMedium:
backgroundColor = Colors.red;
break;
case DefaultActivitySettings.colorsCountHigh:
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 getSkinParameterItem() {
Color backgroundColor = Colors.grey;
return StyledButton(
color: backgroundColor,
onPressed: onPressed,
child: Text('skin: $value'),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/common/cubit/nav/nav_cubit_pages.dart';
import 'package:random/cubit/activity/activity_cubit.dart';
import 'package:random/ui/parameters/parameter_painter_board_size.dart';
import 'package:random/ui/parameters/parameter_painter_colors_count.dart';
class ApplicationConfig { class ApplicationConfig {
static const String appTitle = 'Random application'; static const String parameterCodeBoardSize = 'boardSize';
static const String parameterCodeColorsCount = 'colorsCount';
static const String boardSizeValueSmall = '6';
static const String boardSizeValueMedium = '10';
static const String boardSizeValueLarge = '16';
static const String boardSizeValueExtraLarge = '24';
static const String colorsCountVeryLow = '4';
static const String colorsCountLow = '5';
static const String colorsCountMedium = '6';
static const String colorsCountHigh = '7';
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Random application',
activitySettings: [
// 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,
),
),
// colors count
ApplicationSettingsParameter(
code: parameterCodeColorsCount,
values: [
ApplicationSettingsParameterItemValue(
value: colorsCountVeryLow,
color: Colors.green,
),
ApplicationSettingsParameterItemValue(
value: colorsCountLow,
color: Colors.orange,
),
ApplicationSettingsParameterItemValue(
value: colorsCountMedium,
color: Colors.red,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: colorsCountHigh,
color: Colors.purple,
),
],
customPainter: (context, value) => ParameterPainterColorsCount(
context: context,
value: value,
),
),
],
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 parameterCodeBoardSize = 'boardSize';
static const String parameterCodeColorsCount = 'colorsCount';
static const List<String> availableParameters = [
parameterCodeBoardSize,
parameterCodeColorsCount,
];
// board size: available values
static const String boardSizeValueSmall = '6';
static const String boardSizeValueMedium = '10';
static const String boardSizeValueLarge = '16';
static const String boardSizeValueExtraLarge = '24';
static const List<String> allowedBoardSizeValues = [
boardSizeValueSmall,
boardSizeValueMedium,
boardSizeValueLarge,
boardSizeValueExtraLarge,
];
// board size: default value
static const String defaultBoardSizeValue = boardSizeValueLarge;
// colors count: available values
static const String colorsCountVeryLow = '4';
static const String colorsCountLow = '5';
static const String colorsCountMedium = '6';
static const String colorsCountHigh = '7';
static const List<String> allowedColorsCountValues = [
colorsCountVeryLow,
colorsCountLow,
colorsCountMedium,
colorsCountHigh,
];
// colors count: default value
static const String defaultColorsCountValue = colorsCountMedium;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeBoardSize:
return DefaultActivitySettings.allowedBoardSizeValues;
case parameterCodeColorsCount:
return DefaultActivitySettings.allowedColorsCountValues;
}
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 skinValueDefault = 'default';
static const List<String> allowedSkinValues = [
skinValueDefault,
];
// skin: default value
static const String defaultSkinValue = skinValueDefault;
// 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 [];
}
}
...@@ -2,8 +2,6 @@ import 'package:flutter/material.dart'; ...@@ -2,8 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/models/activity/activity.dart'; import 'package:random/models/activity/activity.dart';
import 'package:random/models/settings/settings_activity.dart';
import 'package:random/models/settings/settings_global.dart';
part 'activity_state.dart'; part 'activity_state.dart';
...@@ -22,7 +20,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -22,7 +20,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
void refresh() { void refresh() {
final Activity activity = Activity( final Activity activity = Activity(
activitySettings: state.currentActivity.activitySettings, activitySettings: state.currentActivity.activitySettings,
globalSettings: state.currentActivity.globalSettings,
isRunning: state.currentActivity.isRunning, isRunning: state.currentActivity.isRunning,
board: state.currentActivity.board, board: state.currentActivity.board,
); );
...@@ -31,14 +28,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -31,14 +28,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
updateState(activity); updateState(activity);
} }
void startNewActivity({ void startNewActivity(BuildContext context) {
required ActivitySettings activitySettings, final ActivitySettingsCubit activitySettingsCubit =
required GlobalSettings globalSettings, BlocProvider.of<ActivitySettingsCubit>(context);
}) {
final Activity newActivity = Activity.createNew( final Activity newActivity = Activity.createNew(
// Settings // Settings
activitySettings: activitySettings, activitySettings: activitySettingsCubit.state.settings,
globalSettings: globalSettings,
); );
newActivity.dump(); newActivity.dump();
...@@ -47,6 +43,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -47,6 +43,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
refresh(); refresh();
} }
bool canBeResumed() {
return state.currentActivity.canBeResumed;
}
void quitActivity() { void quitActivity() {
state.currentActivity.isRunning = false; state.currentActivity.isRunning = false;
refresh(); refresh();
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/config/default_activity_settings.dart';
import 'package:random/models/settings/settings_activity.dart';
part 'settings_activity_state.dart';
class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({
String? itemsCount,
String? timerValue,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
boardSize: itemsCount ?? state.settings.boardSize,
colorsCount: timerValue ?? state.settings.colorsCount,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodeBoardSize:
return ActivitySettings.getItemsCountValueFromUnsafe(state.settings.boardSize);
case DefaultActivitySettings.parameterCodeColorsCount:
return ActivitySettings.getTimerValueFromUnsafe(state.settings.colorsCount);
}
return '';
}
void setParameterValue(String code, String value) {
final String itemsCount = code == DefaultActivitySettings.parameterCodeBoardSize
? value
: getParameterValue(DefaultActivitySettings.parameterCodeBoardSize);
final String timerValue = code == DefaultActivitySettings.parameterCodeColorsCount
? value
: getParameterValue(DefaultActivitySettings.parameterCodeColorsCount);
setValues(
itemsCount: itemsCount,
timerValue: timerValue,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String itemsCount = json[DefaultActivitySettings.parameterCodeBoardSize] as String;
final String timerValue = json[DefaultActivitySettings.parameterCodeColorsCount] as String;
return ActivitySettingsState(
settings: ActivitySettings(
boardSize: itemsCount,
colorsCount: timerValue,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeBoardSize: state.settings.boardSize,
DefaultActivitySettings.parameterCodeColorsCount: state.settings.colorsCount,
};
}
}
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:random/config/default_global_settings.dart';
import 'package:random/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,12 +8,12 @@ import 'package:random/common/cubit/nav/nav_cubit_pages.dart'; ...@@ -8,12 +8,12 @@ import 'package:random/common/cubit/nav/nav_cubit_pages.dart';
import 'package:random/common/cubit/nav/nav_cubit_screens.dart'; import 'package:random/common/cubit/nav/nav_cubit_screens.dart';
import 'package:random/config/application_config.dart'; import 'package:random/config/application_config.dart';
import 'package:random/cubit/settings/settings_cubit.dart';
import 'package:random/cubit/activity/activity_cubit.dart'; import 'package:random/cubit/activity/activity_cubit.dart';
import 'package:random/cubit/activity/api_cubit.dart'; import 'package:random/cubit/activity/api_cubit.dart';
import 'package:random/cubit/activity/data_cubit.dart'; import 'package:random/cubit/activity/data_cubit.dart';
import 'package:random/cubit/settings/settings_activity_cubit.dart';
import 'package:random/cubit/settings/settings_cubit.dart';
import 'package:random/cubit/settings/settings_global_cubit.dart';
import 'package:random/network/api.dart'; import 'package:random/network/api.dart';
import 'package:random/repository/api.dart'; import 'package:random/repository/api.dart';
import 'package:random/ui/skeleton.dart'; import 'package:random/ui/skeleton.dart';
...@@ -61,11 +61,8 @@ class MyApp extends StatelessWidget { ...@@ -61,11 +61,8 @@ class MyApp extends StatelessWidget {
BlocProvider<ActivityCubit>( BlocProvider<ActivityCubit>(
create: (context) => ActivityCubit(), create: (context) => ActivityCubit(),
), ),
BlocProvider<GlobalSettingsCubit>(
create: (context) => GlobalSettingsCubit(),
),
BlocProvider<ActivitySettingsCubit>( BlocProvider<ActivitySettingsCubit>(
create: (context) => ActivitySettingsCubit(), create: (context) => ActivitySettingsCubit(appConfig: ApplicationConfig.config),
), ),
// custom providers // custom providers
...@@ -89,7 +86,7 @@ class MyApp extends StatelessWidget { ...@@ -89,7 +86,7 @@ class MyApp extends StatelessWidget {
child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>( child: BlocBuilder<ApplicationThemeModeCubit, ApplicationThemeModeState>(
builder: (BuildContext context, ApplicationThemeModeState state) { builder: (BuildContext context, ApplicationThemeModeState state) {
return MaterialApp( return MaterialApp(
title: ApplicationConfig.appTitle, title: ApplicationConfig.config.appTitle,
home: const SkeletonScreen(), home: const SkeletonScreen(),
// Theme stuff // Theme stuff
......
...@@ -2,15 +2,13 @@ import 'dart:math'; ...@@ -2,15 +2,13 @@ import 'dart:math';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/config/application_config.dart';
import 'package:random/models/activity/game_board.dart'; import 'package:random/models/activity/game_board.dart';
import 'package:random/models/activity/game_cell.dart'; import 'package:random/models/activity/game_cell.dart';
import 'package:random/models/settings/settings_activity.dart';
import 'package:random/models/settings/settings_global.dart';
class Activity { class Activity {
GameBoard board; GameBoard board;
ActivitySettings activitySettings; ActivitySettings activitySettings;
GlobalSettings globalSettings;
bool isRunning = false; bool isRunning = false;
bool isFinished = false; bool isFinished = false;
int availableBlocksCount = 0; int availableBlocksCount = 0;
...@@ -20,30 +18,27 @@ class Activity { ...@@ -20,30 +18,27 @@ class Activity {
Activity({ Activity({
required this.board, required this.board,
required this.activitySettings, required this.activitySettings,
required this.globalSettings,
this.isRunning = false, this.isRunning = false,
}); });
factory Activity.createNull() { factory Activity.createNull() {
return Activity( return Activity(
// Settings
activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
// Base data
board: GameBoard.createNull(), board: GameBoard.createNull(),
activitySettings: ActivitySettings.createDefault(),
globalSettings: GlobalSettings.createDefault(),
); );
} }
factory Activity.createNew({ factory Activity.createNew({
ActivitySettings? activitySettings, ActivitySettings? activitySettings,
GlobalSettings? globalSettings,
}) { }) {
ActivitySettings newActivitySettings = ActivitySettings newActivitySettings = activitySettings ??
activitySettings ?? ActivitySettings.createDefault(); ActivitySettings.createDefault(appConfig: ApplicationConfig.config);
GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
return Activity( return Activity(
board: GameBoard.createRandom(newActivitySettings), board: GameBoard.createRandom(newActivitySettings),
activitySettings: newActivitySettings, activitySettings: newActivitySettings,
globalSettings: newGlobalSettings,
isRunning: true, isRunning: true,
); );
} }
...@@ -68,7 +63,7 @@ class Activity { ...@@ -68,7 +63,7 @@ class Activity {
} }
void setRandomCellValue(int x, int y, ActivitySettings settings) { void setRandomCellValue(int x, int y, ActivitySettings settings) {
final int maxValue = settings.colorsCountValue; final int maxValue = settings.getAsInt(ApplicationConfig.parameterCodeColorsCount);
final rand = Random(); final rand = Random();
int value = 1 + rand.nextInt(maxValue); int value = 1 + rand.nextInt(maxValue);
......
...@@ -2,8 +2,8 @@ import 'dart:math'; ...@@ -2,8 +2,8 @@ import 'dart:math';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/config/application_config.dart';
import 'package:random/models/activity/game_cell.dart'; import 'package:random/models/activity/game_cell.dart';
import 'package:random/models/settings/settings_activity.dart';
class GameBoard { class GameBoard {
final List<List<GameCell>> cells; final List<List<GameCell>> cells;
...@@ -17,9 +17,11 @@ class GameBoard { ...@@ -17,9 +17,11 @@ class GameBoard {
} }
factory GameBoard.createRandom(ActivitySettings activitySettings) { factory GameBoard.createRandom(ActivitySettings activitySettings) {
final int boardSizeHorizontal = activitySettings.boardSizeValue; final int boardSizeHorizontal =
final int boardSizeVertical = activitySettings.boardSizeValue; activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
final int maxValue = activitySettings.colorsCountValue; final int boardSizeVertical =
activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
final int maxValue = activitySettings.getAsInt(ApplicationConfig.parameterCodeColorsCount);
final rand = Random(); final rand = Random();
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/config/default_activity_settings.dart';
class ActivitySettings {
final String boardSize;
final String colorsCount;
ActivitySettings({
required this.boardSize,
required this.colorsCount,
});
// Getters to convert String to int
int get boardSizeValue => int.parse(boardSize);
int get colorsCountValue => int.parse(colorsCount);
static String getItemsCountValueFromUnsafe(String itemsCount) {
if (DefaultActivitySettings.allowedBoardSizeValues.contains(itemsCount)) {
return itemsCount;
}
return DefaultActivitySettings.defaultBoardSizeValue;
}
static String getTimerValueFromUnsafe(String timerValue) {
if (DefaultActivitySettings.allowedColorsCountValues.contains(timerValue)) {
return timerValue;
}
return DefaultActivitySettings.defaultColorsCountValue;
}
factory ActivitySettings.createDefault() {
return ActivitySettings(
boardSize: DefaultActivitySettings.defaultBoardSizeValue,
colorsCount: DefaultActivitySettings.defaultColorsCountValue,
);
}
void dump() {
printlog('$ActivitySettings:');
printlog(' ${DefaultActivitySettings.parameterCodeBoardSize}: $boardSize');
printlog(' ${DefaultActivitySettings.parameterCodeColorsCount}: $colorsCount');
printlog('');
}
@override
String toString() {
return '$ActivitySettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeBoardSize: boardSize,
DefaultActivitySettings.parameterCodeColorsCount: colorsCount,
};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/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,
};
}
}
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:random/config/application_config.dart';
class ParameterPainterBoardSize extends CustomPainter {
const ParameterPainterBoardSize({
required this.context,
required this.value,
});
final BuildContext context;
final String value;
@override
void paint(Canvas canvas, Size size) {
// force square
final double canvasSize = min(size.width, size.height);
int gridWidth = 1;
switch (value) {
case ApplicationConfig.boardSizeValueSmall:
gridWidth = 2;
break;
case ApplicationConfig.boardSizeValueMedium:
gridWidth = 3;
break;
case ApplicationConfig.boardSizeValueLarge:
gridWidth = 4;
break;
case ApplicationConfig.boardSizeValueExtraLarge:
gridWidth = 5;
break;
default:
printlog('Wrong value for boardSize parameter value: $value');
}
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3 / 100 * canvasSize;
// Mini grid
final squareBackgroundColor = Colors.grey.shade200;
final squareBorderColor = Colors.grey.shade800;
final double cellSize = canvasSize / 7;
final double origin = (canvasSize - 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);
}
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}
...@@ -3,133 +3,20 @@ import 'dart:math'; ...@@ -3,133 +3,20 @@ import 'dart:math';
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:random/config/default_activity_settings.dart'; class ParameterPainterColorsCount extends CustomPainter {
import 'package:random/models/settings/settings_activity.dart'; const ParameterPainterColorsCount({
import 'package:random/models/settings/settings_global.dart'; required this.context,
class ParameterPainter extends CustomPainter {
const ParameterPainter({
required this.code,
required this.value, required this.value,
required this.activitySettings,
required this.globalSettings,
}); });
final String code; final BuildContext context;
final String value; final String value;
final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
@override @override
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
// force square // force square
final double canvasSize = min(size.width, size.height); final double canvasSize = min(size.width, size.height);
// content
switch (code) {
case DefaultActivitySettings.parameterCodeBoardSize:
paintBoardSizeParameterItem(canvas, canvasSize);
break;
case DefaultActivitySettings.parameterCodeColorsCount:
paintColorsCountParameterItem(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 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.boardSizeValueExtraLarge:
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(); final paint = Paint();
paint.strokeJoin = StrokeJoin.round; paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3; paint.strokeWidth = 3;
...@@ -146,9 +33,9 @@ class ParameterPainter extends CustomPainter { ...@@ -146,9 +33,9 @@ class ParameterPainter extends CustomPainter {
Offset(0, 1), Offset(0, 1),
]; ];
final double padding = 4 / 100 * size; final double padding = 4 / 100 * canvasSize;
final double margin = 3 / 100 * size; final double margin = 3 / 100 * canvasSize;
final double width = ((size - 2 * padding) / 3) - 2 * margin; final double width = ((canvasSize - 2 * padding) / 3) - 2 * margin;
final int maxValue = int.parse(value); final int maxValue = int.parse(value);
for (int colorIndex = 0; colorIndex < maxValue; colorIndex++) { for (int colorIndex = 0; colorIndex < maxValue; colorIndex++) {
...@@ -175,7 +62,7 @@ class ParameterPainter extends CustomPainter { ...@@ -175,7 +62,7 @@ class ParameterPainter extends CustomPainter {
text: value.toString(), text: value.toString(),
style: TextStyle( style: TextStyle(
color: Colors.black, color: Colors.black,
fontSize: size / 4, fontSize: canvasSize / 4,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
); );
...@@ -188,9 +75,14 @@ class ParameterPainter extends CustomPainter { ...@@ -188,9 +75,14 @@ class ParameterPainter extends CustomPainter {
textPainter.paint( textPainter.paint(
canvas, canvas,
Offset( Offset(
(size - textPainter.width) * 0.5, (canvasSize - textPainter.width) * 0.5,
(size - textPainter.height) * 0.5, (canvasSize - textPainter.height) * 0.5,
), ),
); );
} }
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
} }
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:random/config/application_config.dart';
import 'package:random/cubit/activity/activity_cubit.dart'; import 'package:random/cubit/activity/activity_cubit.dart';
import 'package:random/models/activity/activity.dart'; import 'package:random/models/activity/activity.dart';
import 'package:random/models/settings/settings_activity.dart';
import 'package:random/ui/painters/cell_painter.dart'; import 'package:random/ui/painters/cell_painter.dart';
import 'package:random/ui/widgets/game/game_score.dart'; import 'package:random/ui/widgets/game/game_score.dart';
...@@ -25,7 +25,7 @@ class _GameBoardWidget extends State<GameBoardWidget> with TickerProviderStateMi ...@@ -25,7 +25,7 @@ class _GameBoardWidget extends State<GameBoardWidget> with TickerProviderStateMi
List<List<Animation<double>?>> animations = []; List<List<Animation<double>?>> animations = [];
void resetAnimations(ActivitySettings activitySettings) { void resetAnimations(ActivitySettings activitySettings) {
final int boardSize = activitySettings.boardSizeValue; final int boardSize = activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
animations = List.generate( animations = List.generate(
boardSize, boardSize,
...@@ -93,8 +93,10 @@ class _GameBoardWidget extends State<GameBoardWidget> with TickerProviderStateMi ...@@ -93,8 +93,10 @@ class _GameBoardWidget extends State<GameBoardWidget> with TickerProviderStateMi
final double widgetWidth = widget.widgetSize.width; final double widgetWidth = widget.widgetSize.width;
final double widgetHeight = widget.widgetSize.height; final double widgetHeight = widget.widgetSize.height;
final int rowsCount = widget.activity.activitySettings.boardSizeValue; final int rowsCount =
final int columnsCount = widget.activity.activitySettings.boardSizeValue; widget.activity.activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
final int columnsCount =
widget.activity.activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
final double cellWidth = widgetWidth / columnsCount; final double cellWidth = widgetWidth / columnsCount;
final double cellHeight = widgetHeight / rowsCount; final double cellHeight = widgetHeight / rowsCount;
...@@ -147,8 +149,10 @@ class _GameBoardWidget extends State<GameBoardWidget> with TickerProviderStateMi ...@@ -147,8 +149,10 @@ class _GameBoardWidget extends State<GameBoardWidget> with TickerProviderStateMi
final double widgetWidth = widget.widgetSize.width; final double widgetWidth = widget.widgetSize.width;
final double widgetHeight = widget.widgetSize.height; final double widgetHeight = widget.widgetSize.height;
final int rowsCount = widget.activity.activitySettings.boardSizeValue; final int rowsCount =
final int columnsCount = widget.activity.activitySettings.boardSizeValue; widget.activity.activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
final int columnsCount =
widget.activity.activitySettings.getAsInt(ApplicationConfig.parameterCodeBoardSize);
return GestureDetector( return GestureDetector(
child: buildBoard(), child: buildBoard(),
......
...@@ -20,8 +20,7 @@ class GameScoreWidget extends StatelessWidget { ...@@ -20,8 +20,7 @@ class GameScoreWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const Text('Settings:'), const Text('Settings:'),
Text(' board size: ${activity.activitySettings.boardSize}'), Text(' ${activity.activitySettings}'),
Text(' colors count: ${activity.activitySettings.colorsCount}'),
const Text('Game:'), const Text('Game:'),
Text(' isRunning: ${activity.isRunning}'), Text(' isRunning: ${activity.isRunning}'),
Text(' isFinished: ${activity.isFinished}'), Text(' isFinished: ${activity.isFinished}'),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment