Skip to content

Commit 8649569

Browse files
authored
feat: Add OverlayManager.setActive() (#3875)
Can be used to declarative describe the conditions for when an overlay should be visible. Adds `OverlayManager.setActive()` which can be used to set active state of an overlay. This helps when you want to declarative describe the conditions for when a given overlay should be visible. For example like this: ```dart game.overlays.setActive("hud", game.gameState.level > 0 && !game.gameState.paused); ``` instead of: ```dart if (game.gameState.level > 0 && !game.gameState.paused) { game.overlays.add("hud"); } else { game.overlays.remove("hud"); } ```
1 parent 987e0c5 commit 8649569

3 files changed

Lines changed: 46 additions & 2 deletions

File tree

doc/flame/overlays.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@ by providing an `overlayBuilderMap`.
2525
2626
// Marks 'SecondaryMenu' to be rendered.
2727
overlays.add(secondaryOverlayIdentifier, priority: 1);
28-
// Marks 'PauseMenu' to be rendered. Priority = 0 by default
28+
// Marks 'PauseMenu' to be rendered. Priority = 0 by default
2929
// which means the 'PauseMenu' will be displayed under the 'SecondaryMenu'
3030
overlays.add(pauseOverlayIdentifier);
31-
// Marks 'PauseMenu' to not be rendered.
31+
// Marks 'PauseMenu' to not be rendered.
3232
overlays.remove(pauseOverlayIdentifier);
3333
// Toggles the 'PauseMenu' overlay.
3434
overlays.toggle(pauseOverlayIdentifier);
35+
// Check if the 'PauseMenu' is being rendered
36+
final hasPauseMenu = overlays.isActive(pauseOverlayIdentifier);
37+
// Set active state ov 'SecondaryMenu' based on a condition
38+
overlays.setActive(secondaryOverlayIdentifier, active: !hasPauseMenu);
3539
```
3640

3741
```dart

packages/flame/lib/src/game/overlay_manager.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ class OverlayManager {
111111
}
112112
}
113113

114+
/// Set active state of [overlayName] to [active]. If [isActive] != [active]
115+
/// this method adds or removes the overlay so the active state of the overlay
116+
/// becomes [active].
117+
///
118+
/// [priority] is used to sort widgets for [buildCurrentOverlayWidgets]
119+
/// The smaller the priority, the sooner your component will be build
120+
/// (see [add] for more details).
121+
bool setActive(String overlayName, {required bool active, int priority = 0}) {
122+
if (active == isActive(overlayName)) {
123+
return false;
124+
}
125+
if (active) {
126+
return add(overlayName, priority: priority);
127+
} else {
128+
return remove(overlayName);
129+
}
130+
}
131+
114132
@internal
115133
List<Widget> buildCurrentOverlayWidgets(BuildContext context) {
116134
final widgets = <Widget>[];

packages/flame/test/game/overlays_manager_test.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,28 @@ void main() {
112112
expect(overlays.activeOverlays.length, 0);
113113
});
114114

115+
test('can set overlay active', () {
116+
final overlays = FlameGame().overlays
117+
..addEntry('test', (ctx, game) => Container());
118+
final added = overlays.setActive('test', active: true);
119+
expect(added, true);
120+
expect(overlays.isActive('test'), true);
121+
122+
final addedAgain = overlays.setActive('test', active: true);
123+
expect(addedAgain, false);
124+
expect(overlays.isActive('test'), true);
125+
expect(overlays.activeOverlays.length, 1);
126+
127+
final removed = overlays.setActive('test', active: false);
128+
expect(removed, true);
129+
expect(overlays.isActive('test'), false);
130+
expect(overlays.activeOverlays.length, 0);
131+
132+
final removedAgain = overlays.setActive('test', active: false);
133+
expect(removedAgain, false);
134+
expect(overlays.isActive('test'), false);
135+
});
136+
115137
test('can add multiple overlays at once', () {
116138
final overlays = FlameGame().overlays
117139
..addEntry('test1', (ctx, game) => Container())

0 commit comments

Comments
 (0)