Skip to content
Snippets Groups Projects
game_board_display.dart 2.22 KiB
Newer Older
import 'package:flutter/material.dart';

import 'package:reversi/config/styling.dart';
import 'package:reversi/models/activity/game_board.dart';
import 'package:reversi/models/activity/game_model.dart';

class GameBoardDisplay extends StatelessWidget {
  const GameBoardDisplay({
    super.key,
    required this.context,
    required this.model,
    required this.callback,
  });

  final BuildContext context;
  final GameModel model;
  final Function callback;

  @override
  Widget build(BuildContext context) {
    final rows = <TableRow>[];

    for (int y = 0; y < GameBoard.height; y++) {
      final cells = <Column>[];

      for (int x = 0; x < GameBoard.width; x++) {
        PieceType pieceType = model.board.getPieceAtLocation(x, y);
        String? assetImageCode = Styling.assetImageCodes[pieceType];
        String assetImageName =
            'assets/skins/${model.skin}_tile_${assetImageCode ?? 'empty'}.png';

        Column cell = Column(
          children: [
            Container(
              decoration: Styling.boardCellDecoration,
              child: SizedBox(
                child: GestureDetector(
                  child: AnimatedSwitcher(
                    duration: const Duration(milliseconds: 250),
                    transitionBuilder: (Widget child, Animation<double> animation) {
                      return ScaleTransition(
                        scale: animation,
                        child: child,
                      );
                    },
                    child: Image(
                      image: AssetImage(assetImageName),
                      fit: BoxFit.fill,
                      key: ValueKey<int>(
                        pieceType == PieceType.empty
                            ? 0
                            : (pieceType == PieceType.black ? 1 : 2),
                      ),
                    ),
                  ),
                  onTap: () {
                    callback(model, x, y);
                  },
                ),
              ),
            )
          ],
        );

        cells.add(cell);
      }

      rows.add(TableRow(
        children: cells,
      ));
    }

    return Table(
      defaultColumnWidth: const IntrinsicColumnWidth(),
      children: rows,
    );
  }
}