Skip to content

Commit

Permalink
feat(lib): add start_skip_animations and stop_skip_animations met…
Browse files Browse the repository at this point in the history
…h. (#523)
  • Loading branch information
jeertmans authored Jan 22, 2025
1 parent 074a029 commit b07a838
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 0 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
(unreleased)=
## [Unreleased](https://github.com/jeertmans/manim-slides/compare/v5.4.0...HEAD)

(unreleased-added)=
### Added

- Added `start_skip_animations` and `stop_skip_animations` methods.
[#523](https://github.com/jeertmans/manim-slides/pull/523)

(v5.4.0)=
## [v5.4.0](https://github.com/jeertmans/manim-slides/compare/v5.3.1...v5.4.0)

Expand Down
2 changes: 2 additions & 0 deletions docs/source/reference/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ use, not the methods used internally when rendering.
next_section,
next_slide,
remove_from_canvas,
start_skip_animations,
stop_skip_animations,
wait_time_between_slides,
wipe,
zoom,
Expand Down
27 changes: 27 additions & 0 deletions manim_slides/slide/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ def __init__(
self._start_animation = 0
self._canvas: MutableMapping[str, Mobject] = {}
self._wait_time_between_slides = 0.0
self._skip_animations = False

@property
@abstractmethod
Expand Down Expand Up @@ -304,6 +305,11 @@ def next_slide(
If `manim` is used, this is also passed to `:meth:`Scene.next_section<manim.scene.scene.Scene.next_section>`,
which will avoid rendering the corresponding animations.
.. seealso::
:meth:`start_skip_animations`
:meth:`stop_skip_animations`
:param loop:
If set, next slide will be looping.
:param auto_next:
Expand Down Expand Up @@ -463,6 +469,9 @@ def construct(self):

self._current_slide += 1

if self._skip_animations:
base_slide_config.skip_animations = True

self._base_slide_config = base_slide_config
self._start_animation = self._current_animation

Expand Down Expand Up @@ -572,6 +581,24 @@ def _save_slides(
f"Slide '{scene_name}' configuration written in '{slide_path.absolute()}'"
)

def start_skip_animations(self) -> None:
"""
Start skipping animations.
This automatically applies ``skip_animations=True``
to all subsequent calls to :meth:`next_slide`.
This is useful when you want to skip animations from multiple slides in a row,
without having to manually set ``skip_animations=True``.
"""
self._skip_animations = True

def stop_skip_animations(self) -> None:
"""
Stop skipping animations.
"""
self._skip_animations = False

def wipe(
self,
*args: Any,
Expand Down
9 changes: 9 additions & 0 deletions tests/test_base_slide.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,15 @@ def test_wait_time_between_slides(self, base_slide: BaseSlide) -> None:

assert base_slide.wait_time_between_slides == 0.0

def test_skip_animations(self, base_slide: BaseSlide) -> None:
assert base_slide._skip_animations == False

def test_start_and_stop_skip_animations(self, base_slide: BaseSlide) -> None:
base_slide.start_skip_animations()
assert base_slide._skip_animations == True
base_slide.stop_skip_animations()
assert base_slide._skip_animations == False

def test_play(self) -> None:
pass # This method should be tested in test_slide.py

Expand Down
22 changes: 22 additions & 0 deletions tests/test_slide.py
Original file line number Diff line number Diff line change
Expand Up @@ -527,9 +527,25 @@ def construct(self) -> None:
assert not self._base_slide_config.skip_animations
self.play(GrowFromCenter(square))

class Baz(CESlide):
def construct(self) -> None:
circle = Circle(color=BLUE)
self.play(GrowFromCenter(circle))
assert not self._base_slide_config.skip_animations
self.start_skip_animations()
self.next_slide()
square = Square(color=BLUE)
self.play(GrowFromCenter(square))
assert self._base_slide_config.skip_animations
self.next_slide()
assert self._base_slide_config.skip_animations
self.play(GrowFromCenter(square))
self.stop_skip_animations()

with tmp_cwd() as tmp_dir:
init_slide(Foo).render()
init_slide(Bar).render()
init_slide(Baz).render()

slides_folder = Path(tmp_dir) / "slides"

Expand All @@ -547,6 +563,12 @@ def construct(self) -> None:

assert len(config.slides) == 3

slide_file = slides_folder / "Baz.json"

config = PresentationConfig.from_file(slide_file)

assert len(config.slides) == 1

def test_canvas(self) -> None:
@assert_constructs
class _(CESlide):
Expand Down

0 comments on commit b07a838

Please sign in to comment.