You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spiel/spiel/screens/transition.py

86 lines
2.1 KiB
Python

from __future__ import annotations
from typing import Type
from textual.app import ComposeResult
from textual.reactive import reactive
from spiel.screens.screen import SpielScreen
from spiel.slide import Slide
from spiel.transitions.protocol import Direction, Transition
from spiel.triggers import Triggers
from spiel.widgets.fixed_slide import FixedSlideWidget
from spiel.widgets.footer import Footer
class SlideTransitionScreen(SpielScreen):
DEFAULT_CSS = """\
SlideTransitionScreen {
layout: vertical;
overflow: hidden hidden;
layers: below above;
}
FixedSlideWidget#from {
layer: above;
}
FixedSlideWidget#to {
layer: below;
}
Footer {
layer: above;
}
Footer#dummy {
layer: below;
}
"""
progress = reactive(0, init=False, layout=True)
def __init__(
self,
from_slide: Slide,
from_triggers: Triggers,
to_slide: Slide,
transition: Type[Transition],
direction: Direction,
):
super().__init__()
self.from_slide = from_slide
self.from_triggers = from_triggers
self.to_slide = to_slide
self.transition = transition()
self.direction = direction
def compose(self) -> ComposeResult:
from_widget = FixedSlideWidget(self.from_slide, triggers=self.from_triggers, id="from")
to_widget = FixedSlideWidget(self.to_slide, id="to")
self.transition.initialize(
from_widget=from_widget,
to_widget=to_widget,
direction=self.direction,
)
yield from_widget
yield to_widget
yield Footer()
yield Footer(
id="dummy"
) # a dummy footer to hold space on the "below" layer, won't be displayed
def watch_progress(self, new_progress: float) -> None:
from_widget = self.query_one("#from")
to_widget = self.query_one("#to")
self.transition.progress(
from_widget=from_widget,
to_widget=to_widget,
direction=self.direction,
progress=new_progress,
)