o
    Þ­j;-  ã                   @  sÒ   d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
 d dlZd dlmZmZ d dlmZ d dlmZmZmZ ddlmZ dd	lmZmZ erLdd
lmZ e	dƒZG dd„ deee ƒZG dd„ dee eeƒZdS )é    )Úannotations)ÚTYPE_CHECKINGÚGenericÚListÚOptionalÚSetÚTupleÚTypeVarÚUnionN)ÚConsoleÚRenderableType)ÚText)ÚAnyÚLiteralÚ	TypedDicté   )ÚTextInputHandler)ÚCursorOffsetÚElement)Ú	BaseStyleÚReturnValuec                   @  s   e Zd ZU ded< ded< dS )ÚOptionÚstrÚnamer   ÚvalueN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r   r   úN/var/www/html/CropPilot/venv/lib/python3.10/site-packages/rich_toolkit/menu.pyr      s   
 r   c                      sº  e Zd ZejdgZejdgZejdgZ	ej
dgZdZdZdZdZd	Zedhdd„ƒZedidd„ƒZedidd„ƒZdZdZ			djddddœdk‡ fd(d)„Zdhd*d+„Zedld,d-„ƒZdmdnd0d1„Zedod3d4„ƒZedpd5d6„ƒZedpd7d8„ƒZdqd:d;„Zdqd<d=„Zdrd@dA„Z dqdBdC„Z!dsdEdF„Z"dtdGdH„Z#edidIdJ„ƒZ$dudMdN„Z%dvdPdQ„Z&dwdRdS„Z'dwdTdU„Z(dx‡ fdVdW„Z)edhdXdY„ƒZ*dZd[„ Z+d\d]„ Z,edpd^d_„ƒZ-dydadb„Z.edzddde„ƒZ/dpdfdg„Z0‡  Z1S ){ÚMenuÚjÚkÚhÚlu   â—�u   â—‹u   â– u   â–¡zFilter: ÚreturnúOptional[str]c                 C  s(   | j r	| jr	| jsdS dt| jƒ› d�S )zEReturn a hint like '(3 selected)' when filtering hides checked items.Nú(z
 selected))ÚmultipleÚallow_filteringÚcheckedÚlen©Úselfr   r   r    Úselection_count_hint.   s   zMenu.selection_count_hintr   c                 C  ó   | j r| jS | jS )z%Prefix for the active/checked option.)r)   Úchecked_charÚcurrent_selection_charr-   r   r   r    Úactive_prefix5   ó   zMenu.active_prefixc                 C  r0   )z&Prefix for inactive/unchecked options.)r)   Úunchecked_charÚselection_charr-   r   r   r    Úinactive_prefix:   r4   zMenu.inactive_prefixu
     â†‘ moreu
     â†“ moreFNr   )ÚstyleÚcursor_offsetÚmax_visibleÚlabelÚoptionsúList[Option[ReturnValue]]ÚinlineÚboolr*   r)   r8   úOptional[BaseStyle]r9   Úintr:   úOptional[int]Úmetadatar   c          
        sš   |r|rt dƒ‚t |¡| _|| _|| _|| _d| _tƒ | _	|| _
dd„ t|ƒD ƒ| _d| _d | _d| _|| _|t| jƒ }tj| ||	d� tƒ  ¡  d S )Nz'multiple and inline cannot both be Truer   c                 S  s   i | ]	\}}t |ƒ|“qS r   )Úid)Ú.0ÚidxÚoptr   r   r    Ú
<dictcomp>\   ó    z!Menu.__init__.<locals>.<dictcomp>r   ©r8   rC   )Ú
ValueErrorr   Úfrom_markupr;   r>   r*   r)   ÚselectedÚsetr+   Ú_optionsÚ	enumerateÚ_option_indexÚ_padding_bottomÚvalidÚ_scroll_offsetÚ_max_visibler,   Úfilter_promptr   Ú__init__Úsuper)
r.   r;   r<   r>   r*   r)   r8   r9   r:   rC   ©Ú	__class__r   r    rW   C   s"   zMenu.__init__c                 C  s    t  ¡ }|dkr
dS | jr"| jg| jgg\}}| jg| jgg\}}n| j| j}}| j	| j
}}| jr7||fn||f\}}||v rCdS ||v rIdS | jrN|S d S )NúÚenterÚnextÚprev)ÚclickÚgetcharr*   ÚLEFT_KEYÚ	RIGHT_KEYÚDOWN_KEYÚUP_KEYÚ	LEFT_KEYSÚ
RIGHT_KEYSÚ	DOWN_KEYSÚUP_KEYSr>   )r.   ÚcharÚ	left_keysÚ
right_keysÚ	down_keysÚup_keysÚ	next_keysÚ	prev_keysr   r   r    Úget_keyj   s"   ÿzMenu.get_keyc                   s    ˆ j r‡ fdd„ˆ jD ƒS ˆ jS )Nc                   s&   g | ]}ˆ j  ¡ |d   ¡ v r|‘qS )r   )ÚtextÚlower)rE   Úoptionr-   r   r    Ú
<listcomp>ˆ   s
    þz Menu.options.<locals>.<listcomp>)r*   rO   r-   r   r-   r    r<   …   s
   
