
    AHj&                        U d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZ d dlmZ erd d	lmZ d d
lmZ dZded<   e G d d             Z G d de      Z G d de      Z y)    )annotations)ABCabstractmethod)	dataclass)TYPE_CHECKINGClassVarIterable
NamedTuple)
SpatialMap)Canvas	Rectangle)OffsetRegionSizeSpacing)StripRenderable)	TypeAlias)Widgetlist[WidgetPlacement]r   ArrangeResultc                  r    e Zd ZU dZded<   	 ded<   	 ded<   	 dZd	ed
<   	 edd       Zedd       ZddZ	y)DockArrangeResultz:Result of [Layout.arrange][textual.layout.Layout.arrange].r   
placementszset[Widget]widgetsr   scroll_spacingNz"SpatialMap[WidgetPlacement] | None_spatial_mapc                    | j                   ;t               | _         | j                   j                  d | j                  D               | j                   S )zA lazy-calculated spatial map.c              3     K   | ]L  }|j                   j                  |j                        |j                  |j                  |j
                  |f N y wN)regiongrowmarginoffsetfixedoverlay).0	placements     F/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/layout.py	<genexpr>z0DockArrangeResult.spatial_map.<locals>.<genexpr>'   sR      	%  $$)))*:*:;$$OO%%	%s   AA)r   r   insertr   selfs    r(   spatial_mapzDockArrangeResult.spatial_map"   sO     $ *D$$ 	% "&	% 	        c                v    | j                   \  }}}}| j                  j                  j                  d||df      S )z\The total area occupied by the arrangement.

        Returns:
            A Region.
        r   )r   r-   total_regionr!   )r,   _toprightbottom_lefts        r(   r0   zDockArrangeResult.total_region4   s>     &*%8%8"eVU,,111eVQ2GHHr.   c                   | j                   |v r| j                  S | j                  j                  |      }|j                  }|D cg c]/  }|j
                  s ||j                  |j                  z         r|1 }}|S c c}w )zGet the placements visible within the given region.

        Args:
            region: A region.

        Returns:
            Set of placements.
        )r0   r   r-   get_values_in_regionoverlapsr$   r    r#   )r,   r    visible_placementsr7   r'   culled_placementss         r(   get_visible_placementsz(DockArrangeResult.get_visible_placements>   s     &??"!--BB6J?? 0
(9+;+;i>N>N+N"O 
 

 ! 
s   4A>)returnzSpatialMap[WidgetPlacement])r;   r   )r    r   r;   r   )
__name__
__module____qualname____doc____annotations__r   propertyr-   r0   r:    r.   r(   r   r      s[    D%%R.,7;L4;3! !" I I!r.   r   c                      e Zd ZU dZded<   ded<   ded<   ded	<   d
Zded<   dZded<   dZded<   dZded<   e	dd       Z
e	 	 	 	 	 	 dd       Zedd       Zedd       Z	 	 	 	 	 	 ddZy)WidgetPlacementzEThe position, size, and relative order of a widget within its parent.r   r    r   r#   r   r"   r   widgetr   intorderFboolr$   r%   absolutec                N    | j                  | j                  j                        S )z7Reset the origin in the placement (moves it to (0, 0)).)r    )_replacer    reset_offsetr+   s    r(   reset_originzWidgetPlacement.reset_origin`   s     }}DKK$<$<}==r.   c                    |rE|D 	
c	g c]+  \  }}}}}}}	}
 | |j                   ||z   n|||||||	|
      - c	}
}	}}}}}}S |S c c	}
}	}}}}}}w )a  Move all non-absolute placements by a given offset.

        Args:
            placements: List of placements.
            offset: Offset to add to placements.

        Returns:
            Placements with adjusted region, or same instance if offset is null.
        )absolute_offset)clsr   translate_offsetr    r#   r"   layout_widgetrG   r$   r%   rI   s              r(   	translatezWidgetPlacement.translatee   s       _i  [FFFM5%RZ  )88@ !11#!  " # s   0A
c                b    t        |      D ]!  \  }}|j                  s|j                  ||<   # y)zjApplies absolute offsets (in place).

        Args:
            placements: A list of placements.
        N)	enumeraterI   rM   )rP   r   indexr'   s       r(   apply_absolutezWidgetPlacement.apply_absolute   s6     !** 5 	;E9!!$-$:$:
5!	;r.   c                    t        j                  |D cg c]'  }|j                  j                  |j                        ) c}      }|S c c}w )zGet a bounding region around all placements.

        Args:
            placements: A number of placements.

        Returns:
            An optimal binding box around all placements.
        )r   
