Source code for pyexlatex.presentation.beamer.templates.lists.dim_reveal_items

from typing import Sequence, List
from pyexlatex.models.lists.item import ListItem
from pyexlatex.models.lists.base import VerticalFillMixin
from pyexlatex.models.format.text.color.main import TextColor
from pyexlatex.presentation.beamer.overlay.overlay import Overlay
from pyexlatex.presentation.beamer.overlay.until_end import UntilEnd
from pyexlatex.presentation.beamer.overlay.next import NextWithIncrement, NextWithoutIncrement
from pyexlatex.models.containeritem import ContainerItem
from pyexlatex.models.item import ItemBase
from pyexlatex.models.lists.base import can_be_included_directly_in_list


[docs]class DimAndRevealListItem(ListItem): """ Single list item which reveals on each slide one-by-one and as the next one reveals, the last one dims. Use DimAndRevealListItems to construct. """ is_ListItem = True # so that passing within lists will treat as a list item
[docs] def __init__(self, contents, dim: bool = True, opacity: float = 0.3): self.dim = dim dim_ov = Overlay([UntilEnd(NextWithoutIncrement(1))]) next_ov = Overlay([UntilEnd(NextWithIncrement())]) if dim: contents = TextColor(contents, 'black', opacity=opacity, overlay=dim_ov) super().__init__(contents, overlay=next_ov)
[docs] def convert_to_regular_item(self): if self.dim: contents = self.contents.content # get from inside TextColor else: contents = self.contents item = ListItem(contents) self.__dict__.update(item.__dict__) self.__class__ = ListItem del self.is_DimAndRevealListItem del self.dim
[docs]class DimAndRevealListItems(VerticalFillMixin, ContainerItem, ItemBase): """ List items which reveal on each slide one-by-one and as the next one reveals, the last one dims. Pass to a list class such as OrderedList or UnorderedList """ name = '<dim and reveal container, should not enter latex output>' is_ListBase = True # so that passing within lists will treat as a list
[docs] def __init__(self, contents: Sequence, dim_last_item: bool = False, opacity: float = 0.3, vertical_fill: bool = False, dim_earlier_items: bool = True): self.orig_contents = contents self.dim_last_item = dim_last_item self.dim_earlier_items = dim_earlier_items self.opacity = opacity self.vertical_fill = vertical_fill self.add_data_from_content(contents) self.contents = self._get_contents()
def _get_contents(self) -> List[DimAndRevealListItem]: output = [] for item in self.orig_contents: if can_be_included_directly_in_list(item): output.append(item) else: output.append( DimAndRevealListItem( item, opacity=self.opacity, dim=self.dim_earlier_items, ) ) if not self.dim_last_item: output[-1] = DimAndRevealListItem( self.orig_contents[-1], dim=False, opacity=self.opacity ) output = self.vertically_space_content(output) return output def __str__(self) -> str: from pyexlatex.logic.builder import _build if isinstance(self.contents, str): return self.contents return _build(self.contents)
[docs]def eliminate_dim_reveal(content): """ Eliminates dim/reveal from nested content. Modifies in place by using regular list items """ if hasattr(content, 'content'): eliminate_dim_reveal(content.content) if hasattr(content, 'contents'): eliminate_dim_reveal(content.contents) if hasattr(content, 'is_DimAndRevealListItem') and content.is_DimAndRevealListItem: content.convert_to_regular_item() if isinstance(content, (list, tuple)): [eliminate_dim_reveal(c) for c in content]