þzMenu.optionsÚconsoleúOptional[Console]c                 C  sN   | j dur| j S | jrdS |du rtƒ }d}| jr|d7 }|j| }td|ƒS )a  Calculate the maximum number of visible options based on terminal height.

        Args:
            console: Console to get terminal height from. If None, uses default.

        Returns:
            Maximum number of visible options, or None if no limit needed.
        Né   r   é   )rU   r>   r   r*   ÚheightÚmax)r.   ru   Úreserved_linesÚavailable_heightr   r   r    Úget_max_visible�   s   
	

zMenu.get_max_visibleúTuple[int, int]c                 C  sF   |   ¡ }t| jƒ}|du s||krd|fS | j}t|| |ƒ}||fS )z1Returns (start, end) indices for visible options.Nr   )r}   r,   r<   rT   Úmin)r.   r:   Útotal_optionsÚstartÚendr   r   r    Úvisible_options_range­   s   
zMenu.visible_options_rangec                 C  s
   | j dkS )z9Check if there are more options above the visible window.r   ©rT   r-   r   r   r    Úhas_more_aboveº   s   
zMenu.has_more_abovec                 C  s(   |   ¡ }|du r
dS | j| t| jƒk S )z9Check if there are more options below the visible window.NF)r}   rT   r,   r<   ©r.   r:   r   r   r    Úhas_more_below¿   s   zMenu.has_more_belowÚNonec                 C  sT   |   ¡ }|du r
dS | j| jk r| j| _dS | j| j| kr(| j| d | _dS dS )z<Adjust scroll offset to ensure the selected item is visible.Nr   )r}   rM   rT   r†   r   r   r    Ú_ensure_selection_visibleÇ   s   ÿzMenu._ensure_selection_visiblec                 C  s
   d| _ dS )z/Reset scroll offset (used when filter changes).r   Nr„   r-   r   r   r    Ú_reset_scrollÕ   s   
zMenu._reset_scrollrs   úOption[ReturnValue]c                 C  s   | j t|ƒ S )z@Return the index of an option in _options using identity lookup.)rQ   rD   ©r.   rs   r   r   r    Ú_get_option_indexÙ   s   zMenu._get_option_indexc                 C  s0   | j sdS |  | j | j ¡}|  j|hN  _dS )z4Toggle the checked state of the current cursor item.N)r<   r�   rM   r+   )r.   Úoption_indexr   r   r    Ú_toggle_currentÝ   s   zMenu._toggle_currentÚfiltered_indexc                 C  s   |   | j| ¡| jv S )z+Check if a filtered-list option is checked.)r�   r<   r+   )r.   r�   r   r   r    Úis_option_checkedä   s   zMenu.is_option_checkedc                 C  s   |   |¡| jv S )z8Check if an option is checked using its object identity.)r�   r+   rŒ   r   r   r    Úis_option_checked_by_refè   s   zMenu.is_option_checked_by_refc                   s4   ˆ j rd ‡ fdd„tˆ jƒD ƒ¡S ˆ jˆ j d S )zDReturn the display name for the result (used when the menu is done).z, c                 3  s   � | ]
}ˆ j | d  V  qdS ©r   N©rO   ©rE   Úir-   r   r    Ú	<genexpr>ð   s   € z+Menu.result_display_name.<locals>.<genexpr>r   )r)   ÚjoinÚsortedr+   r<   rM   r-   r   r-   r    Úresult_display_nameì   s   zMenu.result_display_nameÚkeyúLiteral['next', 'prev']c                 C  sj   |dkr|  j d7  _ n|dkr|  j d8  _ | j dk r$t| jƒd | _ | j t| jƒkr/d| _ |  ¡  d S )Nr]   r   r^   r   )rM   r,   r<   r‰   )r.   r›   r   r   r    Ú_update_selectionó   s   
zMenu._update_selectionr   c                 C  s8   t ƒ }| | j¡ | d¡ |j| j| j d¡d� |S )Nú Úresult)r8   )r   Úappendr;   rš   ru   Ú	get_style)r.   Úresult_textr   r   r    Úrender_result  s   

