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/widgets/fixed_slide.py

51 lines
1.6 KiB
Python

from __future__ import annotations
import sys
from rich.box import HEAVY
from rich.console import RenderableType
from rich.errors import NotRenderableError
from rich.panel import Panel
from rich.protocol import is_renderable
from rich.style import Style
from rich.traceback import Traceback
import spiel
from spiel.exceptions import SpielException
from spiel.slide import Slide
from spiel.triggers import Triggers
from spiel.widgets.widget import SpielWidget
class FixedSlideWidget(SpielWidget):
def __init__(self, slide: Slide, triggers: Triggers | None = None, id: str | None = None):
super().__init__(id=id)
self.slide = slide
self.triggers = triggers or Triggers.new()
def render(self) -> RenderableType:
try:
self.remove_class("error")
r = self.slide.render(triggers=self.triggers)
if is_renderable(r):
return r
else:
raise NotRenderableError(f"object {r!r} is not renderable")
except Exception:
self.add_class("error")
et, ev, tr = sys.exc_info()
if et is None or ev is None or tr is None:
raise SpielException("Expected to be handling an exception, but wasn't.")
return Panel(
Traceback.from_exception(
exc_type=et,
exc_value=ev,
traceback=tr,
suppress=(spiel,),
),
title="Slide content failed to render",
border_style=Style(bold=True, color="red1"),
box=HEAVY,
)