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

Use ActivityParameters widgets from flutter_custom_toolbox

parent 38a5bc82
Branches
Tags
1 merge request!45Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7045 passed
Showing
with 254 additions and 1015 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:momomotus/common/ui/pages/game.dart';
import 'package:momomotus/common/ui/pages/parameters.dart';
import 'package:momomotus/cubit/activity/activity_cubit.dart';
import 'package:momomotus/config/application_config.dart';
import 'package:momomotus/models/activity/activity.dart';
import 'package:momomotus/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:momomotus/common/cubit/nav/nav_cubit_pages.dart';
import 'package:momomotus/common/ui/parameters/parameter_widget.dart';
import 'package:momomotus/config/default_activity_settings.dart';
import 'package:momomotus/config/default_global_settings.dart';
import 'package:momomotus/cubit/activity/activity_cubit.dart';
import 'package:momomotus/cubit/settings/settings_activity_cubit.dart';
import 'package:momomotus/cubit/settings/settings_global_cubit.dart';
import 'package:momomotus/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:momomotus/config/default_activity_settings.dart';
import 'package:momomotus/models/settings/settings_activity.dart';
import 'package:momomotus/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.parameterCodeLang:
paintLangParameterItem(canvas, canvasSize);
break;
case DefaultActivitySettings.parameterCodeLength:
paintLengthParameterItem(canvas, canvasSize);
break;
case DefaultActivitySettings.parameterCodeLevel:
paintLevelParameterItem(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 paintLangParameterItem(
final Canvas canvas,
final double size,
) {
const itemCountEmoji = '💬\n';
String text = '';
switch (value) {
case DefaultActivitySettings.lengthValue4:
text = '⭐';
break;
case DefaultActivitySettings.lengthValue5:
text = itemCountEmoji + DefaultActivitySettings.lengthValue5.toString();
break;
case DefaultActivitySettings.lengthValue6:
text = itemCountEmoji + DefaultActivitySettings.lengthValue6.toString();
break;
case DefaultActivitySettings.lengthValue7:
text = itemCountEmoji + DefaultActivitySettings.lengthValue7.toString();
break;
default:
printlog('Wrong value for lang parameter value: $value');
return;
}
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3 / 100 * size;
// centered text value
final textSpan = TextSpan(
text: text,
style: TextStyle(
color: Colors.black,
fontSize: size / 2.6,
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 paintLengthParameterItem(
final Canvas canvas,
final double size,
) {
const itemCountEmoji = '💬\n';
final String text = itemCountEmoji + value.toString();
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3 / 100 * size;
// centered text value
final textSpan = TextSpan(
text: text,
style: TextStyle(
color: Colors.black,
fontSize: size / 2.6,
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 paintLevelParameterItem(
final Canvas canvas,
final double size,
) {
String text = '';
switch (value) {
case DefaultActivitySettings.levelValueEasy:
text = '🧒';
break;
case DefaultActivitySettings.levelValueNormal:
text = '🤯';
break;
default:
printlog('Wrong value for level parameter value: $value');
return;
}
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3;
// centered text value
final textSpan = TextSpan(
text: text,
style: TextStyle(
color: Colors.black,
fontSize: size / 2.6,
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,
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:momomotus/common/ui/parameters/parameter_painter.dart';
import 'package:momomotus/config/default_activity_settings.dart';
import 'package:momomotus/config/default_global_settings.dart';
import 'package:momomotus/models/settings/settings_activity.dart';
import 'package:momomotus/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.parameterCodeLang:
content = getLangParameterItem();
break;
case DefaultActivitySettings.parameterCodeLength:
content = getLengthParameterItem();
break;
case DefaultActivitySettings.parameterCodeLevel:
content = getLevelParameterItem();
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 getLangParameterItem() {
Color backgroundColor = Colors.grey;
switch (value) {
case DefaultActivitySettings.lengthValue4:
backgroundColor = Colors.grey;
break;
case DefaultActivitySettings.lengthValue5:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.lengthValue6:
backgroundColor = Colors.orange;
break;
case DefaultActivitySettings.lengthValue7:
backgroundColor = Colors.red;
break;
default:
printlog('Wrong value for lang 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 getLengthParameterItem() {
Color backgroundColor = Colors.grey;
switch (value) {
case DefaultActivitySettings.lengthValue4:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.lengthValue5:
backgroundColor = Colors.yellow;
break;
case DefaultActivitySettings.lengthValue6:
backgroundColor = Colors.orange;
break;
case DefaultActivitySettings.lengthValue7:
backgroundColor = Colors.red;
break;
case DefaultActivitySettings.lengthValue8:
backgroundColor = Colors.purple;
break;
default:
printlog('Wrong value for length 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 getLevelParameterItem() {
Color backgroundColor = Colors.grey;
switch (value) {
case DefaultActivitySettings.levelValueEasy:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.levelValueNormal:
backgroundColor = Colors.orange;
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() {
return StyledButton(
color: Colors.green.shade800,
onPressed: onPressed,
child: Image(
image: AssetImage('assets/ui/${DefaultGlobalSettings.parameterCodeSkin}_$value.png'),
fit: BoxFit.fill,
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:momomotus/common/cubit/nav/nav_cubit_pages.dart';
import 'package:momomotus/cubit/activity/activity_cubit.dart';
import 'package:momomotus/ui/parameters/parameter_painter_difficulty_level.dart';
class ApplicationConfig {
static const String appTitle = 'Momomotus';
static const String parameterCodeSkin = 'global.skin';
static const String parameterCodeLang = 'activity.lang';
static const String parameterCodeWordLength = 'activity.wordLength';
static const String parameterCodeDifficultyLevel = 'activity.difficultyLevel';
static const String skinValueDefault = 'default';
static const String langValueFr = 'fr';
static const String wordLengthValue4 = '4';
static const String wordLengthValue5 = '5';
static const String wordLengthValue6 = '6';
static const String wordLengthValue7 = '7';
static const String wordLengthValue8 = '8';
static const String difficultyLevelValueEasy = 'easy';
static const String difficultyLevelValueNormal = 'normal';
static const int maxGuessesCount = 7;
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Momomotus',
activitySettings: [
// skin
ApplicationSettingsParameter(
code: parameterCodeSkin,
values: [
ApplicationSettingsParameterItemValue(
value: skinValueDefault,
isDefault: true,
),
],
),
// lang
ApplicationSettingsParameter(
code: parameterCodeLang,
values: [
ApplicationSettingsParameterItemValue(
value: langValueFr,
isDefault: true,
),
],
),
// word length
ApplicationSettingsParameter(
code: parameterCodeWordLength,
values: [
ApplicationSettingsParameterItemValue(
value: wordLengthValue4,
color: Colors.green,
text: '4️⃣',
),
ApplicationSettingsParameterItemValue(
value: wordLengthValue5,
color: Colors.yellow,
text: '5️⃣',
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: wordLengthValue6,
color: Colors.orange,
text: '6️⃣',
),
ApplicationSettingsParameterItemValue(
value: wordLengthValue7,
color: Colors.red,
text: '7️⃣',
),
ApplicationSettingsParameterItemValue(
value: wordLengthValue8,
color: Colors.purple,
text: '8️⃣',
),
],
),
// difficulty level
ApplicationSettingsParameter(
code: parameterCodeDifficultyLevel,
values: [
ApplicationSettingsParameterItemValue(
value: difficultyLevelValueEasy,
color: Colors.green,
isDefault: true,
),
ApplicationSettingsParameterItemValue(
value: difficultyLevelValueNormal,
color: Colors.orange,
),
],
customPainter: (context, value) => ParameterPainterDifficultyLevel(
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 parameterCodeLang = 'lang';
static const String parameterCodeLength = 'length';
static const String parameterCodeLevel = 'level';
static const List<String> availableParameters = [
parameterCodeLang,
parameterCodeLength,
parameterCodeLevel,
];
// lang: available values
static const String langValueFr = 'fr';
static const List<String> allowedLangValues = [
langValueFr,
];
// lang: default value
static const String defaultLangValue = langValueFr;
// length: available values
static const String lengthValue4 = '4';
static const String lengthValue5 = '5';
static const String lengthValue6 = '6';
static const String lengthValue7 = '7';
static const String lengthValue8 = '8';
static const List<String> allowedLengthValues = [
lengthValue4,
lengthValue5,
lengthValue6,
lengthValue7,
lengthValue8,
];
// length: default value
static const String defaultLengthValue = lengthValue5;
// level: available values
static const String levelValueEasy = 'easy';
static const String levelValueNormal = 'normal';
static const List<String> allowedLevelValues = [
levelValueEasy,
levelValueNormal,
];
// level: default value
static const String defaultLevelValue = levelValueEasy;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeLang:
return DefaultActivitySettings.allowedLangValues;
case parameterCodeLength:
return DefaultActivitySettings.allowedLengthValues;
case parameterCodeLevel:
return DefaultActivitySettings.allowedLevelValues;
}
printlog('Did not find any available value for game parameter "$parameterCode".');
return [];
}
static const int maxGuessesCount = 7;
}
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 [];
}
}
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:momomotus/config/application_config.dart';
import 'package:momomotus/models/activity/activity.dart';
import 'package:momomotus/models/settings/settings_activity.dart';
import 'package:momomotus/models/settings/settings_global.dart';
part 'activity_state.dart';
......@@ -23,7 +22,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,
......@@ -42,13 +40,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(
activitySettings: activitySettings,
globalSettings: globalSettings,
// Settings
activitySettings: activitySettingsCubit.state.settings,
);
newActivity.dump();
......@@ -57,6 +55,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
refresh();
}
bool canBeResumed() {
return state.currentActivity.canBeResumed;
}
void quitActivity() {
state.currentActivity.isRunning = false;
refresh();
......@@ -75,7 +77,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
void currentGuessAddLetter(String letter) {
if (state.currentActivity.currentGuess.length <
int.parse(state.currentActivity.activitySettings.length)) {
int.parse(state.currentActivity.activitySettings
.get(ApplicationConfig.parameterCodeWordLength))) {
state.currentActivity.currentGuess = state.currentActivity.currentGuess + letter;
refresh();
}
......@@ -93,7 +96,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
state.currentActivity.isStarted = true;
if (state.currentActivity.currentGuess.length ==
int.parse(state.currentActivity.activitySettings.length)) {
int.parse(state.currentActivity.activitySettings
.get(ApplicationConfig.parameterCodeWordLength))) {
if (state.currentActivity.currentGuess == state.currentActivity.word) {
printlog('Word found!');
state.currentActivity.foundWord = true;
......@@ -131,7 +135,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
List<String> getTips(String candidate) {
String word = state.currentActivity.word;
final int wordLength = int.parse(state.currentActivity.activitySettings.length);
final int wordLength = int.parse(
state.currentActivity.activitySettings.get(ApplicationConfig.parameterCodeWordLength));
final List<String> tips = List<String>.filled(wordLength, '', growable: false);
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:momomotus/config/default_activity_settings.dart';
import 'package:momomotus/models/settings/settings_activity.dart';
part 'settings_activity_state.dart';
class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({
String? lang,
String? length,
String? level,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
lang: lang ?? state.settings.lang,
length: length ?? state.settings.length,
level: level ?? state.settings.level,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodeLang:
return ActivitySettings.getLangValueFromUnsafe(state.settings.lang);
case DefaultActivitySettings.parameterCodeLength:
return ActivitySettings.getLengthValueFromUnsafe(state.settings.length);
case DefaultActivitySettings.parameterCodeLevel:
return ActivitySettings.getLevelValueFromUnsafe(state.settings.level);
}
return '';
}
void setParameterValue(String code, String value) {
final String lang = code == DefaultActivitySettings.parameterCodeLang
? value
: getParameterValue(DefaultActivitySettings.parameterCodeLang);
final String length = code == DefaultActivitySettings.parameterCodeLength
? value
: getParameterValue(DefaultActivitySettings.parameterCodeLength);
final String level = code == DefaultActivitySettings.parameterCodeLevel
? value
: getParameterValue(DefaultActivitySettings.parameterCodeLevel);
setValues(
lang: lang,
length: length,
level: level,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String lang = json[DefaultActivitySettings.parameterCodeLang] as String;
final String length = json[DefaultActivitySettings.parameterCodeLength] as String;
final String level = json[DefaultActivitySettings.parameterCodeLevel] as String;
return ActivitySettingsState(
settings: ActivitySettings(
lang: lang,
length: length,
level: level,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeLang: state.settings.lang,
DefaultActivitySettings.parameterCodeLength: state.settings.length,
DefaultActivitySettings.parameterCodeLevel: state.settings.level,
};
}
}
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:momomotus/config/default_global_settings.dart';
import 'package:momomotus/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:momomotus/common/cubit/nav/nav_cubit_pages.dart';
import 'package:momomotus/common/cubit/nav/nav_cubit_screens.dart';
import 'package:momomotus/config/application_config.dart';
import 'package:momomotus/config/default_global_settings.dart';
import 'package:momomotus/cubit/activity/activity_cubit.dart';
import 'package:momomotus/cubit/settings/settings_activity_cubit.dart';
import 'package:momomotus/cubit/settings/settings_global_cubit.dart';
import 'package:momomotus/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
......@@ -112,7 +106,9 @@ class MyApp extends StatelessWidget {
'wrong',
];
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');
}
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:momomotus/config/default_activity_settings.dart';
import 'package:momomotus/config/application_config.dart';
import 'package:momomotus/data/fetch_data_helper.dart';
import 'package:momomotus/models/settings/settings_activity.dart';
import 'package:momomotus/models/settings/settings_global.dart';
class Activity {
Activity({
// Settings
required this.activitySettings,
required this.globalSettings,
// State
this.isRunning = false,
......@@ -29,7 +26,6 @@ class Activity {
// Settings
final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
// State
bool isRunning;
......@@ -49,8 +45,7 @@ class Activity {
factory Activity.createEmpty() {
return Activity(
// Settings
activitySettings: ActivitySettings.createDefault(),
globalSettings: GlobalSettings.createDefault(),
activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
// Base data
word: '',
dictionary: [],
......@@ -61,21 +56,19 @@ 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 String pickedWord = FetchDataHelper().getRandomWord(
lang: newActivitySettings.lang,
length: newActivitySettings.length,
level: newActivitySettings.level,
lang: newActivitySettings.get(ApplicationConfig.parameterCodeLang),
length: newActivitySettings.get(ApplicationConfig.parameterCodeWordLength),
level: newActivitySettings.get(ApplicationConfig.parameterCodeDifficultyLevel),
);
final List<String> dictionary = FetchDataHelper().getDictionary(
lang: newActivitySettings.lang,
length: newActivitySettings.length,
lang: newActivitySettings.get(ApplicationConfig.parameterCodeLang),
length: newActivitySettings.get(ApplicationConfig.parameterCodeWordLength),
);
// Starts with first letter revealed
......@@ -84,7 +77,6 @@ class Activity {
return Activity(
// Settings
activitySettings: newActivitySettings,
globalSettings: newGlobalSettings,
// State
isRunning: true,
// Base data
......@@ -99,7 +91,7 @@ class Activity {
bool get canBeResumed => isStarted && !isFinished;
bool get gameWon => isRunning && isStarted && isFinished;
bool get isFinished {
if (foundWord || (guesses.length >= DefaultActivitySettings.maxGuessesCount)) {
if (foundWord || (guesses.length >= ApplicationConfig.maxGuessesCount)) {
return true;
}
......@@ -107,7 +99,8 @@ class Activity {
}
bool checkWordIsValid(String candidate) {
final int length = int.parse(activitySettings.length);
final int length =
int.parse(activitySettings.get(ApplicationConfig.parameterCodeWordLength));
return (word.length == length) &&
(candidate.length == length) &&
......@@ -121,7 +114,6 @@ class Activity {
printlog('$Activity:');
printlog(' Settings');
activitySettings.dump();
globalSettings.dump();
printlog(' State');
printlog(' isRunning: $isRunning');
printlog(' isStarted: $isStarted');
......@@ -147,7 +139,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:momomotus/config/default_activity_settings.dart';
class ActivitySettings {
final String lang;
final String length;
final String level;
ActivitySettings({
required this.lang,
required this.length,
required this.level,
});
static String getLangValueFromUnsafe(String lang) {
if (DefaultActivitySettings.allowedLangValues.contains(lang)) {
return lang;
}
return DefaultActivitySettings.defaultLangValue;
}
static String getLengthValueFromUnsafe(String length) {
if (DefaultActivitySettings.allowedLengthValues.contains(length)) {
return length;
}
return DefaultActivitySettings.defaultLengthValue;
}
static String getLevelValueFromUnsafe(String level) {
if (DefaultActivitySettings.allowedLevelValues.contains(level)) {
return level;
}
return DefaultActivitySettings.defaultLevelValue;
}
factory ActivitySettings.createDefault() {
return ActivitySettings(
lang: DefaultActivitySettings.defaultLangValue,
length: DefaultActivitySettings.defaultLengthValue,
level: DefaultActivitySettings.defaultLevelValue,
);
}
void dump() {
printlog('$ActivitySettings:');
printlog(' ${DefaultActivitySettings.parameterCodeLang}: $lang');
printlog(' ${DefaultActivitySettings.parameterCodeLength}: $length');
printlog(' ${DefaultActivitySettings.parameterCodeLevel}: $level');
printlog('');
}
@override
String toString() {
return '$ActivitySettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeLang: lang,
DefaultActivitySettings.parameterCodeLength: length,
DefaultActivitySettings.parameterCodeLevel: level,
};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:momomotus/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,
};
}
}
File moved
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:momomotus/config/application_config.dart';
class ParameterPainterDifficultyLevel extends CustomPainter {
const ParameterPainterDifficultyLevel({
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);
final List<dynamic> stars = [];
switch (value) {
case ApplicationConfig.difficultyLevelValueEasy:
stars.add([0.5, 0.5]);
break;
case ApplicationConfig.difficultyLevelValueNormal:
stars.add([0.3, 0.5]);
stars.add([0.7, 0.5]);
break;
default:
printlog('Wrong value for level parameter value: $value');
}
final paint = Paint();
paint.strokeJoin = StrokeJoin.round;
paint.strokeWidth = 3 / 100 * canvasSize;
// Stars
final textSpan = TextSpan(
text: '⭐',
style: TextStyle(
color: Colors.black,
fontSize: canvasSize / 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(
canvasSize * center[0] - textPainter.width * 0.5,
canvasSize * center[1] - textPainter.height * 0.5,
),
);
}
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment