fix: keep focus on game

pull/311/head
Jochum van der Ploeg 3 years ago
parent 36f7886f63
commit 1132671b9f
No known key found for this signature in database
GPG Key ID: E961B7B51589CA09

@ -23,7 +23,8 @@ class PinballGame extends Forge2DGame
PinballGame({ PinballGame({
required this.characterTheme, required this.characterTheme,
required this.audio, required this.audio,
}) : super(gravity: Vector2(0, 30)) { }) : focusNode = FocusNode(),
super(gravity: Vector2(0, 30)) {
images.prefix = ''; images.prefix = '';
controller = _GameBallsController(this); controller = _GameBallsController(this);
} }
@ -38,6 +39,8 @@ class PinballGame extends Forge2DGame
final PinballAudio audio; final PinballAudio audio;
final FocusNode focusNode;
late final GameFlowController gameFlowController; late final GameFlowController gameFlowController;
@override @override

@ -120,9 +120,16 @@ class PinballGameLoadedView extends StatelessWidget {
return Stack( return Stack(
children: [ children: [
Positioned.fill( Positioned.fill(
child: MouseRegion(
onHover: (_) {
if (!game.focusNode.hasFocus) {
game.focusNode.requestFocus();
}
},
child: GameWidget<PinballGame>( child: GameWidget<PinballGame>(
game: game, game: game,
initialActiveOverlays: const [PinballGame.playButtonOverlay], initialActiveOverlays: const [PinballGame.playButtonOverlay],
focusNode: game.focusNode,
overlayBuilderMap: { overlayBuilderMap: {
PinballGame.playButtonOverlay: (context, game) { PinballGame.playButtonOverlay: (context, game) {
return Positioned( return Positioned(
@ -135,6 +142,7 @@ class PinballGameLoadedView extends StatelessWidget {
}, },
), ),
), ),
),
// TODO(arturplaczek): add Visibility to GameHud based on StartGameBloc // TODO(arturplaczek): add Visibility to GameHud based on StartGameBloc
// status // status
Positioned( Positioned(

@ -1,5 +1,7 @@
// ignore_for_file: prefer_const_constructors // ignore_for_file: prefer_const_constructors
import 'dart:ui';
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -237,5 +239,26 @@ void main() {
findsOneWidget, findsOneWidget,
); );
}); });
testWidgets('keep focus on game when mouse hovers over it', (tester) async {
await tester.pumpApp(
PinballGameView(game: game),
gameBloc: gameBloc,
startGameBloc: startGameBloc,
);
game.focusNode.unfocus();
await tester.pump();
expect(game.focusNode.hasFocus, isFalse);
final gesture = await tester.createGesture(kind: PointerDeviceKind.mouse);
await gesture.addPointer(location: Offset.zero);
addTearDown(gesture.removePointer);
await gesture.moveTo((game.size / 2).toOffset());
await tester.pump();
expect(game.focusNode.hasFocus, isTrue);
});
}); });
} }

Loading…
Cancel
Save