o
    찓i]-                     @  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   E/home/ubuntu/.local/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+   rC   _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_keyl   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   5  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_messageD  s
   
zMenu.validation_messagec                 C  s   |    d S N)on_validater-   r   r   r    on_blurM  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   P  s   zMenu.on_validatec                 C  s   | j S r   )r*   r-   r   r   r    should_show_cursorV  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   d  rI   zMenu.ask.<locals>.<listcomp>r   )	containerr   r8   rC   elementsrunr)   r   r+   r<   rM   )r.   r   r   r   r-   r    askZ  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   h  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_scrollings  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    (