Marco
212a54612c
This adds an option to dragging-and-dropping which is slightly hard on smaller screens. Fix promotions when tapping and fix handling of subsequently tapping two pieces of your color Cancel tap if a drag is started (tapped square will not stay red in case a drag is started) Change url strategy back to the hashtag thing Change version Fix bug that would not allow a piece move if you tried to take an opponents piece. Fix the coloring of the last move after an invalid move was played. Upgrading deps
114 lines
3.0 KiB
Dart
114 lines
3.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:mchess/chess_bloc/chess_bloc.dart';
|
|
|
|
import 'package:mchess/chess/chess_board.dart';
|
|
import 'package:mchess/chess_bloc/promotion_bloc.dart';
|
|
import 'package:mchess/chess_bloc/tap_bloc.dart';
|
|
import 'package:mchess/utils/chess_utils.dart';
|
|
import 'package:mchess/utils/widgets/promotion_dialog.dart';
|
|
import 'package:universal_platform/universal_platform.dart';
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
class ChessGame extends StatefulWidget {
|
|
final UuidValue playerID;
|
|
final UuidValue lobbyID;
|
|
final String? passphrase;
|
|
const ChessGame(
|
|
{required this.playerID,
|
|
required this.lobbyID,
|
|
required this.passphrase,
|
|
super.key});
|
|
|
|
@override
|
|
State<ChessGame> createState() => _ChessGameState();
|
|
}
|
|
|
|
class _ChessGameState extends State<ChessGame> {
|
|
ChessCoordinate? tappedSquare;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
FloatingActionButton? fltnBtn;
|
|
if (UniversalPlatform.isLinux ||
|
|
UniversalPlatform.isMacOS ||
|
|
UniversalPlatform.isWindows) {
|
|
fltnBtn = FloatingActionButton(
|
|
child: const Icon(Icons.cancel),
|
|
onPressed: () {
|
|
context.pop();
|
|
},
|
|
);
|
|
}
|
|
return Scaffold(
|
|
floatingActionButton: fltnBtn,
|
|
body: Center(
|
|
child: Container(
|
|
margin: const EdgeInsets.all(10),
|
|
child: BlocListener<TapBloc, TapState>(
|
|
listener: (context, state) {
|
|
setState(() {
|
|
tappedSquare = state.firstSquareTapped;
|
|
});
|
|
},
|
|
child: BlocListener<PromotionBloc, PromotionState>(
|
|
listener: (listenerContext, state) {
|
|
if (state.showPromotionDialog) {
|
|
promotionDialogBuilder(listenerContext, state.colorMoved);
|
|
}
|
|
},
|
|
child: BlocBuilder<ChessBloc, ChessBoardState>(
|
|
builder: (context, state) {
|
|
return ChessBoard(
|
|
boardState: state,
|
|
tappedSquare: tappedSquare,
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> promotionDialogBuilder(BuildContext context, ChessColor color) {
|
|
return showDialog<void>(
|
|
context: context,
|
|
barrierDismissible: false,
|
|
builder: (BuildContext context) {
|
|
return PromotionDialog(
|
|
sideColor: color,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
class ChessGameArguments {
|
|
final UuidValue lobbyID;
|
|
final UuidValue playerID;
|
|
final String? passphrase;
|
|
|
|
ChessGameArguments({
|
|
required this.lobbyID,
|
|
required this.playerID,
|
|
required this.passphrase,
|
|
});
|
|
|
|
bool isValid() {
|
|
try {
|
|
lobbyID.validate();
|
|
playerID.validate();
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
|
|
if (passphrase == null) return false;
|
|
if (passphrase!.isEmpty) return false;
|
|
|
|
return true;
|
|
}
|
|
}
|