mirror of https://github.com/JoshKarpel/spiel
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.
51 lines
1.6 KiB
Python
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,
|
|
)
|