"Tex6ddlmZmZddlmZddlmZddlmZddl m Z m Z m Z m Z mZmZmZmZmZddlmZddlmZdd lmZmZmZmZdd lmZdd lmZdd l m!Z!dd l"m#Z#ddl$m%Z%m&Z&ddl'm(Z(ddl)m*Z*e rddl+m,Z,GddeZ-e de#fZ.e de-fZ/Gdde0Z1Gdde1Z2GddZ3GddeZ4Gdde4Z5Gdd e4Z6e&Gd!dZ7e8d"k(rdd#l9mZeZe7Z:e:jwe7d$d%&e7dd'(e7d)d*+e:d'jye7d,-e7d.d/0e:d.jye7d1d/0e7d2-e:d2jwe7d3-e7d4-e7d5-e:d,jwe7e:jzd6-e7d7-e:d1j}d8eje:y9y9):)ABCabstractmethod)islice) itemgetter)RLock) TYPE_CHECKINGDictIterableList NamedTupleOptionalSequenceTupleUnion) ratio_resolve)Align)ConsoleConsoleOptionsRenderableType RenderResult)ReprHighlighter)Panel)Pretty)Region)Result rich_repr)Segment) StyleTypeTreec2eZdZUdZeed<eeeed<y) LayoutRenderzAn individual layout render.regionrenderN)__name__ __module__ __qualname____doc__r__annotations__r r-/usr/lib/python3/dist-packages/rich/layout.pyr#r# s& N g r,r#LayoutceZdZdZy) LayoutErrorzLayout related error.Nr&r'r(r)r+r,r-r0r0+sr,r0ceZdZdZy) NoSplitterz"Requested splitter does not exist.Nr1r+r,r-r3r3/s,r,r3cHeZdZdZeZd dddeddfdZded e de fd Z y) _Placeholderz4An internal renderable used as a Layout placeholder.layoutr.stylereturnNc ||_||_yN)r6r7)selfr6r7s r-__init__z_Placeholder.__init__8s  r,consoleoptionsc#jK|j}|jxs|jj}|j}|jr|jd|d|dnd|d|d}t t jt|d|j|j|d|yw) Nz (z x )(middle)verticalblue)r7title border_styleheight) max_widthrGsizer6namerrcenterrr7 highlighter)r;r=r>widthrGr6rEs r-__rich_console__z_Placeholder.__rich_console__<s!!67<<#6#6{{{{oRwc& 3UG3vha(   LL( ;**""5)   sB1B3)) r&r'r(r)rrLrr<rrrrNr+r,r-r5r53sD>!#Kx 4  )7  r,r5c jeZdZUdZdZeed<edefdZede dde de e de ffd Z y ) SplitterzBase class for a splitter.rOrJr8cy)z(Get the icon (emoji) used in layout.treeNr+r;s r- get_tree_iconzSplitter.get_tree_iconUr,childrenr.r$cy)zDivide a region amongst several child layouts. Args: children (Sequence(Layout)): A number of child layouts. region (Region): A rectangular region to divide. Nr+)r;rVr$s r-dividezSplitter.divideYrUr,N)r&r'r(r)rJstrr*rrTrrr rrXr+r,r-rQrQPsg$D#N7s77  * 4: %&() *  r,rQc JeZdZdZdZdefdZdeddede e deffdZ y ) RowSplitterz!Split a layout region in to rows.rowr8cy)Nu[layout.tree.row]⬌r+rSs r-rTzRowSplitter.get_tree_iconjs%r,rVr.r$c#K|\}}}}t||}d}t} t||D]\} } | | ||z|| |f|| z }ywNrrrzip) r;rVr$xyrMrG render_widthsoffset_Regionchild child_widths r-rXzRowSplitter.dividemsk%1eV%eX6 "%h "> " E;VQ VDD D k !F "AA N r&r'r(r)rJrYrTrrr rrXr+r,r-r[r[esG+ D&s& " * "4: " %&() * "r,r[c JeZdZdZdZdefdZdeddede e deffdZ y ) ColumnSplitterz$Split a layout region in to columns.columnr8cy)Nu[layout.tree.column]⬍r+rSs r-rTzColumnSplitter.get_tree_icon~s(r,rVr.r$c#K|\}}}}t||}d}t} t||D]\} } | | |||z|| f|| z }ywr_r`) r;rVr$rbrcrMrGrender_heightsrerfrg child_heights r-rXzColumnSplitter.dividesk%1eV&vx8#&x#@ # E<AJ|DD D l "F #riNrjr+r,r-rlrlysG. D)s) # * #4: # %&() * #r,rlceZdZdZeedZ d*dddddddeedee d ee d e d e d e d dfdZ d e fdZed efdZed edfdZed efdZde d edfdZde d dfdZed+dZdddedefdeee fd dfdZdedefd dfdZdedefd dfdZdedefd dfdZd,dZded dfdZd d!d"e d dfd#Z d$e d%e d e!fd&Z"d e#d'e$d efd(Z%d e#d'e$d e&fd)Z'y)-r.aBA renderable to divide a fixed height in to rows or columns. Args: renderable (RenderableType, optional): Renderable content, or None for placeholder. Defaults to None. name (str, optional): Optional identifier for Layout. Defaults to None. size (int, optional): Optional fixed size of layout. Defaults to None. minimum_size (int, optional): Minimum size of layout. Defaults to 1. ratio (int, optional): Optional ratio for flexible layout. Defaults to 1. visible (bool, optional): Visibility of layout. Defaults to True. )r\rmNrT)rJrI minimum_sizeratiovisible renderablerJrIrsrtrur8c|xs t||_||_||_||_||_||_|jd|_g|_ i|_ t|_ y)Nrm) r5 _renderablerIrsrtrJru splitterssplitter _children _render_mapr_lock)r;rvrJrIrsrtrus r-r<zLayout.__init__sg&;d); (   ":$..":"< ')&(W r,c#Kd|jdfd|jdfd|jdfd|jdfyw)NrJrIrsrrt)rJrIrsrtrSs r- __rich_repr__zLayout.__rich_repr__sLdii%%dii%%d//22tzz1$$sAAc6|jr|S|jS)zLayout renderable.)r{rxrSs r-rvzLayout.renderables~~t;4+;+;;r,cZ|jDcgc]}|js|c}Scc}w)zGets (visible) layout children.)r{ru)r;rgs r-rVzLayout.childrens"$(>>C%U]]CCCs((c|jS)zGet a map of the last render.)r|rSs r-mapz Layout.mapsr,cv|j|k(r|S|jD]}|j|}||cSy)zGet a named layout, or None if it doesn't exist. Args: name (str): Name of layout. Returns: Optional[Layout]: Layout instance or None if no layout was found. N)rJr{get)r;rJrg named_layouts r-rz Layout.getsF 99 K ($yy +'' (r,cH|j|}|td||S)NzNo layout with name )rKeyError)r;rJr6s r- __getitem__zLayout.__getitem__s,$ >1$:; ; r,cddlmddlmddlm}dddffd |}||d |j jd }d fd |||S)z/Get a tree renderable to show layout structure.r)Styled)Tabler r6r.r8c|jj}jd}|jr t |nt |d}|j |||}|S)N)rrrr)paddingdim)rzrTgridruradd_row)r6icontabletext_summaryrrs r-summaryzLayout.tree..summarys`??002DJJ|J4E#)..vfVF^U6S  MM$ %HOr, layout.tree.T) guide_style highlightc|jD]9}|j|d|jj|;y)Nr)r)r{addrzrJ)treer6rgrecursers r-rzLayout.tree..recursesR)) HH&25>>3F3F2G$H  r,)rr!r6r.r8N) rich.styledr rich.tabler rich.treer!rzrJ)r;r!r6rrrrrs @@@@r-rz Layout.treesg '$" H   FO&v';';&<=    d r,rm)rzlayoutsrzc|Dcgc]}t|tr|n t|!}} t|tr|n|j||_||jddycc}w#t $rt d|wxYw)zSplit the layout in to multiple sub-layouts. Args: *layouts (Layout): Positional arguments should be (sub) Layout instances. splitter (Union[Splitter, str]): Splitter instance or name of splitter. zNo splitter called N) isinstancer.rQryrzrr3r{)r;rzrr6_layoutss r-splitz Layout.splits" !0FfVn D   Ah1-T^^H-/ M%q  A28,?@ @ As$A'+A,,BcLd|D}|jj|y)zAdd a new layout(s) to existing split. Args: *layouts (Union[Layout, RenderableType]): Positional arguments should be renderables or (sub) Layout instances. c3VK|]!}t|tr|n t|#ywr:)rr.).0r6s r- z#Layout.add_split..%s* !0FfVn D s')N)r{extend)r;rrs r- add_splitzLayout.add_splits% !  h'r,c(|j|ddiy)zSplit the layout in to a row (layouts side by side). Args: *layouts (Layout): Positional arguments should be (sub) Layout instances. rzr\Nrr;rs r- split_rowzLayout.split_row+s  G,e,r,c(|j|ddiy)zSplit the layout in to a column (layouts stacked on top of each other). Args: *layouts (Layout): Positional arguments should be (sub) Layout instances. rzrmNrrs r- split_columnzLayout.split_column3s  G/h/r,c"|jdd=y)zReset splits to initial state.N)r{rSs r-unsplitzLayout.unsplit;s NN1 r,cT|j5||_dddy#1swYyxYw)zjUpdate renderable. Args: renderable (RenderableType): New renderable object. N)r}rx)r;rvs r-updatez Layout.update?s( ZZ *)D  * * *s'r=r layout_namec2|j5||}|j|\}}|\}}}} |j||jj || } t || |j|<|j | ||dddy#1swYyxYw)zRefresh a sub-layout. Args: console (Console): Console instance where Layout is to be rendered. layout_name (str): Name of layout. N)r}r| render_linesr>update_dimensionsr#update_screen_lines) r;r=rr6r$_linesrbrcrMrGliness r-refresh_screenzLayout.refresh_screenHsZZ 5+&F!--f5NFF$* !Q5&((99%HE(4FE'BD  V $  ' 'q! 4 5 5 5s A7B  BrMrGct|tdd||fg}|j}|j}g}|j}|rO|||d\}} |j} | r)|jj | | D] } ||  |rOt |tdD cic]\}} ||  } }} | Scc} }w)z,Create a dict that maps layout on to Region.rr)key)rappendpoprVrzrXsortedr) r;rMrGstackpushrlayout_regionsappend_layout_regionr6r$rVchild_and_region region_maps r-_make_region_mapzLayout._make_region_mapYs/3VAq%5P.Q-R||ii68-44  '+B/NFFH(.(>(>x(P+$)*+ #)Z]"K  FN    s" B4r>c|j}|jxs |j}|j||}|jDcgc]\}}|js||f}}}i} |j } |j } |D]B\}}| |j| |j|j} t|| | |<D| Scc}}w)zRender the sub_layouts. Args: console (Console): Console instance. options (ConsoleOptions): Console options. Returns: RenderMap: A dict that maps Layout on to a tuple of Region, lines ) rHrGritemsrVrrrvrMr#) r;r=r> render_width render_heightrr6r$r render_maprrrs r-r%z Layout.renderns(( 8'.. **<G #-"2"2"4 ??V   68 ++ #55, =NFF !!#4V\\6==#QE".fe!tj}|D]}|Ed{| dddycc}w7#1swYyxYwwr:)r}rHrMrGr%rr|rangervaluesrarrline)r;r=r>rMrGr_ layout_lines_islicer$r_xrc _layout_width layout_heightr\rnew_line layout_rows r-rNzLayout.__rich_console__s(ZZ %%6E^^5w~~FWg.G.Gv.VWJ)D =B6]0K0KL0KG!+!2!2!4 % 6<3A}m!$L!Q->?"%ICJJt$% %||~H*  %%%    1L&!  s< D A+D: D A5D8D9 D D  DDD r:)r8r!)r8N)(r&r'r(r)r[rlryr rrYintboolr<rrpropertyrvr rV RenderMaprrrrrrQrrrrrrr RegionMaprrrr%rrNr+r,r-r.r.s; $~>I04#"^,sm  sm    *%v% rs#   "JJ(# :  6! " <' (  ) --  : s *"("(#X#( QQ Qh z$iG XF H1%QV$BX&  6NV0&fA2NO 6NV!OP 4LEF16x3H 6Nv{{ A6wCWX 9U# MM&1r,