B
    't\+                 @   s   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	 d dl
mZmZmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ ddgZG dd deZG dd deZdS )    )unicode_literals   )Border)get_app)	Condition)KeyBindings)HSplitWindowFloatContainerFloatConditionalContainer)FormattedTextControl)Shadow)MouseEventType)
get_cwidthMenuContainerMenuItemc               @   sH   e Zd ZdZdddZdd Zdd Zdd
dZedd Z	dd Z
dS )r   zs
    :param floats: List of extra Float objects to display.
    :param menu_items: List of `MenuItem` objects.
    Nc                sz  t |trtdd |D s t|d ks>tdd |D s>t| _| _dg _t }t fdd}t fdd}|j	d	|d
 fdd}|j	d|d
 fdd}|j	d|d
 fdd}|j	d|d
|j	d|d
dd }|j	d	|d
|j	d|d
|j	d|d
 fdd}|j	d|d
 fdd}|j	d|d
 fdd}|j	d|d
 fdd}|	d fdd}t
 j|ddd _td jdd  _ d}	 d}
 d!}t fd"d#}tt j|gt j jtt|	d$|d%d&t|	dddtt|
d$|t fd'd(@ d%d)t|
dddtt|d$|t fd*d(@ d%d)g|pjg  |d+ _d S ),Nc             s   s   | ]}t |tV  qd S )N)
isinstancer   ).0i r   ;lib/python3.7/site-packages/prompt_toolkit/widgets/menus.py	<genexpr>   s    z)MenuContainer.__init__.<locals>.<genexpr>c             s   s   | ]}t |tV  qd S )N)r   r   )r   fr   r   r   r      s    r   c                  s   t  jdkS )Nr   )lenselected_menur   )selfr   r   in_main_menu%   s    z,MenuContainer.__init__.<locals>.in_main_menuc                  s   t  jdkS )Nr   )r   r   r   )r   r   r   in_sub_menu)   s    z+MenuContainer.__init__.<locals>.in_sub_menuleft)filterc                s   t d jd d  jd< d S )Nr   r   )maxr   )event)r   r   r   _/   s    z!MenuContainer.__init__.<locals>._rightc                s(   t t jd  jd d  jd< d S )Nr   r   )minr   
menu_itemsr   )r"   )r   r   r   r#   3   s    Zdownc                s    j d d S )Nr   )r   append)r"   )r   r   r   r#   8   s    zc-czc-gc             S   s   | j j  dS )z Leave menu. N)applayout
focus_last)r"   r   r   r   r#   <   s    c                s   t  jdkr j  dS )z Go back to parent menu. r   N)r   r   pop)r"   )r   r   r   r#   D   s    c                s     t jd jr$ jd nft jdkr jd t jd k rtt jd  jd d g _ j jd  jr jd dS )z go into sub menu. r   r      N)	_get_menur   r   childrenr'   r&   r%   )r"   )r   r   r   r#   L   s    & Zupc                sf    tjd }jd   fddt|jD }|rJ|d jd< ntjdkrbj  dS )z= Select previous (enabled) menu item or return to main menu. r,   c                s"   g | ]\}}| k r|j s|qS r   )disabled)r   r   item)indexr   r   
<listcomp>`   s    z5MenuContainer.__init__.<locals>._.<locals>.<listcomp>N)r-   r   r   	enumerater.   r+   )r"   menuZprevious_indexes)r   )r2   r   r#   Y   s    
c                sL    tjd }jd   fddt|jD }|rH|d jd< dS )z" Select next (enabled) menu item. r,   r/   c                s"   g | ]\}}| kr|j s|qS r   )r0   )r   r   r1   )r2   r   r   r3   o   s    z5MenuContainer.__init__.<locals>._.<locals>.<listcomp>r   N)r-   r   r   r4   r.   )r"   r5   Znext_indexes)r   )r2   r   r#   i   s
    
Zenterc                s2     t jd }|jr.| jj  |  dS )z Click the selected menu item. r   N)r-   r   r   handlerr(   r)   r*   )r"   r1   )r   r   r   r#   u   s    TF)key_bindingsZ	focusableZshow_cursorr   zclass:menu-bar)Zheightcontentstyler,   c                  s   t  jj jkS )N)r   r)   Zcurrent_windowwindowr   )r   r   r   	has_focus   s    z)MenuContainer.__init__.<locals>.has_focus)body)r8   r    )xcursorycursorr8   c                  s   t  jdkS )Nr   )r   r   r   )r   r   r   <lambda>   s    z(MenuContainer.__init__.<locals>.<lambda>)Zattach_to_windowr=   r>   Zallow_cover_cursorr8   c                  s   t  jdkS )Nr,   )r   r   r   )r   r   r   r?      s    )r8   floatsr7   )r   listallAssertionErrorr<   r&   r   r   r   addr   _get_menu_fragmentsZcontrolr	   r:   _submenur
   r   r   r   r   	container)r   r<   r&   r@   r7   Zkbr   r   r#   ZsubmenuZsubmenu2Zsubmenu3r;   r   )r   r   __init__   sp    
	







zMenuContainer.__init__c          	   C   sd   | j | jd  }xNt| jdd  D ]8\}}||k r$y|j| }W q$ tk
rZ   tdS X q$W |S )Nr   r   debug)r&   r   r4   r.   
IndexErrorr   )r   levelr5   r   r2   r   r   r   r-      s    zMenuContainer._get_menuc                sZ   t  jj  sdg_ fdd}g }x&tjD ]\}}|||| q:W |S )Nr   c             3   sT    fdd}dd|fV   j d kr>r>dd|fV  d}nd}||j|fV  d S )	Nc                sR   | j tjkrNt }|jjr8j gkrF|j  n|j	j  g_d S )N)

event_typer   MOUSE_UPr   r)   r;   r:   r   r*   Zfocus)mouse_eventr(   )r   r   r   r   mouse_handler   s    zJMenuContainer._get_menu_fragments.<locals>.one_item.<locals>.mouse_handlerzclass:menu-bar r   z[SetMenuPosition] zclass:menu-bar.selected-item)r   text)r   r1   rO   r9   )focusedr   )r   r   one_item   s    z3MenuContainer._get_menu_fragments.<locals>.one_item)r   r)   r;   r:   r   r4   r&   extend)r   rT   resultr   r1   r   )rS   r   r   rE      s    z!MenuContainer._get_menu_fragmentsr   c                s    fdd}t t|ddS )Nc                 s  g } t jk r
  jr
| dtjf | dtj jd  f | dtj	f | d yjd  W n t
k
r   dY nX  fdd}x&t jD ]\}}| ||| qW | dtjf | dtj jd  f | dtjf | S )Nz
class:menu   )rQ   
r   r/   c             3   s    fdd} kr&dV  d}nd}dt jfV  jdkrd|d d	t jjd
  |fV  n |djjd
 |fV  jr|d|fV  n|d|fV   krdV  dt jfV  dV  d S )Nc                sJ   | j tjkrFt }jr,|j    njd d   g _d S )Nr   )rL   r   rM   r   r6   r)   r*   r   )rN   r(   )r   r1   rK   r   r   r   rO      s    

z[MenuContainer._submenu.<locals>.get_text_fragments.<locals>.one_item.<locals>.mouse_handler)z[SetCursorPosition]rQ   zclass:menu-bar.selected-itemrQ   z
class:menu-zclass:menu-borderz{}   z {}>rP   )z[SetMenuPosition]rQ   )rQ   rX   )r   ZVERTICALrR   format
HORIZONTALwidthljustr.   )r   r1   rO   r9   )rK   r5   selected_itemr   )r   r1   r   rT      s&    	

zDMenuContainer._submenu.<locals>.get_text_fragments.<locals>.one_item)r   r   r-   r.   r'   r   ZTOP_LEFTr]   r^   Z	TOP_RIGHTrJ   r4   rU   ZBOTTOM_LEFTZBOTTOM_RIGHT)rV   rT   r   r1   )rK   r   )r5   r`   r   get_text_fragments   s&    


