73 lines
2 KiB
Python
73 lines
2 KiB
Python
from typing import Type, TYPE_CHECKING
|
|
|
|
import pyglet
|
|
|
|
from source.gui.event import EventPropagationMixin
|
|
|
|
if TYPE_CHECKING:
|
|
from source.gui.scene.abc import Scene
|
|
|
|
|
|
class Window(pyglet.window.Window, EventPropagationMixin): # NOQA
|
|
"""
|
|
A window. Based on the pyglet window object.
|
|
Scene can be added to the window
|
|
"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self._scenes: list["Scene"] = list()
|
|
|
|
# Event Propagation
|
|
|
|
@property
|
|
def childs(self):
|
|
return self._scenes
|
|
|
|
# Scene Managing
|
|
|
|
def set_scene(self, scene_class: Type["Scene"], *scene_args, **scene_kwargs) -> "Scene":
|
|
"""
|
|
Set the scene of the window.
|
|
:scene_class: the class of the scene to add.
|
|
:scene_args: args for the creation of the scene object.
|
|
:scene_kwargs: kwargs for the creation of the scene object.
|
|
:return: the new created scene.
|
|
"""
|
|
|
|
self.clear_scene()
|
|
return self.add_scene(scene_class, *scene_args, **scene_kwargs)
|
|
|
|
def add_scene(self, scene_class: Type["Scene"], priority: int = 0, *scene_args, **scene_kwargs) -> "Scene":
|
|
"""
|
|
Add a scene of the window.
|
|
:scene_class: the class of the scene to add.
|
|
:scene_args: args for the creation of the scene object.
|
|
:scene_kwargs: kwargs for the creation of the scene object.
|
|
:return: the new created scene.
|
|
"""
|
|
|
|
scene: "Scene" = scene_class(window=self, *scene_args, **scene_kwargs)
|
|
self._scenes.insert(priority, scene)
|
|
return scene
|
|
|
|
def remove_scene(self, scene: "Scene") -> None:
|
|
"""
|
|
Remove a scene from the window.
|
|
:scene: the scene to remove.
|
|
"""
|
|
|
|
self._scenes.remove(scene)
|
|
|
|
def clear_scene(self) -> None:
|
|
"""
|
|
Clear the window from all the scenes.
|
|
"""
|
|
|
|
self._scenes.clear()
|
|
|
|
# Base Event
|
|
|
|
def on_draw(self): # NOQA
|
|
self.clear()
|