
    tni#                       d dl mZ d dl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rdd
lmZ  ed          Z G d deee                   Z G d dee         ee          ZdS )    )annotations)TYPE_CHECKINGGenericListOptionalTupleTypeVarN)ConsoleRenderableType)Text)AnyLiteral	TypedDict   )TextInputHandler)CursorOffsetElement)	BaseStyleReturnValuec                  $    e Zd ZU ded<   ded<   dS )Optionstrnamer   valueN)__name__
__module____qualname____annotations__     N/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/rich_toolkit/menu.pyr   r      s'         IIIr    r   c                      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	 	 d>ddddd? fdZd@d ZedAd!            ZdBdCd$ZedDd&            ZedEd'            ZedEd(            ZdFd*ZdFd+ZdGd.ZdHd0ZdId1ZdId2ZdJ fd3ZdEd4Z ed@d5            Z!d6 Z"d7 Z#edEd8            Z$dKd:Z%edLd<            Z&dEd=Z' xZ(S )MMenujkhlu   ●u   ○zFilter: u
     ↑ moreu
     ↓ moreFNr   )stylecursor_offsetmax_visiblelabelr   optionsList[Option[ReturnValue]]inlineboolallow_filteringr(   Optional[BaseStyle]r)   intr*   Optional[int]metadatar   c               T   t          j        |          | _        || _        || _        d| _        || _        || _        d| _        d | _	        d| _
        || _        |t          | j                  z   }t          j        | ||           t!                                                       d S )Nr   r   r(   r4   )r   from_markupr+   r.   r0   selectedr4   _options_padding_bottomvalid_scroll_offset_max_visiblelenfilter_promptr   __init__super)
selfr+   r,   r.   r0   r(   r)   r*   r4   	__class__s
            r!   r@   zMenu.__init__'   s     %e,,
.  
 $%+6%D,>(?(??UX>>>>r    returnOptional[str]c                   t          j                    }|dk    rdS | j        r'| j        g| j        gg\  }}| j        g| j        gg\  }}n| j        | j        }}| j	        | j
        }}| j        r||fn||f\  }}||v rdS ||v rdS | j        r|S d S )Nenternextprev)clickgetcharr0   LEFT_KEY	RIGHT_KEYDOWN_KEYUP_KEY	LEFT_KEYS
