import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:momomotus/config/default_game_settings.dart'; import 'package:momomotus/models/settings/settings_game.dart'; import 'package:momomotus/models/settings/settings_global.dart'; class ParameterPainter extends CustomPainter { const ParameterPainter({ required this.code, required this.value, required this.gameSettings, required this.globalSettings, }); final String code; final String value; final GameSettings gameSettings; final GlobalSettings globalSettings; @override void paint(Canvas canvas, Size size) { // force square final double canvasSize = min(size.width, size.height); // content switch (code) { case DefaultGameSettings.parameterCodeLang: paintLangParameterItem(canvas, canvasSize); break; case DefaultGameSettings.parameterCodeLength: paintLengthParameterItem(canvas, canvasSize); break; case DefaultGameSettings.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 DefaultGameSettings.lengthValue4: text = '⭐'; break; case DefaultGameSettings.lengthValue5: text = itemCountEmoji + DefaultGameSettings.lengthValue5.toString(); break; case DefaultGameSettings.lengthValue6: text = itemCountEmoji + DefaultGameSettings.lengthValue6.toString(); break; case DefaultGameSettings.lengthValue7: text = itemCountEmoji + DefaultGameSettings.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 DefaultGameSettings.levelValueEasy: text = '🧒'; break; case DefaultGameSettings.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, ), ); } }