Line data Source code
1 : import 'package:meta/meta.dart'; 2 : 3 : import '../../../game.dart'; 4 : import '../../game/base_game.dart'; 5 : import '../../gestures/events.dart'; 6 : import '../base_component.dart'; 7 : 8 : mixin Hoverable on BaseComponent { 9 : bool _isHovered = false; 10 2 : bool get isHovered => _isHovered; 11 0 : void onHoverEnter(PointerHoverInfo info) {} 12 0 : void onHoverLeave(PointerHoverInfo info) {} 13 : 14 1 : @nonVirtual 15 : void handleMouseMovement(PointerHoverInfo info) { 16 2 : if (containsPoint(eventPosition(info))) { 17 1 : if (!_isHovered) { 18 1 : _isHovered = true; 19 1 : onHoverEnter(info); 20 : } 21 : } else { 22 1 : if (_isHovered) { 23 1 : _isHovered = false; 24 1 : onHoverLeave(info); 25 : } 26 : } 27 : } 28 : } 29 : 30 : mixin HasHoverableComponents on BaseGame { 31 1 : @mustCallSuper 32 : void onMouseMove(PointerHoverInfo info) { 33 1 : bool _mouseMoveHandler(Hoverable c) { 34 1 : c.handleMouseMovement(info); 35 : return true; // always continue 36 : } 37 : 38 3 : for (final c in components.reversed()) { 39 1 : if (c is BaseComponent) { 40 1 : c.propagateToChildren<Hoverable>(_mouseMoveHandler); 41 : } 42 1 : if (c is Hoverable) { 43 1 : _mouseMoveHandler(c); 44 : } 45 : } 46 : } 47 : }