from_unionr    r!   r"   )rP   r   r'   bounding_regions       r(   
get_boundszWidgetPlacement.get_bounds   sG     !++FPQY""9#3#34Q
  Rs   ,A	c           
     R   | j                   }|j                  }|j                  s|j                  dd      s| S | j                  }| j
                  }|j                  +|j                  |j                  |j                  z   |z
        }|j                  | j                        j                  |j                  |j                  | j
                  ||z
        }|j                  | j                  j                  z
  }|| j                  k7  r| \  }}}}}	}
}}t        |||||	|
||      }|S | S )aU  Apply any absolute offset or constrain rules to the placement.

        Args:
            constrain_region: The container region when applying constrain rules.
            absolute_offset: Default absolute offset that moves widget into screen coordinates.

        Returns:
            Processes placement, may be the same instance.
        constrain_xconstrain_y)rE   stylesrO   has_any_rulesr    r"   	at_offsettop_leftrS   r#   	constrainr]   r^   rD   )r,   constrain_regionrO   rE   r_   r    r"   r#   _offsetrG   r$   r%   rI   r'   s                 r(   process_offsetzWidgetPlacement.process_offset   s#    %%f.B.B=/
 K!!-%%&&8?JF !!$++.88KK.	
 !3!33T[[ OSLFGVVUE7H'ugxI r.   N)r;   rD   )r   r   rQ   r   r;   r   )r   r   r;   None)r   zIterable[WidgetPlacement]r;   r   )rd   r   rO   r   r;   rD   )r<   r=   r>   r?   r@   rG   r$   r%   rI   rA   rM   classmethodrS   rW   r[   rf   rB   r.   r(   rD   rD   T   s    ONNONE3NE4GTHd> > .BH	 @ ; ;  ( &(9?(	(r.   rD   c                  |    e Zd ZU dZdZded<   ddZe	 d	 	 	 	 	 	 	 	 	 dd       ZddZ		 	 	 	 	 	 	 	 	 	 ddZ
dd	Zy
)LayoutzNBase class of the object responsible for arranging Widgets within a container. zClassVar[str]namec                "    d| j                    dS )N<>)rl   r+   s    r(   __repr__zLayout.__repr__   s    499+Qr.   c                     y)zGenerate a layout map that defines where on the screen the widgets will be drawn.

        Args:
            parent: Parent widget.
            size: Size of container.

        Returns:
            An iterable of widget location
        NrB   )r,   parentchildrensizegreedys        r(   arrangezLayout.arrange   s    r.   c                    |j                   sd}|S |j                  t        |j                  rdn|j                  d      d      }|j
                  j                  }|S )zGet the optimal content width by arranging children.

        Args:
            widget: The container widget.
            container: The container size.
            viewport: The viewport size.

        Returns:
            Width of the content.
        r   T)optimal)_nodesrv   r   shrinkwidthr0   r2   )r,   rE   	containerviewportr{   arrangements         r(   get_content_widthzLayout.get_content_width   s]     }}E  !..&--QY__a@ ) K  ,,22Er.   c                8   |j                   r|j                  j                  sBt        d |j                  D              r&|j                  t        ||j                              }n|j                  t        |d            }|j                  j                  }|S d}|S )a  Get the content height.

        Args:
            widget: The container widget.
            container: The container size.
            viewport: The viewport.
            width: The content width.

        Returns:
            Content height (in lines).
        c              3  H   K   | ]  }|j                   j                    y wr   )r_   is_dynamic_height)r&   childs     r(   r)   z,Layout.get_content_height.<locals>.<genexpr>	  s      338..3s    "r   )	ry   r_   	is_dockedalldisplayed_childrenrv   r   heightr0   )r,   rE   r|   r}   r{   r~   r   s          r(   get_content_heightzLayout.get_content_height   s     ====**s 3<B<U<U3 0 %nnT%9I9I-JK$nnT%^< --44F  Fr.   c                  	
 |j                   \  }}t        ||      }|j                  j                  \  

r|j                  d   
z   
|j
                  j                  	d	
fd}|j                  D cg c]   }|j                  r ||j                        " }}|j                  ||j                        }|S c c}w )zRender keylines around all widgets.

        Args:
            container: The container widget.

        Returns:
            A renderable to draw the keylines.
        r   c                p    | j                   z
  dz
  }| j                  \  }}t        ||dz   |dz         S )zGet a canvas Rectangle that wraps a region.

            Args:
                region: Widget region.

            Returns:
                A Rectangle that encloses the widget.
            )   r      )r#   rt   r   )r    r#   r{   r   container_offsetkeyline_color
line_styles       r(   get_rectanglez,Layout.render_keyline.<locals>.get_rectangle'  sA     ]]%55>F"KKME6VUQY
M:VVr.   )r    r   r;   r   )
outer_sizer   r_   keylinebackground_colorscontent_regionr#   rs   visibler    render
rich_style)r,   r|   r{   r   canvasr   rE   
primitivescanvas_renderabler   r   r   s            @@@r(   render_keylinezLayout.render_keyline  s     ",,vv&$-$4$4$<$<!
M%77:]JM$33::	W $,,
~~ &--(

 

 #MM*i6J6JK  
s   8%B=N)r;   str)T)
rr   r   rs   zlist[Widget]rt   r   ru   rH   r;   r   )rE   r   r|   r   r}   r   r;   rF   )
rE   r   r|   r   r}   r   r{   rF   r;   rF   )r|   r   r;   r   )r<   r=   r>   r?   rl   r@   rp   r   rv   r   r   r   rB   r.   r(   rj   rj      s    XD-     	
  
 "*)-9=FI	6%!r.   rj   N)!
__future__r   abcr   r   dataclassesr   typingr   r   r	   r
   textual._spatial_mapr   textual.canvasr   r   textual.geometryr   r   r   r   textual.stripr   typing_extensionsr   textual.widgetr   r   r@   r   rD   rj   rB   r.   r(   <module>r      sm    " # ! @ @ + , : : )+%2y 2 <! <! <!~tj tno!S o!r.   