Source code for rubato.classes.scene_manager
"""
The Scene Manager houses a collection of scenes and allows switching between scenes.
It also handles drawing and updating the current scene.
"""
from typing import Dict
from . import Scene
from .. import IdError
# THIS IS A STATIC CLASS
[docs]class SceneManager:
"""
The Scene Manager contains and handle multiple scenes.
Attributes:
scenes (Dict[str, Scene]): The collection of scenes in the
manager. Accessed by scene id.
"""
scenes: Dict[str, Scene] = {}
_current: str = ""
@classmethod
@property
def current(cls) -> Scene:
"""
The current scene.
Returns:
The current scene.
"""
return cls.scenes.get(cls._current)
[docs] @classmethod
def is_empty(cls) -> bool:
"""
Checks if the scene manager contains no scene.
Returns:
bool: True if the scene is empty. False otherwise.
"""
return not cls.scenes
[docs] @classmethod
def add(cls, scene: Scene, scene_id: str):
"""
Add a scene to the current scene manager.
If the manager is empty the current scene will be updated.
Args:
scene (Scene): The scene to add to the manager.
scene_id (str): The id of the scene.
Raises:
IdError: The given scene id is already used.
"""
if scene_id in cls.scenes:
raise IdError(f"The scene id {scene_id} is not unique in this manager")
if cls.is_empty():
cls.set(scene_id)
cls.scenes[scene_id] = scene
scene.id = scene_id
[docs] @classmethod
def set(cls, scene_id: str):
"""
Changes the current scene.
Args:
scene_id (str): The id of the new scene.
"""
cls._current = scene_id
[docs] @classmethod
def setup(cls):
"""Calls the setup function of the current scene."""
if cls.is_empty():
return
cls.current.private_setup()
[docs] @classmethod
def draw(cls):
"""Calls the draw function of the current scene."""
if cls.is_empty():
return
cls.current.private_draw()
[docs] @classmethod
def update(cls):
"""Calls the update function of the current scene."""
if cls.is_empty():
return
cls.current.private_update()
[docs] @classmethod
def fixed_update(cls):
"""Calls the fixed update function of the current scene."""
if cls.is_empty():
return
cls.current.private_fixed_update()
[docs] @classmethod
def paused_update(cls):
"""Calls the paused update function of the current scene."""
if cls.is_empty():
return
cls.current.paused_update()