$z2MenuContainer._submenu.<locals>.get_text_fragmentsz
class:menu)r9   )r	   r   )r   rK   ra   r   )rK   r   r   rF      s    :zMenuContainer._submenuc             C   s   | j jS )N)rG   r@   )r   r   r   r   r@     s    zMenuContainer.floatsc             C   s   | j S )N)rG   )r   r   r   r   __pt_container__"  s    zMenuContainer.__pt_container__)NNN)r   )__name__
__module____qualname____doc__rH   r-   rE   rF   propertyr@   rb   r   r   r   r   r      s   
 #
?c               @   s"   e Zd ZdddZedd ZdS )	r   rQ   NFc             C   s,   || _ || _|pg | _|| _|| _d| _d S )Nr   )rR   r6   r.   shortcutr0   r`   )r   rR   r6   r.   rh   r0   r   r   r   rH   '  s    
zMenuItem.__init__c             C   s"   | j rtdd | j D S dS d S )Nc             s   s   | ]}t |jV  qd S )N)r   rR   )r   cr   r   r   r   3  s    z!MenuItem.width.<locals>.<genexpr>r   )r.   r!   )r   r   r   r   r^   0  s    zMenuItem.width)rQ   NNNF)rc   rd   re   rH   rg   r^   r   r   r   r   r   &  s    
N)Z
__future__r   baser   Z"prompt_toolkit.application.currentr   Zprompt_toolkit.filtersr   Z'prompt_toolkit.key_binding.key_bindingsr   Z prompt_toolkit.layout.containersr   r	   r
   r   r   Zprompt_toolkit.layout.controlsr   Zprompt_toolkit.widgetsr   Zprompt_toolkit.mouse_eventsr   Zprompt_toolkit.utilsr   __all__objectr   r   r   r   r   r   <module>   s     