11"""Presentation wrapper implementation."""
22
33import os
4- from typing import IO , Any , Generic , Self
4+ from typing import IO , Any , Callable , Generic , Self , overload
55
66from pptx .presentation import Presentation as PptxPresentation
77
88from tppt ._pptx .tree import ppt2dict
9- from tppt ._tppt .slide_master import GenericTpptSlideMaster
9+ from tppt ._tppt .slide_layout import TpptSlideLayout
10+ from tppt ._tppt .slide_master import (
11+ DefaultSlideMaster ,
12+ GenericTpptSlideMaster ,
13+ )
1014from tppt .types import FilePath
1115
1216from .converter import PptxConvertible
@@ -38,11 +42,28 @@ def tree(self) -> dict[str, Any]:
3842 """Get the node tree of the presentation."""
3943 return ppt2dict (self ._pptx )
4044
45+ @overload
4146 @classmethod
4247 def builder (
43- cls , slide_master : "GenericTpptSlideMaster | None" = None
44- ) -> "PresentationBuilder[GenericTpptSlideMaster]" :
48+ cls ,
49+ ) -> "PresentationBuilder[DefaultSlideMaster]" : ...
50+
51+ @overload
52+ @classmethod
53+ def builder (
54+ cls ,
55+ slide_master : "type[GenericTpptSlideMaster]" ,
56+ ) -> "PresentationBuilder[GenericTpptSlideMaster]" : ...
57+
58+ @classmethod
59+ def builder (
60+ cls ,
61+ slide_master = None ,
62+ ):
4563 """Get a builder for the presentation."""
64+
65+ if slide_master is None :
66+ slide_master = DefaultSlideMaster
4667 return PresentationBuilder (slide_master )
4768
4869 def save (self , file : FilePath | IO [bytes ]) -> None :
@@ -64,17 +85,33 @@ def from_pptx(cls, pptx_obj: PptxPresentation) -> Self:
6485class PresentationBuilder (Generic [GenericTpptSlideMaster ]):
6586 """Builder for presentations."""
6687
67- def __init__ (self , slide_master : "GenericTpptSlideMaster | None" = None ) -> None :
88+ def __init__ (
89+ self ,
90+ slide_master : "type[GenericTpptSlideMaster]" ,
91+ ) -> None :
6892 """Initialize the builder."""
6993 import pptx
7094
7195 self ._pptx = pptx .Presentation ()
7296 self ._slide_master = slide_master
7397
74- def slide (self , slide : SlideBuilder , / ) -> Self :
98+ def slide (
99+ self ,
100+ slide : SlideBuilder
101+ | Callable [[type [GenericTpptSlideMaster ]], SlideBuilder | TpptSlideLayout ],
102+ / ,
103+ ) -> Self :
75104 """Add a slide to the presentation."""
76-
77- slide ._build (self )
105+ if isinstance (slide , SlideBuilder ):
106+ slide ._build (self )
107+ else :
108+ slide_layout = slide (self ._slide_master )
109+ slide_builder = (
110+ slide_layout .builder ()
111+ if isinstance (slide_layout , TpptSlideLayout )
112+ else slide_layout
113+ )
114+ slide_builder ._build (self )
78115
79116 return self
80117
0 commit comments