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

Use ActivityParameters widgets from flutter_custom_toolbox

parent f309105a
No related branches found
No related tags found
1 merge request!75Resolve "Use ActivityParameters widgets from flutter_custom_toolbox"
Pipeline #7048 passed
This commit is part of merge request !75. Comments created here will be created in the context of that merge request.
Showing
with 177 additions and 666 deletions
Use ActivityParameters widgets from flutter_custom_toolbox.
Utilisation des widgets ActivityParameters de flutter_custom_toolbox.
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:puzzlegame/common/ui/pages/game.dart'; import 'package:puzzlegame/cubit/activity/activity_cubit.dart';
import 'package:puzzlegame/common/ui/pages/parameters.dart'; import 'package:puzzlegame/config/application_config.dart';
import 'package:puzzlegame/models/activity/activity.dart';
import 'package:puzzlegame/ui/pages/game.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,
}); });
} }
...@@ -20,20 +22,27 @@ class ActivityPage { ...@@ -20,20 +22,27 @@ class ActivityPage {
static const bool displayBottomNavBar = false; static const bool displayBottomNavBar = false;
static const indexHome = 0; static const indexHome = 0;
static const pageHome = ActivityPageItem( static final ActivityPageItem 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 indexGame = 1; static const indexGame = 1;
static const pageGame = ActivityPageItem( static final ActivityPageItem 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 Map<int, ActivityPageItem> items = { static final Map<int, ActivityPageItem> items = {
indexHome: pageHome, indexHome: pageHome,
indexGame: pageGame, indexGame: pageGame,
}; };
...@@ -45,6 +54,16 @@ class ActivityPage { ...@@ -45,6 +54,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:puzzlegame/common/cubit/nav/nav_cubit_pages.dart';
import 'package:puzzlegame/common/ui/parameters/parameter_widget.dart';
import 'package:puzzlegame/config/default_activity_settings.dart';
import 'package:puzzlegame/config/default_global_settings.dart';
import 'package:puzzlegame/cubit/activity/activity_cubit.dart';
import 'package:puzzlegame/cubit/settings/settings_activity_cubit.dart';
import 'package:puzzlegame/cubit/settings/settings_global_cubit.dart';
import 'package:puzzlegame/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:puzzlegame/common/ui/parameters/parameter_painter.dart';
import 'package:puzzlegame/config/default_activity_settings.dart';
import 'package:puzzlegame/config/default_global_settings.dart';
import 'package:puzzlegame/models/settings/settings_activity.dart';
import 'package:puzzlegame/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.parameterCodeTilesetSize:
content = getTilesetSizeParameterItem();
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 getTilesetSizeParameterItem() {
Color backgroundColor = Colors.grey;
switch (value) {
case DefaultActivitySettings.tilesetSizeValueSmall:
backgroundColor = Colors.green;
break;
case DefaultActivitySettings.tilesetSizeValueMedium:
backgroundColor = Colors.orange;
break;
case DefaultActivitySettings.tilesetSizeValueLarge:
backgroundColor = Colors.red;
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 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:puzzlegame/common/cubit/nav/nav_cubit_pages.dart';
import 'package:puzzlegame/cubit/activity/activity_cubit.dart';
import 'package:puzzlegame/ui/parameters/parameter_painter_tileset_size.dart';
class ApplicationConfig { class ApplicationConfig {
static const String appTitle = 'Puzzle'; static const String parameterCodeTilesetSize = 'activity.tilesetSize';
static const String parameterCodeImageName = 'activity.imageName';
static const String tilesetSizeValueSmall = '3x3';
static const String tilesetSizeValueMedium = '4x4';
static const String tilesetSizeValueLarge = '5x5';
static const String imageNameRandomlyPicked = 'random';
static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
appTitle: 'Puzzle',
activitySettings: [
// tileset size
ApplicationSettingsParameter(
code: parameterCodeTilesetSize,
values: [
ApplicationSettingsParameterItemValue(
value: tilesetSizeValueSmall,
color: Colors.green,
),
ApplicationSettingsParameterItemValue(
value: tilesetSizeValueMedium,
isDefault: true,
color: Colors.orange,
),
ApplicationSettingsParameterItemValue(
value: tilesetSizeValueLarge,
color: Colors.red,
),
],
customPainter: (context, value) => ParameterPainterTilesetSize(
context: context,
value: value,
),
intValueGetter: (value) => int.parse(value.split('x')[0]),
),
// image name
ApplicationSettingsParameter(
code: parameterCodeImageName,
values: [
ApplicationSettingsParameterItemValue(
value: imageNameRandomlyPicked,
isDefault: true,
),
],
),
],
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 parameterCodeTilesetSize = 'tilesetSize';
static const String parameterCodeImageName = 'imageName';
static const List<String> availableParameters = [
parameterCodeTilesetSize,
parameterCodeImageName,
];
// tileset size: available values
static const String tilesetSizeValueSmall = '3x3';
static const String tilesetSizeValueMedium = '4x4';
static const String tilesetSizeValueLarge = '5x5';
static const List<String> allowedTilesetSizeValues = [
tilesetSizeValueSmall,
tilesetSizeValueMedium,
tilesetSizeValueLarge,
];
// tileset size: default value
static const String defaultTilesetSizeValue = tilesetSizeValueMedium;
// image name: available values
static const String imageNameRandomlyPicked = 'random';
static const List<String> allowedImageNameS = [
imageNameRandomlyPicked,
];
// image name: default value
static const String defaultImageName = imageNameRandomlyPicked;
// available values from parameter code
static List<String> getAvailableValues(String parameterCode) {
switch (parameterCode) {
case parameterCodeTilesetSize:
return DefaultActivitySettings.allowedTilesetSizeValues;
case parameterCodeImageName:
return DefaultActivitySettings.allowedImageNameS;
}
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 [];
}
}
...@@ -7,10 +7,9 @@ import 'package:flutter/services.dart' show rootBundle; ...@@ -7,10 +7,9 @@ import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:image/image.dart' as imglib; import 'package:image/image.dart' as imglib;
import 'package:puzzlegame/config/application_config.dart';
import 'package:puzzlegame/models/activity/activity.dart'; import 'package:puzzlegame/models/activity/activity.dart';
import 'package:puzzlegame/models/activity/moving_tile.dart'; import 'package:puzzlegame/models/activity/moving_tile.dart';
import 'package:puzzlegame/models/settings/settings_activity.dart';
import 'package:puzzlegame/models/settings/settings_global.dart';
part 'activity_state.dart'; part 'activity_state.dart';
...@@ -30,7 +29,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -30,7 +29,6 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
final Activity activity = Activity( final Activity activity = Activity(
// Settings // Settings
activitySettings: state.currentActivity.activitySettings, activitySettings: state.currentActivity.activitySettings,
globalSettings: state.currentActivity.globalSettings,
// State // State
isRunning: state.currentActivity.isRunning, isRunning: state.currentActivity.isRunning,
isStarted: state.currentActivity.isStarted, isStarted: state.currentActivity.isStarted,
...@@ -50,14 +48,13 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -50,14 +48,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();
...@@ -74,6 +71,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -74,6 +71,10 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
}); });
} }
bool canBeResumed() {
return state.currentActivity.canBeResumed;
}
void quitActivity() { void quitActivity() {
state.currentActivity.isRunning = false; state.currentActivity.isRunning = false;
refresh(); refresh();
...@@ -153,7 +154,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> { ...@@ -153,7 +154,8 @@ class ActivityCubit extends HydratedCubit<ActivityState> {
final String imageAsset = 'assets/images/${state.currentActivity.image}.png'; final String imageAsset = 'assets/images/${state.currentActivity.image}.png';
final Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List(); final Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List();
final int tilesCount = state.currentActivity.activitySettings.tilesetSizeValue; final int tilesCount = state.currentActivity.activitySettings
.getAsInt(ApplicationConfig.parameterCodeTilesetSize);
final imglib.Image image = imglib.decodeImage(imageData) ?? final imglib.Image image = imglib.decodeImage(imageData) ??
imglib.Image.fromBytes( imglib.Image.fromBytes(
... ...
......
import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:puzzlegame/config/default_activity_settings.dart';
import 'package:puzzlegame/models/settings/settings_activity.dart';
part 'settings_activity_state.dart';
class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
ActivitySettingsCubit()
: super(ActivitySettingsState(settings: ActivitySettings.createDefault()));
void setValues({
String? tilesetSize,
String? imageName,
}) {
emit(
ActivitySettingsState(
settings: ActivitySettings(
tilesetSize: tilesetSize ?? state.settings.tilesetSize,
imageName: imageName ?? state.settings.imageName,
),
),
);
}
String getParameterValue(String code) {
switch (code) {
case DefaultActivitySettings.parameterCodeTilesetSize:
return ActivitySettings.getTilesetSizeValueFromUnsafe(state.settings.tilesetSize);
case DefaultActivitySettings.parameterCodeImageName:
return ActivitySettings.getImageNameFromUnsafe(state.settings.imageName);
}
return '';
}
void setParameterValue(String code, String value) {
final String tilesetSize = code == DefaultActivitySettings.parameterCodeTilesetSize
? value
: getParameterValue(DefaultActivitySettings.parameterCodeTilesetSize);
final String imageName = code == DefaultActivitySettings.parameterCodeImageName
? value
: getParameterValue(DefaultActivitySettings.parameterCodeImageName);
setValues(
tilesetSize: tilesetSize,
imageName: imageName,
);
}
@override
ActivitySettingsState? fromJson(Map<String, dynamic> json) {
final String tilesetSize =
json[DefaultActivitySettings.parameterCodeTilesetSize] as String;
final String imageName = json[DefaultActivitySettings.parameterCodeImageName] as String;
return ActivitySettingsState(
settings: ActivitySettings(
tilesetSize: tilesetSize,
imageName: imageName,
),
);
}
@override
Map<String, dynamic>? toJson(ActivitySettingsState state) {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeTilesetSize: state.settings.tilesetSize,
DefaultActivitySettings.parameterCodeImageName: state.settings.imageName,
};
}
}
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:puzzlegame/config/default_global_settings.dart';
import 'package:puzzlegame/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:puzzlegame/common/cubit/nav/nav_cubit_screens.dart'; ...@@ -9,8 +9,6 @@ import 'package:puzzlegame/common/cubit/nav/nav_cubit_screens.dart';
import 'package:puzzlegame/config/application_config.dart'; import 'package:puzzlegame/config/application_config.dart';
import 'package:puzzlegame/cubit/activity/activity_cubit.dart'; import 'package:puzzlegame/cubit/activity/activity_cubit.dart';
import 'package:puzzlegame/cubit/settings/settings_activity_cubit.dart';
import 'package:puzzlegame/cubit/settings/settings_global_cubit.dart';
import 'package:puzzlegame/ui/skeleton.dart'; import 'package:puzzlegame/ui/skeleton.dart';
void main() async { void main() async {
...@@ -61,17 +59,14 @@ class MyApp extends StatelessWidget { ...@@ -61,17 +59,14 @@ 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),
), ),
], ],
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
... ...
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:puzzlegame/config/application_config.dart';
import 'package:puzzlegame/data/fetch_data_helper.dart'; import 'package:puzzlegame/data/fetch_data_helper.dart';
import 'package:puzzlegame/models/activity/moving_tile.dart'; import 'package:puzzlegame/models/activity/moving_tile.dart';
import 'package:puzzlegame/models/settings/settings_activity.dart';
import 'package:puzzlegame/models/settings/settings_global.dart';
class Activity { class Activity {
Activity({ Activity({
// Settings // Settings
required this.activitySettings, required this.activitySettings,
required this.globalSettings,
// State // State
this.isRunning = false, this.isRunning = false,
...@@ -30,7 +28,6 @@ class Activity { ...@@ -30,7 +28,6 @@ class Activity {
// Settings // Settings
final ActivitySettings activitySettings; final ActivitySettings activitySettings;
final GlobalSettings globalSettings;
// State // State
bool isRunning; bool isRunning;
...@@ -50,8 +47,9 @@ class Activity { ...@@ -50,8 +47,9 @@ class Activity {
factory Activity.createEmpty() { factory Activity.createEmpty() {
return Activity( return Activity(
activitySettings: ActivitySettings.createDefault(), // Settings
globalSettings: GlobalSettings.createDefault(), activitySettings: ActivitySettings.createDefault(appConfig: ApplicationConfig.config),
// Base data
image: '', image: '',
tiles: [], tiles: [],
); );
...@@ -59,18 +57,15 @@ class Activity { ...@@ -59,18 +57,15 @@ class Activity {
factory Activity.createNew({ factory Activity.createNew({
ActivitySettings? activitySettings, ActivitySettings? activitySettings,
GlobalSettings? globalSettings,
}) { }) {
final ActivitySettings newActivitySettings = final ActivitySettings newActivitySettings = activitySettings ??
activitySettings ?? ActivitySettings.createDefault(); ActivitySettings.createDefault(appConfig: ApplicationConfig.config);
final GlobalSettings newGlobalSettings = globalSettings ?? GlobalSettings.createDefault();
final String image = FetchDataHelper().getRandomItem(); final String image = FetchDataHelper().getRandomItem();
return Activity( return Activity(
// Settings // Settings
activitySettings: newActivitySettings, activitySettings: newActivitySettings,
globalSettings: newGlobalSettings,
// Base data // Base data
image: image, image: image,
); );
...@@ -85,7 +80,6 @@ class Activity { ...@@ -85,7 +80,6 @@ class Activity {
printlog('$Activity:'); printlog('$Activity:');
printlog(' Settings'); printlog(' Settings');
activitySettings.dump(); activitySettings.dump();
globalSettings.dump();
printlog(' State'); printlog(' State');
printlog(' isRunning: $isRunning'); printlog(' isRunning: $isRunning');
printlog(' isStarted: $isStarted'); printlog(' isStarted: $isStarted');
...@@ -110,7 +104,6 @@ class Activity { ...@@ -110,7 +104,6 @@ class Activity {
return <String, dynamic>{ return <String, dynamic>{
// Settings // Settings
'activitySettings': activitySettings.toJson(), 'activitySettings': activitySettings.toJson(),
'globalSettings': globalSettings.toJson(),
// State // State
'isRunning': isRunning, 'isRunning': isRunning,
'isStarted': isStarted, 'isStarted': isStarted,
... ...
......
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:puzzlegame/config/default_activity_settings.dart';
class ActivitySettings {
final String tilesetSize;
final String imageName;
ActivitySettings({
required this.tilesetSize,
required this.imageName,
});
static String getTilesetSizeValueFromUnsafe(String tilesetSize) {
if (DefaultActivitySettings.allowedTilesetSizeValues.contains(tilesetSize)) {
return tilesetSize;
}
return DefaultActivitySettings.defaultTilesetSizeValue;
}
static String getImageNameFromUnsafe(String imageName) {
if (DefaultActivitySettings.allowedImageNameS.contains(imageName)) {
return imageName;
}
return DefaultActivitySettings.defaultImageName;
}
factory ActivitySettings.createDefault() {
return ActivitySettings(
tilesetSize: DefaultActivitySettings.defaultTilesetSizeValue,
imageName: DefaultActivitySettings.defaultImageName,
);
}
int get tilesetSizeValue => int.parse(tilesetSize.split('x')[0]);
void dump() {
printlog('$ActivitySettings:');
printlog(' ${DefaultActivitySettings.parameterCodeTilesetSize}: $tilesetSize');
printlog(' ${DefaultActivitySettings.parameterCodeImageName}: $imageName');
printlog('');
}
@override
String toString() {
return '$ActivitySettings(${toJson()})';
}
Map<String, dynamic>? toJson() {
return <String, dynamic>{
DefaultActivitySettings.parameterCodeTilesetSize: tilesetSize,
DefaultActivitySettings.parameterCodeImageName: imageName,
};
}
}
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:puzzlegame/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 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
import 'package:puzzlegame/config/default_activity_settings.dart'; class ParameterPainterTilesetSize extends CustomPainter {
import 'package:puzzlegame/models/settings/settings_activity.dart'; const ParameterPainterTilesetSize({
import 'package:puzzlegame/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.parameterCodeTilesetSize:
paintTilesetSizeParameterItem(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 paintTilesetSizeParameterItem(
final Canvas canvas,
final double size,
) {
final int gridSize = int.parse(value.split('x')[0]); final int gridSize = int.parse(value.split('x')[0]);
final paint = Paint(); final paint = Paint();
...@@ -87,11 +26,11 @@ class ParameterPainter extends CustomPainter { ...@@ -87,11 +26,11 @@ class ParameterPainter extends CustomPainter {
// TODO: add image // TODO: add image
final borderColor = Colors.grey.shade800; final borderColor = Colors.grey.shade800;
final drawSize = size * 0.7; final drawSize = canvasSize * 0.7;
final double cellSize = drawSize / gridSize; final double cellSize = drawSize / gridSize;
final double originX = (size - gridSize * cellSize) / 2; final double originX = (canvasSize - gridSize * cellSize) / 2;
final double originY = (size - gridSize * cellSize) / 2; final double originY = (canvasSize - gridSize * cellSize) / 2;
for (int row = 0; row < gridSize; row++) { for (int row = 0; row < gridSize; row++) {
for (int col = 0; col < gridSize; col++) { for (int col = 0; col < gridSize; col++) {
...@@ -108,4 +47,9 @@ class ParameterPainter extends CustomPainter { ...@@ -108,4 +47,9 @@ class ParameterPainter extends CustomPainter {
} }
} }
} }
@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:puzzlegame/config/application_config.dart';
import 'package:puzzlegame/cubit/activity/activity_cubit.dart'; import 'package:puzzlegame/cubit/activity/activity_cubit.dart';
import 'package:puzzlegame/models/activity/activity.dart'; import 'package:puzzlegame/models/activity/activity.dart';
...@@ -18,7 +19,8 @@ class GameBoardWidget extends StatelessWidget { ...@@ -18,7 +19,8 @@ class GameBoardWidget extends StatelessWidget {
BlocProvider.of<ActivityCubit>(context).updateTileSize( BlocProvider.of<ActivityCubit>(context).updateTileSize(
(MediaQuery.of(context).size.width - 60) / (MediaQuery.of(context).size.width - 60) /
currentActivity.activitySettings.tilesetSizeValue); currentActivity.activitySettings
.getAsInt(ApplicationConfig.parameterCodeTilesetSize));
if (currentActivity.shufflingInProgress) { if (currentActivity.shufflingInProgress) {
return const GameShufflingWidget(); return const GameShufflingWidget();
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment