|
1 |
| -from manim.mobject.opengl.opengl_mobject import OpenGLMobject as Mobject |
| 1 | +from typing import TYPE_CHECKING, final, Sequence |
2 | 2 |
|
3 |
| -from typing import final, Sequence |
| 3 | +if TYPE_CHECKING: |
| 4 | + from manim.mobject.opengl.opengl_mobject import OpenGLMobject as Mobject |
4 | 5 |
|
5 | 6 |
|
6 | 7 | __all__ = ["SceneBuffer"]
|
7 | 8 |
|
8 | 9 |
|
9 | 10 | @final
|
10 | 11 | class SceneBuffer:
|
| 12 | + """ |
| 13 | + A "buffer" between :class:`.Scene` and :class:`.Animation` |
| 14 | +
|
| 15 | + Operations an animation wants to do on :class:`.Scene` should be |
| 16 | + done here (eg. :meth:`.Scene.add`, :meth:`.Scene.remove`). The |
| 17 | + scene will then apply these changes at specific points (namely |
| 18 | + at the beginning and end of animations) |
| 19 | +
|
| 20 | + It is the scenes job to clear the buffer in between the beginning |
| 21 | + and end of animations. |
| 22 | + """ |
| 23 | + |
11 | 24 | def __init__(self) -> None:
|
12 |
| - self.__to_remove: list[Mobject] = [] |
13 |
| - self.__to_add: list[Mobject] = [] |
| 25 | + self.to_remove: list[Mobject] = [] |
| 26 | + self.to_add: list[Mobject] = [] |
| 27 | + self.deferred = False |
14 | 28 |
|
15 | 29 | def add(self, *mobs: Mobject) -> None:
|
16 | 30 | check_args(mobs)
|
17 |
| - self.__to_add.extend(mobs) |
| 31 | + self._check_deferred() |
| 32 | + self.to_add.extend(mobs) |
18 | 33 |
|
19 | 34 | def remove(self, *mobs: Mobject) -> None:
|
20 | 35 | check_args(mobs)
|
21 |
| - self.__to_remove.extend(mobs) |
| 36 | + self._check_deferred() |
| 37 | + self.to_remove.extend(mobs) |
22 | 38 |
|
23 | 39 | def clear(self) -> None:
|
24 |
| - self.__to_remove.clear() |
25 |
| - self.__to_add.clear() |
26 |
| - |
27 |
| - @property |
28 |
| - def to_remove(self) -> tuple[Mobject, ...]: |
29 |
| - return tuple(self.__to_remove) |
| 40 | + self.to_remove.clear() |
| 41 | + self.to_add.clear() |
30 | 42 |
|
31 |
| - @to_remove.setter |
32 |
| - def remove_mobject(self, mobs: Sequence[Mobject]) -> None: |
33 |
| - check_args(mobs) |
34 |
| - self.__to_remove = list(mobs) |
35 |
| - |
36 |
| - @property |
37 |
| - def to_add(self) -> tuple[Mobject, ...]: |
38 |
| - return tuple(self.__to_add) |
| 43 | + def deferred_clear(self) -> None: |
| 44 | + """Clear ``self`` on next operation""" |
| 45 | + self.deferred = True |
39 | 46 |
|
40 |
| - @to_add.setter |
41 |
| - def add_mobject(self, mobs: Sequence[Mobject]) -> None: |
42 |
| - check_args(mobs) |
43 |
| - self.__to_add = list(mobs) |
| 47 | + def _check_deferred(self) -> None: |
| 48 | + if self.deferred: |
| 49 | + self.clear() |
| 50 | + self.deferred = False |
44 | 51 |
|
45 | 52 | def __str__(self) -> str:
|
46 |
| - to_add = self.__to_add |
47 |
| - to_remove = self.__to_remove |
| 53 | + to_add = self.to_add |
| 54 | + to_remove = self.to_remove |
48 | 55 | return f"{type(self).__name__}({to_add=}, {to_remove=})"
|
49 | 56 |
|
| 57 | + __repr__ = __str__ |
| 58 | + |
50 | 59 |
|
51 | 60 | def check_args(mobs: Sequence[Mobject]) -> None:
|
52 | 61 | if not (
|
|
0 commit comments