RIGHT_KEYS	DOWN_KEYSUP_KEYSr.   )rB   char	left_keys
right_keys	down_keysup_keys	next_keys	prev_keyss           r!   get_keyzMenu.get_keyI   s    }4<<7 	>&*m_t~6F$G!Iz#'=/DK=!AIww$(NDOzI!%wI (,{LZ##G8L 		9 9696 	Ktr    c                F      j         r fd j        D             S  j        S )Nc                z    g | ]7}j                                         |d                                          v 5|8S )r   )textlower).0optionrB   s     r!   
<listcomp>z Menu.options.<locals>.<listcomp>g   sJ       9??$$v(<(<(>(>>> >>>r    )r0   r9   rB   s   `r!   r,   zMenu.optionsd   sE     	   "m    }r    consoleOptional[Console]c                    | j         | j         S | j        rdS |t                      }d}| j        r|dz  }|j        |z
  }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      )r=   r.   r
   r0   heightmax)rB   re   reserved_linesavailable_heights       r!   get_max_visiblezMenu.get_max_visibleo   sm     ($$; 	4?iiG  	 aN">N:1&'''r    Tuple[int, int]c                    |                                  }t          | j                  }|||k    rd|fS | j        }t	          ||z   |          }||fS )z1Returns (start, end) indices for visible options.Nr   )rn   r>   r,   r<   min)rB   r*   total_optionsstartends        r!   visible_options_rangezMenu.visible_options_range   se     **,,DL))-;">">}%%#%+%}55s|r    c                    | j         dk    S )z9Check if there are more options above the visible window.r   r<   rd   s    r!   has_more_abovezMenu.has_more_above   s     "Q&&r    c                r    |                                  }|dS | j        |z   t          | j                  k     S )z9Check if there are more options below the visible window.NF)rn   r<   r>   r,   rB   r*   s     r!   has_more_belowzMenu.has_more_below   s=     **,,5"[03t|3D3DDDr    Nonec                    |                                  }|dS | j        | j        k     r| j        | _        dS | j        | j        |z   k    r| j        |z
  dz   | _        dS dS )z<Adjust scroll offset to ensure the selected item is visible.Nr   )rn   r8   r<   rz   s     r!   _ensure_selection_visiblezMenu._ensure_selection_visible   sz    **,,F =4..."&-D ]d1K???"&-+"="AD @?r    c                    d| _         dS )z/Reset scroll offset (used when filter changes).r   Nrw   rd   s    r!   _reset_scrollzMenu._reset_scroll   s    r    keyLiteral['next', 'prev']c                   |dk    r| xj         dz  c_         n|dk    r| xj         dz  c_         | j         dk     rt          | j                  dz
  | _         | j         t          | j                  k    rd| _         |                                  d S )NrI   r   rJ   r   )r8   r>   r,   r~   )rB   r   s     r!   _update_selectionzMenu._update_selection   s    &==MMQMMMF]]MMQMM=1--1DM=C----DM 	&&(((((r    r   c                
   t                      }|                    | j                   |                    d           |                    | j        | j                 d         | j                            d                     |S )N r   result)r(   )r   appendr+   r,   r8   re   	get_style)rB   result_texts     r!   render_resultzMenu.render_result   s~    ff4:&&&3L'/,((22 	 	
 	
 	

 r    c                T    | j         r| j        n| j        }| j        r	|d         g}||v S Nr   )r.   rR   rS   r0   rB   r   keyss      r!   is_next_keyzMenu.is_next_key   s6    "&+At4> 	G9Dd{r    c                T    | j         r| j        n| j        }| j        r	|d         g}||v S r   )r.   rQ   rT   r0   r   s      r!   is_prev_keyzMenu.is_prev_key   s6    !%>t~~$, 	G9Dd{r    c                2   d | j         }|                     |          r|                     d           nk|                     |          r|                     d           n@| j        r| j        | j                 d         t                                          |           r5t          fdt          | j                  D             d          }|| _        | j
        r5| j         |k    r,|                                  |                                  d S d S d S )NrI   rJ   r   c              3  :   K   | ]\  }}|d          k    |V  dS )r   Nr   )ra   indexrb   current_selections      r!   	<genexpr>z"Menu.handle_key.<locals>.<genexpr>   sC        %vf~)::: :::: r    r   )r_   r   r   r   r,   r8   rA   
handle_keyrI   	enumerater0   r   r~   )rB   r   previous_filter_textmatching_indexr   rC   s       @r!   r   zMenu.handle_key   sL   +/#yC   	$""6****c"" 	$""6****| H$(L$?$G!GGs### 
	+!   )24<)@)@  
  N +DM  	-DI1E$E$E   **,,,,,	- 	-$E$Er    c                V    | j         r!| j        rt          | j                  dk    rdS dS )Nr   FT)r0   r_   r>   r,   rd   s    r!   _handle_enterzMenu._handle_enter  s4     	DI 	#dl2C2Cq2H2H5tr    c                    | j         du rdS d S )NFzThis field is required)r;   rd   s    r!   validation_messagezMenu.validation_message  s    :++tr    c                .    |                                   d S N)on_validaterd   s    r!   on_blurzMenu.on_blur  s    r    c                @    t          | j                  dk    | _        d S r   )r>   r,   r;   rd   s    r!   r   zMenu.on_validate  s    &&*


r    c                    | j         S r   )r0   rd   s    r!   should_show_cursorzMenu.should_show_cursor  s    ##r    r   c                    ddl m}  || j        | j                  }| g|_        |                                 | j        | j                 d         S )Nr   )	Containerr6   r   )	containerr   r(   r4   elementsrunr,   r8   )rB   r   r   s      r!   askzMenu.ask  sW    ((((((IDJGGG	"V	|DM*733r    r   c                `    d}t          | j                  | j        z   }t          ||          S )N   )topleft)r>   r?   cursor_leftr   )rB   r   left_offsets      r!   r)   zMenu.cursor_offset$  s4    
 $,--0@@+6666r    c                b    |                                  }|dS t          | j                  |k    S )zBCheck if scrolling is needed (more options than can be displayed).NF)rn   r>   r,   rz   s     r!   _needs_scrollingzMenu._needs_scrolling/  s3    **,,54<  ;..r    )FF)r+   r   r,   r-   r.   r/   r0   r/   r(   r1   r)   r2   r*   r3   r4   r   )rD   rE   )rD   r-   r   )re   rf   rD   r3   )rD   ro   )rD   r/   )rD   r|   )r   r   rD   r|   )rD   r   )r   r   rD   r/   )r   r   rD   r|   )rD   r   )rD   r   ))r   r   r   r   rO   rS   rP   rT   rM   rQ   rN   rR   current_selection_charselection_charr?   MORE_ABOVE_INDICATORMORE_BELOW_INDICATORr@   r\   propertyr,   rn   ru   rx   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r)   r   __classcell__)rC   s   @r!   r#   r#      s       !*C0I&,G!*C0I",c2J"NM ('  %  &*%)               D   6    X( ( ( ( (: 
 
 
 X
 ' ' ' X' E E E XEB B B B       ) ) ) )
 
 
 
      - - - - - ->       X  + + + $ $ $ X$	4 	4 	4 	4 7 7 7 X7/ / / / / / / /r    r#   )
__future__r   typingr   r   r   r   r   r	   rK   rich.consoler
   r   	rich.textr   typing_extensionsr   r   r   _input_handlerr   elementr   r   styles.baser   r   r   r#   r   r    r!   <module>r      sd   " " " " " " I I I I I I I I I I I I I I I I  0 0 0 0 0 0 0 0       5 5 5 5 5 5 5 5 5 5 , , , , , , * * * * * * * * '&&&&&&gm$$    Y,   
[/ [/ [/ [/ [/7;!17 [/ [/ [/ [/ [/r    