import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:mchess/chess_bloc/chess_events.dart'; import 'package:mchess/chess_bloc/chess_bloc.dart'; import 'chess_utils.dart'; class ChessSquare extends StatelessWidget { final ChessCoordinate coordinate; final ChessPiece? containedPiece; static const double pieceWidth = 200; static const double pieceHeight = 200; final Color color; const ChessSquare._( {required this.coordinate, required this.containedPiece, required this.color, super.key}); factory ChessSquare(ChessCoordinate coord, ChessPiece? piece) { Color lightSquares = Colors.brown.shade50; Color darkSquares = Colors.brown.shade400; Color squareColor; if (coord.row % 2 == 0) { if (coord.column % 2 == 0) { squareColor = darkSquares; } else { squareColor = lightSquares; } } else { if (coord.column % 2 == 0) { squareColor = lightSquares; } else { squareColor = darkSquares; } } return ChessSquare._( coordinate: coord, containedPiece: piece, color: squareColor, ); } @override Widget build(BuildContext context) { double windowWidth = MediaQuery.of(context).size.width; double windowHeight = MediaQuery.of(context).size.height; double draggableFdbSize; if (windowWidth < windowHeight) { draggableFdbSize = 0.15 * windowWidth; } else { draggableFdbSize = 0.15 * windowHeight; } return DragTarget( builder: (context, candidateData, rejectedData) { return Container( color: color, width: ChessSquare.pieceWidth, height: ChessSquare.pieceWidth, child: Draggable( /* We create the move with the startSquare == endSquare. The receiving widget will give the correct value to end square. */ data: ChessMove(coordinate, coordinate, containedPiece), feedback: FractionalTranslation( translation: const Offset(-0.5, -0.75), child: SizedBox( height: draggableFdbSize, width: draggableFdbSize, child: containedPiece), ), childWhenDragging: Container(), dragAnchorStrategy: pointerDragAnchorStrategy, child: containedPiece ?? Container(), onDragCompleted: () {}, onDragStarted: () {}, ), ); }, onWillAccept: (move) { final legalMove = context .read() .preCheckHandler(PreCheckMove(move: move!)); print('onWillAccept returns $legalMove'); return legalMove; }, onAccept: (move) { move.endSquare = coordinate; if (move.endSquare != move.startSquare) { context.read().add( PieceMoved( startSquare: move.startSquare, endSquare: move.endSquare, ), ); } }, ); } }