import 'package:flutter/material.dart'; import 'package:flutter_custom_toolbox/flutter_toolbox.dart'; import 'package:solitaire/config/application_config.dart'; import 'package:solitaire/cubit/activity/activity_cubit.dart'; import 'package:solitaire/models/activity/cell.dart'; import 'package:solitaire/models/activity/activity.dart'; class TileWidget extends StatelessWidget { const TileWidget({ super.key, required this.tile, required this.tileSize, }); final Cell tile; final double tileSize; @override Widget build(BuildContext context) { return BlocBuilder<ActivityCubit, ActivityState>( builder: (BuildContext context, ActivityState activityState) { final Activity currentActivity = activityState.currentActivity; if (tile.hasHole) { return render( currentActivity: currentActivity, activityCubit: BlocProvider.of<ActivityCubit>(context), ); } else { return Image( image: AssetImage( 'assets/skins/${currentActivity.activitySettings.get(ApplicationConfig.parameterCodeSkin)}_board.png'), width: tileSize, height: tileSize, fit: BoxFit.fill, ); } }, ); } Widget render({ required Activity currentActivity, required ActivityCubit activityCubit, }) { List<Widget> stack = [ hole( currentActivity: currentActivity, activityCubit: activityCubit, ), ]; if (tile.hasPeg) { stack.add(draggable( currentActivity: currentActivity, )); } return Stack( alignment: Alignment.center, children: stack, ); } Widget hole({ required Activity currentActivity, required ActivityCubit activityCubit, }) { String image = 'assets/skins/${currentActivity.activitySettings.get(ApplicationConfig.parameterCodeSkin)}_hole.png'; return DragTarget<List<int>>( builder: ( BuildContext context, List<dynamic> accepted, List<dynamic> rejected, ) { return Image( image: AssetImage(image), width: tileSize, height: tileSize, fit: BoxFit.fill, ); }, onAcceptWithDetails: (DragTargetDetails<List<int>> source) { List<int> target = [tile.location.col, tile.location.row]; // printlog('(drag) Pick from ' + source.toString() + ' and drop on ' + target.toString()); if (currentActivity.board.isMoveAllowed( source: source.data, target: target, )) { activityCubit.move( currentActivity: currentActivity, source: source.data, target: target, ); } }, ); } Widget draggable({ required Activity currentActivity, }) { return Draggable<List<int>>( data: [tile.location.col, tile.location.row], // Widget when draggable is being dragged feedback: peg( currentActivity: currentActivity, ), // Widget to display on original place when being dragged childWhenDragging: Container(), // Widget when draggable is stationary child: peg( currentActivity: currentActivity, ), ); } Widget peg({ required Activity currentActivity, }) { String image = 'assets/skins/${currentActivity.activitySettings.get(ApplicationConfig.parameterCodeSkin)}_peg.png'; return Image( image: AssetImage(image), width: tileSize, height: tileSize, fit: BoxFit.fill, ); } }