import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:minehunter/config/default_activity_settings.dart'; import 'package:minehunter/models/settings/settings_activity.dart'; import 'package:minehunter/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.parameterCodeLevel: paintLevelParameterItem(canvas, canvasSize); break; case DefaultActivitySettings.parameterCodeSize: paintSizeParameterItem(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 paintLevelParameterItem( final Canvas canvas, final double size, ) { final List<dynamic> stars = []; switch (value) { case DefaultActivitySettings.levelValueEasy: stars.add([0.5, 0.5]); break; case DefaultActivitySettings.levelValueMedium: stars.add([0.3, 0.5]); stars.add([0.7, 0.5]); break; case DefaultActivitySettings.levelValueHard: stars.add([0.3, 0.3]); stars.add([0.7, 0.3]); stars.add([0.5, 0.7]); break; case DefaultActivitySettings.levelValueNightmare: stars.add([0.3, 0.3]); stars.add([0.7, 0.3]); stars.add([0.3, 0.7]); stars.add([0.7, 0.7]); break; default: printlog('Wrong value for level parameter value: $value'); } final paint = Paint(); paint.strokeJoin = StrokeJoin.round; paint.strokeWidth = 3 / 100 * size; // Stars final textSpan = TextSpan( text: '⭐', style: TextStyle( color: Colors.black, fontSize: size / 3, fontWeight: FontWeight.bold, ), ); final textPainter = TextPainter( text: textSpan, textDirection: TextDirection.ltr, textAlign: TextAlign.center, ); textPainter.layout(); for (var center in stars) { textPainter.paint( canvas, Offset( size * center[0] - textPainter.width * 0.5, size * center[1] - textPainter.height * 0.5, ), ); } } void paintSizeParameterItem( final Canvas canvas, final double size, ) { int gridWidth = 1; switch (value) { case DefaultActivitySettings.sizeValueSmall: gridWidth = 2; break; case DefaultActivitySettings.sizeValueMedium: gridWidth = 3; break; case DefaultActivitySettings.sizeValueLarge: gridWidth = 4; 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 squareColor = Colors.grey.shade200; final borderColor = 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 = squareColor; paint.style = PaintingStyle.fill; canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint); paint.color = borderColor; paint.style = PaintingStyle.stroke; canvas.drawRect(Rect.fromPoints(topLeft, bottomRight), paint); } } } }