import 'package:flutter/material.dart'; import 'package:mchess/chess_bloc/chess_bloc.dart'; import '../chess_bloc/chess_events.dart'; import '../utils/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}); 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( onWillAccept: (move) { if (move?.fromSquare == coordinate) { return false; } return true; }, onAccept: (move) { if (coordinate != move.fromSquare) { ChessBloc.getInstance().add(OwnPieceMoved( startSquare: move.fromSquare, endSquare: coordinate)); } }, 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: PieceMovedFrom(coordinate, containedPiece), maxSimultaneousDrags: ChessBloc.turnColor == ChessBloc.myColor ? 1 : 0, 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: () {}, ), ); }, ); } }