
    AHjV#                    (   d dl mZ d dlmZ d dl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mZmZmZ d dlmZmZ e	rd d	lmZ d
ZddZ ed      Z ed      Z ed      Z	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 ddZ 	 	 	 	 	 	 	 	 ddZ!y)    )annotations)defaultdict)Fraction)
attrgetter)TYPE_CHECKINGIterableMappingSequence)	partition)NULL_OFFSETNULL_SPACINGRegionSizeSpacing)DockArrangeResultWidgetPlacement)Widgetic                n    t        t              }| D ]   }||j                     j                  |       " |S )zOrganize widgets into layers.

    Args:
        widgets: The widgets.

    Returns:
        A mapping of layer name onto the widgets within the layer.
    )r   listlayerappend)widgetslayerswidgets      H/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/_arrange.py_build_layersr      s9     .9->F ,v||##F+,M    zstyles.is_dockedzstyles.is_splitdisplayc           	        g }t         }| j                  }t        t        t        |            }t        |      }	|	j                         D ]  }
t        t        |
      \  }}|r"t        |||      \  }}|j                  |       n|j                  }|j                  j                  |      }t        t        |      \  }}|r6t        ||||       \  }}|j                  |       |j                  |      }n
t!               }||z  }|s| j#                  | j$                  j'                  | ||j(                  |             }|j+                  |      }|j,                  }|j.                  dk7  s|j0                  dk7  rt3        j4                  |      }|j(                  \  }}||j7                  |j(                  | j8                  j;                  |j<                  rdn||j>                  rdn|            j@                  z  }|rt3        jB                  ||      }t3        jD                  |       |j                  |        tG        |tI        |      |      S )a  Arrange widgets by applying docks and calling layouts

    Args:
        widget: The parent (container) widget.
        size: The size of the available area.
        viewport: The size of the viewport (terminal).

    Returns:
        Widget arrangement information.
    greedylefttopr   )%r   stylesr   filter_get_displayr   valuesr   
_get_split_arrange_split_widgetsextendregionget_spacing_between	_get_dock_arrange_dock_widgetsshrinkr   process_layoutlayoutarrangesizegrow_maximumoffsetalign_horizontalalign_verticalr   
get_bounds_align_size_extremaapply_dimensionsis_auto_widthis_auto_heightclamped	translateapply_absoluter   set)r   childrenr3   viewportoptimal
placementsscroll_spacingr$   display_widgetsr   r   non_split_widgetssplit_widgets_split_placementsdock_regionsplit_spacinglayout_widgetsdock_widgets_dock_placementsdock_spacinglayout_placementsplacement_offsetbounding_regioncontainer_widthcontainer_heights                            r   r2   r2   '   sI   $ )+J!N]]F 6,9:O?+F==? 91+4Z+I(=-CtX.*{ /0++K77D (1<M'N$ -Bk8K.*l ./%,,\:K"9L% & 5 5%%NK,<,<[ & !
 ,88FN*11&&&0F4I4IU4R"1"<"<=N"O4?4D4D1!1 F$6$6#((OO44#11#228H% '   $3$=$=%'7%! **+<=/0s91v Z_)=~NNr   c                   t         }t        }|j                  }|j                  }|\  }}	t        }
dx}x}x}}g }|j
                  }| D ]  }|j                  j                  }|j                  ||t        |j                        t        |j                        |      }|\  }}}t        |      |j                  z   }t        |      |j                  z   }|dk(  rt        d|	|z
  ||      }t        ||      }nn|dk(  rt        dd||      }t        ||      }nN|dk(  rt        dd||      }t        ||      }n.|dk(  rt        ||z
  d||      }t        ||      }nt        d      |j!                  |      }|j                  }|j#                  d      r|j                  j%                  ||      nt&        } | ||j)                  |      ||
||d	d
              t+        ||||      }||fS )a  Arrange widgets which are *docked*.

    Args:
        dock_widgets: Widgets with a non-empty dock.
        region: Region to dock within.
        viewport: Size of the viewport.

    Returns:
        A tuple of widget placements, and additional spacing around them.
    r   r    bottomr#   r"   rightzinvalid value for dock edger5   TF)r   TOP_Zr5   r3   r   r   r$   dock_get_box_modelr   widthheightintr   maxAssertionErrorr/   has_ruleresolver   r?   r   )rN   r+   rC   r!   _WidgetPlacementtop_zregion_offsetr3   r\   r]   null_spacingr#   rX   rW   r"   rE   append_placementdock_widgetedge	box_modelwidget_width_fractionwidget_height_fractionmarginwidget_widthwidget_heightrK   r$   r5   rP   s                                r   r.   r.      s$    'EMMM;;DME6L"##C#%#&4(*J!((# .
!!&&..(HTZZ0(4;;2GPV / 
	 AJ=5v01FLL@23fmmC8 F]$:L-XK/FU] A|]CKc=)CV^ A|]CKt\*DW_ !5q,VK|,E !!>??!((0## x(	 MM!!
  	 	%%m4
	
I.
` 3vt4L%%r   c                   t         }g }|j                  }|j                  }t        }t        }| D ]B  }	|	j
                  j                  }
|	j                  ||t        |j                        t        |j                              }|\  }}}|
dk(  r.t        |      |j                  z   }|j                  |       \  }}n|
dk(  r-t        |      |j                  z   }|j                  |      \  }}np|
dk(  r-t        |      |j                  z   }|j                  |      \  }}n>|
dk(  r.t        |      |j                  z   }|j                  |       \  }}nt        d       | |||||	ddd             E ||fS )	aR  Arrange split widgets.

    Split widgets are "docked" but also reduce the area available for regular widgets.

    Args:
        split_widgets: Widgets to arrange.
        size: Available area to arrange.
        viewport: Viewport (size of terminal).

    Returns:
        A tuple of widget placements, and the remaining view area.
    rW   r#   r"   rX   zinvalid value for split edge   TF)r   r   r+   r   r   r$   splitr[   r   r\   r]   r^   split_horizontalsplit_verticalr`   )rI   r3   rC   rc   rE   rg   view_regionrf   null_offsetsplit_widgetrr   rj   rk   rl   rm   ro   split_regionrn   s                     r   r)   r)      s    '(*J!((++KLK% 
##)) //(HTZZ0(4;;2G
	 AJ=5vH 67&--GM(3(D(Dm^(T%Ke^ 67&--GM(3(D(D](S%L+f_45DL(3(B(B<(P%L+g45DL(3(B(BL=(Q%K !?@@k<q$PU	
+
6 {""r   N)r   zIterable[Widget]returnzMapping[str, Sequence[Widget]])F)r   r   rB   Sequence[Widget]r3   r   rC   r   rD   boolry   r   )T)
rN   rz   r+   r   rC   r   r!   r{   ry   z%tuple[list[WidgetPlacement], Spacing])rI   rz   r3   r   rC   r   ry   z$tuple[list[WidgetPlacement], Region])"
__future__r   collectionsr   	fractionsr   operatorr   typingr   r   r	   r
   textual._partitionr   textual.geometryr   r   r   r   r   textual.layoutr   r   textual.widgetr   rY   r   r-   r(   r&   r2   r.   r)    r   r   <module>r      s   " #   = = ( M M =% 	 )*	)*
)$ VOVOVO VO 	VO
 VO VOt TXJ&"J&,2J&>BJ&LPJ&*J&Z1##1#+/1#;?1#)1#r   