þzMenu.render_resultc                 C  ó*   | j r| jn| j}| jr|d g}||v S ©Nr   )r>   rf   rg   r*   ©r.   r›   Úkeysr   r   r    Úis_next_key  ó   
zMenu.is_next_keyc                 C  r¤   r¥   )r>   re   rh   r*   r¦   r   r   r    Úis_prev_key  r©   zMenu.is_prev_keyc                   sÆ   d ‰ | j }| jr|dkr|  ¡  d S |  |¡r|  d¡ n|  |¡r(|  d¡ n| jr3| j| j d ‰ tƒ  	|¡ ˆ rMt
‡ fdd„t| jƒD ƒdƒ}|| _| jr_| j |kra|  ¡  |  ¡  d S d S d S )Nrž   r]   r^   r   c                 3  s$   � | ]\}}|d  ˆ kr|V  qdS r“   r   )rE   Úindexrs   ©Úcurrent_selectionr   r    r—   3  s   € þýz"Menu.handle_key.<locals>.<genexpr>r   )rq   r)   r�   r¨   r�   rª   r<   rM   rX   Ú
handle_keyr]   rP   r*   rŠ   r‰   )r.   r›   Úprevious_filter_textÚmatching_indexrY   r¬   r    r®     s0   


þú	þzMenu.handle_keyc                 C  s   | j du r| jr
dS dS d S )NFz!Please select at least one optionzThis field is required)rS   r)   r-   r   r   r    Úvalidation_messageB  s
   
zMenu.validation_messagec                 C  s   |   ¡  d S ©N)Úon_validater-   r   r   r    Úon_blurK  s   zMenu.on_blurc                 C  s.   | j rt| jƒdk| _d S t| jƒdk| _d S r¥   )r)   r,   r+   rS   r<   r-   r   r   r    r³   N  s   zMenu.on_validatec                 C  s   | j S r²   )r*   r-   r   r   r    Úshould_show_cursorT  s   zMenu.should_show_cursorú%Union[ReturnValue, List[ReturnValue]]c                   sZ   ddl m} |ˆ jˆ jd�}ˆ g|_| ¡  ˆ jr%‡ fdd„tˆ jƒD ƒS ˆ j	ˆ j
 d S )Nr   )Ú	ContainerrJ   c                   s   g | ]	}ˆ j | d  ‘qS )r   r”   r•   r-   r   r    rt   b  rI   zMenu.ask.<locals>.<listcomp>r   )Ú	containerr·   r8   rC   ÚelementsÚrunr)   r™   r+   r<   rM   )r.   r·   r¸   r   r-   r    ÚaskX  s   zMenu.askr   c                 C  s    d}t | jƒ| j }t||d�S )Né   )ÚtopÚleft)r,   rV   Úcursor_leftr   )r.   r½   Úleft_offsetr   r   r    r9   f  s   zMenu.cursor_offsetc                 C  s"   |   ¡ }|du r
dS t| jƒ|kS )zBCheck if scrolling is needed (more options than can be displayed).NF)r}   r,   r<   r†   r   r   r    Ú_needs_scrollingq  s   zMenu._needs_scrolling)r&   r'   )r&   r   )FFF)r;   r   r<   r=   r>   r?   r*   r?   r)   r?   r8   r@   r9   rA   r:   rB   rC   r   )r&   r=   r²   )ru   rv   r&   rB   )r&   r~   )r&   r?   )r&   rˆ   )rs   r‹   r&   rA   )r�   rA   r&   r?   )rs   r‹   r&   r?   )r›   rœ   r&   rˆ   )r&   r   )r›   r   r&   r?   )r›   r   r&   rˆ   )r&   r¶   )r&   r   )2r   r   r   r   rc   rg   rd   rh   ra   re   rb   rf   r2   r6   r1   r5   rV   Úpropertyr/   r3   r7   ÚMORE_ABOVE_INDICATORÚMORE_BELOW_INDICATORrW   rp   r<   r}   rƒ   r…   r‡   r‰   rŠ   r�   r�   r‘   r’   rš   r�   r£   r¨   rª   r®   r±   r´   r³   rµ   r»   r9   rÁ   Ú__classcell__r   r   rY   r    r!   "   sv    



úö
'










#

r!   )Ú
__future__r   Útypingr   r   r   r   r   r   r	   r
   r_   Úrich.consoler   r   Ú	rich.textr   Útyping_extensionsr   r   r   Ú_input_handlerr   Úelementr   r   Ústyles.baser   r   r   r!   r   r   r   r    Ú<module>   s    (