o
    ¯bk  ã                   @   s¸  d Z ddlZddlmZmZ ddlmZ G dd„ deƒZ	G dd„ dƒZ
G d	d
„ d
ƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zdd„ Zdd „ ZG d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&eƒZG d'd(„ d(eƒZG d)d*„ d*eƒZG d+d,„ d,eƒZG d-d.„ d.eƒZG d/d0„ d0eƒZG d1d2„ d2eƒZG d3d4„ d4eƒZ G d5d6„ d6eƒZ!d7d8„ Z"G d9d:„ d:eƒZ#dS );z<
Simple insults-based widget library

@author: Jp Calderone
é    N)ÚhelperÚinsults)Útextc                   @   ó   e Zd ZdZdS )Ú
YieldFocusz,
    Input focus manipulation exception
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú>/usr/lib/python3/dist-packages/twisted/conch/insults/window.pyr      ó    r   c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚBoundedTerminalWrapperc                 C   sJ   || _ || _|| _|| _|| _|j| _|j| _|j| _|j| _|j	| _	d S ©N)
ÚwidthÚheightÚxoffÚyoffÚterminalÚcursorForwardÚselectCharacterSetÚselectGraphicRenditionÚ
saveCursorÚrestoreCursor)Úselfr   r   r   r   r   r   r   r   Ú__init__   s   zBoundedTerminalWrapper.__init__c                 C   s*   | j  | jt| j|ƒ | jt| j|ƒ ¡S r   )r   ÚcursorPositionr   Úminr   r   r   )r   ÚxÚyr   r   r   r   "   s    ÿz%BoundedTerminalWrapper.cursorPositionc                 C   s   | j  | j| j¡S r   )r   r   r   r   ©r   r   r   r   Ú
cursorHome'   s   z!BoundedTerminalWrapper.cursorHomec                 C   s   | j  |¡S r   )r   Úwrite)r   Údatar   r   r   r#   *   ó   zBoundedTerminalWrapper.writeN)r   r   r	   r   r   r"   r#   r   r   r   r   r      s
    r   c                   @   sˆ   e Zd ZdZdZdZd ZZdd„ Zdd„ Z	dd„ Z
d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚWidgetFNc                 C   s4   | j sd| _ | jd ur| jj s| j ¡  d S d S d S ©NT)ÚdirtyÚparentÚrepaintr!   r   r   r   r*   4   s
   ÿzWidget.repaintc                 C   s
   d| _ d S r'   )r(   r!   r   r   r   Úfilthy:   ó   
zWidget.filthyc                 C   s   |   ¡  |  |||¡ d S r   )r+   Údraw©r   r   r   r   r   r   r   Úredraw=   s   zWidget.redrawc                 C   sB   || j ks|| jks| jr|| _ || _d| _|  |||¡ d S d S ©NF)r   r   r(   Úrenderr.   r   r   r   r-   A   s   üzWidget.drawc                 C   ó   d S r   r   r.   r   r   r   r1   H   ó   zWidget.renderc                 C   r2   r   r   r!   r   r   r   ÚsizeHintK   r3   zWidget.sizeHintc                 C   sT   |dkr|   |¡ d S |dkr|  ¡  d S |tjv r"|  ||¡ d S |  ||¡ d S )Nó   	ó   )ÚtabReceivedÚbackspaceReceivedr   ÚFUNCTION_KEYSÚfunctionKeyReceivedÚcharacterReceived©r   ÚkeyIDÚmodifierr   r   r   ÚkeystrokeReceivedN   s   
zWidget.keystrokeReceivedc                 C   ó   t ƒ ‚r   ©r   ©r   r>   r   r   r   r7   X   ó   zWidget.tabReceivedc                 C   s   d| _ |  ¡  dS )z„
        Called when focus is being given to this widget.

        May raise YieldFocus is this widget does not want focus.
        TN©Úfocusedr*   r!   r   r   r   ÚfocusReceived\   s   zWidget.focusReceivedc                 C   s   d| _ |  ¡  d S r0   rD   r!   r   r   r   Ú	focusLoste   ó   zWidget.focusLostc                 C   r2   r   r   r!   r   r   r   r8   i   r3   zWidget.backspaceReceivedc                 C   s@   |}t |tƒs| d¡}t| d| d ƒ}|d ur||ƒ d S d S )Núutf-8Úfunc_)Ú
isinstanceÚstrÚdecodeÚgetattr)r   r=   r>   ÚnameÚfuncr   r   r   r:   l   s   

ÿzWidget.functionKeyReceivedc                 C   r2   r   r   r<   r   r   r   r;   t   r3   zWidget.characterReceived)r   r   r	   rE   r)   r(   r   r   r*   r+   r/   r-   r1   r4   r?   r7   rF   rG   r8   r:   r;   r   r   r   r   r&   .   s$    
	r&   c                   @   sX   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚContainerWidgetzZ
    @ivar focusedChild: The contained widget which currently has
    focus, or None.
    NFc                 C   s   t  | ¡ g | _d S r   )r&   r   Úchildrenr!   r   r   r   r   �   ó   

zContainerWidget.__init__c                 C   sb   |j d u sJ ‚| |_ | j |¡ | jd u r+| jr+z| ¡  W n	 ty'   Y nw || _|  ¡  d S r   )r)   rR   ÚappendÚfocusedChildrE   rF   r   r*   ©r   Úchildr   r   r   ÚaddChild…   s   ÿzContainerWidget.addChildc                 C   s,   |j | u sJ ‚d |_ | j |¡ |  ¡  d S r   )r)   rR   Úremover*   rV   r   r   r   ÚremChild’   s   zContainerWidget.remChildc                 C   s"   | j D ]}| ¡  qt | ¡ d S r   )rR   r+   r&   )r   Úchr   r   r   r+   ˜   s   

zContainerWidget.filthyc                 C   s   | j D ]	}| |||¡ qd S r   )rR   r-   )r   r   r   r   r[   r   r   r   r1   �   s   
ÿzContainerWidget.renderc                 C   s¶   |   ¡  | jd ur)| j ¡  | j}d | _z
| j |¡d }W n ty(   tƒ ‚w d}|t| jƒk rXz	| j|  ¡  W n tyH   |d7 }Y n	w | j| | _d S |t| jƒk s2tƒ ‚)Né   r   )	r*   rU   rG   rR   ÚindexÚ
ValueErrorr   ÚlenrF   )r   rU   ÚcurFocusr   r   r   ÚchangeFocus¡   s*   

ÿÿù	zContainerWidget.changeFocusc                 C   s   |   ¡  d| _d S r'   )ra   rE   r!   r   r   r   rF   ¹   s   
zContainerWidget.focusReceivedc                 C   sV   | j d ur"z
| j  ||¡ W d S  ty!   |  ¡  |  ¡  Y d S w t | ||¡ d S r   )rU   r?   r   ra   r*   r&   r<   r   r   r   r?   ½   s   
þz!ContainerWidget.keystrokeReceived)r   r   r	   r
   rU   rE   r   rX   rZ   r+   r1   ra   rF   r?   r   r   r   r   rQ   x   s    rQ   c                   @   s@   e Zd ZdZdZdd„ ZdZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )Ú	TopWindowaM  
    A top-level container object which provides focus wrap-around and paint
    scheduling.

    @ivar painter: A no-argument callable which will be invoked when this
    widget needs to be redrawn.

    @ivar scheduler: A one-argument callable which will be invoked with a
    no-argument callable and should arrange for it to invoked at some point in
    the near future.  The no-argument callable will cause this widget and all
    its children to be redrawn.  It is typically beneficial for the no-argument
    callable to be invoked at the end of handling for whatever event is
    currently active; for example, it might make sense to call it at the end of
    L{twisted.conch.insults.insults.ITerminalProtocol.keystrokeReceived}.
    Note, however, that since calls to this may also be made in response to no
    apparent event, arrangements should be made for the function to be called
    even if an event handler such as C{keystrokeReceived} is not on the call
    stack (eg, using
    L{reactor.callLater<twisted.internet.interfaces.IReactorTime.callLater>}
    with a short timeout).
    Tc                 C   ó   t  | ¡ || _|| _d S r   )rQ   r   ÚpainterÚ	scheduler)r   rd   re   r   r   r   r   á   ó   

zTopWindow.__init__Nc                 C   s,   | j d u rtƒ | _ |  | j¡ t | ¡ d S r   )Ú
_paintCallÚobjectre   Ú_paintrQ   r*   r!   r   r   r   r*   è   s   
zTopWindow.repaintc                 C   s   d | _ |  ¡  d S r   )rg   rd   r!   r   r   r   ri   î   rH   zTopWindow._paintc                 C   sJ   zt  | ¡ W d S  ty$   z	t  | ¡ W Y d S  ty#   Y Y d S w w r   )rQ   ra   r   r!   r   r   r   ra   ò   s   ÿýzTopWindow.changeFocusc                 C   s2   z
t  | ||¡ W d S  ty   |  ¡  Y d S w r   )rQ   r?   r   ra   r<   r   r   r   r?   û   s
   ÿzTopWindow.keystrokeReceived)r   r   r	   r
   rE   r   rg   r*   ri   ra   r?   r   r   r   r   rb   È   s    	rb   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚAbsoluteBoxc                 C   sF   t t| jƒƒD ]}| j| d |u r|||f| j|<  d S qtd|ƒ‚)Nr   zNo such child)Úranger_   rR   r^   )r   rW   r   r    Únr   r   r   Ú	moveChild  s   þ
zAbsoluteBox.moveChildc                 C   s<   | j D ]\}}}t||| || ||ƒ}| |||¡ qd S r   )rR   r   r-   )r   r   r   r   r[   r   r    Úwrapr   r   r   r1     s   þzAbsoluteBox.renderN)r   r   r	   rm   r1   r   r   r   r   rj     s    rj   c                   @   s6   e Zd Zedƒ\ZZZefdd„Zdd„ Zdd„ Z	dS )	Ú_Boxé   c                 C   ó   t  | ¡ || _d S r   )rQ   r   Úgravity)r   rr   r   r   r   r     rS   z_Box.__init__c                 C   sØ   d}d}| j D ]`}| ¡ }|d u rd}| jdkr@|d d u r!d }n
|d ur+||d 7 }|d d u r4d }q|d ur?t||d ƒ}q|d d u rId }n|d urTt||d ƒ}|d d u r]d }q|d urg||d 7 }q||fS )Nr   ©NNr\   )rR   r4   ÚvariableDimensionÚmax)r   r   r   r[   Úhintr   r   r   r4     s4   

€€z_Box.sizeHintc                 C   s  | j sd S d}g }| j D ]}| ¡ }|d u rd}|| j d u r#|d7 }| || j ¡ q||f| j }tdd„ |D ƒƒ}	|rFt||	 | ƒ}
d }}t|| j ƒD ]6\}}|d u rZ|
}||}}| jdkrg|}n|}t|||||ƒ}| |||¡ | jdkr‚||7 }qP||7 }qPd S )Nr   rs   r\   c                 s   s   � | ]	}|d ur|V  qd S r   r   )Ú.0Úwr   r   r   Ú	<genexpr>D  s   € z_Box.render.<locals>.<genexpr>)	rR   r4   rt   rT   ÚsumÚintÚzipr   r-   )r   r   r   r   ÚgreedyÚwantsr[   rv   ÚlengthÚ	totalWantÚleftForGreedyÚwidthOffsetÚheightOffsetÚwantÚsubWidthÚ	subHeightrn   r   r   r   r1   5  sF   


û


ëz_Box.renderN)
r   r   r	   rk   ÚTOPÚCENTERÚBOTTOMr   r4   r1   r   r   r   r   ro     s
    ro   c                   @   r   )ÚHBoxr   N©r   r   r	   rt   r   r   r   r   rŠ   b  r   rŠ   c                   @   r   )ÚVBoxr\   Nr‹   r   r   r   r   rŒ   f  r   rŒ   c                   @   ó   e Zd Zdd„ ZdS )ÚPackerc           	      C   s€   | j sd S tt| j ƒd d ƒ}dd„ t|ƒD ƒ}t| j ƒD ]\}}||t|ƒ   |¡ qtƒ }t|j|ƒ | |||¡ d S )Ng      à?c                 S   s   g | ]}t ƒ ‘qS r   )rŒ   )rw   rl   r   r   r   Ú
<listcomp>p  s    z!Packer.render.<locals>.<listcomp>)	rR   r{   r_   rk   Ú	enumeraterX   rŠ   Úmapr1   )	r   r   r   r   ÚrootÚboxesrl   r[   Úhr   r   r   r1   k  s   zPacker.renderN)r   r   r	   r1   r   r   r   r   rŽ   j  ó    rŽ   c                   @   sD   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dS )ÚCanvasFNc                 C   s   t  | ¡ |  dd¡ d S ©Nr\   )r&   r   Úresizer!   r   r   r   r   }  s   
zCanvas.__init__c                 C   s¤   t   dd| | ¡}| jd ur1tt|| jƒƒD ]}tt|| jƒƒD ]}| ||f ||| | < q!q|| _|| _|| _| j|krD|d | _| j|krP|d | _d S d S )NÚBó    r\   )ÚarrayÚcontentsrk   r   Ú_widthÚ_heightr   r    )r   r   r   rœ   r   r    r   r   r   r˜   �  s   
ÿ


ÿzCanvas.resizec                 C   s   |\}}| j | j| |  S r   ©rœ   r�   )r   r]   r   r    r   r   r   Ú__getitem__�  s   zCanvas.__getitem__c                 C   s    |\}}|| j | j| | < d S r   rŸ   )r   r]   Úvaluer   r    r   r   r   Ú__setitem__“  s   zCanvas.__setitem__c                 C   s   t   ddt| jƒ ¡| _d S )Nr™   rš   )r›   r_   rœ   r!   r   r   r   Úclear—  s   zCanvas.clearc                 C   s„   |r|sd S || j ks|| jkr|  ||¡ t|ƒD ]%}| d|¡ | j| j | | j | | j  …  ¡ }|d |… }| |¡ qd S ©Nr   )r�   rž   r˜   rk   r   rœ   Útobytesr#   )r   r   r   r   Úir   r   r   r   r1   š  s   ÿþúzCanvas.render)r   r   r	   rE   rœ   r   r˜   r    r¢   r£   r1   r   r   r   r   r–   x  s    r–   c                 C   sB   |   tjtj¡ |  ||¡ |  d||  ¡ |   tjtj¡ d S )Nó   q)r   r   Ú
CS_DRAWINGÚG0r   r#   ÚCS_US)r   r    ÚleftÚrightr   r   r   ÚhorizontalLine©  s   r­   c                 C   sJ   |   tjtj¡ t||ƒD ]}|  ||¡ |  d¡ q|   tjtj¡ d S )Nó   x)r   r   r¨   r©   rk   r   r#   rª   )r   r   ÚtopÚbottomrl   r   r   r   ÚverticalLine°  s
   r±   c                 C   sè   |\}}|\}}|   tjtj¡ |  ||¡ |  d¡ |  d|d  ¡ |  d¡ t|d ƒD ]}|  ||| d ¡ |  d¡ |  |d ¡ |  d¡ q/|  d|| d ¡ |  d¡ |  d|d  ¡ |  d	¡ |   tjtj¡ d
S )zð
    Draw a rectangle

    @type position: L{tuple}
    @param position: A tuple of the (top, left) coordinates of the rectangle.
    @type dimension: L{tuple}
    @param dimension: A tuple of the (width, height) size of the rectangle.
    ó   lr§   é   ó   kr\   r®   r   ó   mó   jN)	r   r   r¨   r©   r   r#   rk   r   rª   )r   ÚpositionÚ	dimensionr¯   r«   r   r   rl   r   r   r   Ú	rectangle¸  s"   	




r¹   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚBorderc                 C   s   t  | ¡ || _| | j_d S r   )r&   r   Ú	containeer)   ©r   r»   r   r   r   r   ×  s   
zBorder.__init__c                 C   ó
   | j  ¡ S r   )r»   rF   r!   r   r   r   rF   Ü  r,   zBorder.focusReceivedc                 C   r½   r   )r»   rG   r!   r   r   r   rG   ß  r,   zBorder.focusLostc                 C   s   | j  ||¡S r   )r»   r?   r<   r   r   r   r?   â  ó   zBorder.keystrokeReceivedc                 C   s`   | j  ¡ }|d u rd}|d d u rd }n|d d }|d d u r&d }||fS |d d }||fS )Nrs   r   r³   r\   )r»   r4   )r   rv   r   r    r   r   r   r4   å  s   
ÿzBorder.sizeHintc                 C   ó   | j  ¡  t | ¡ d S r   ©r»   r+   r&   r!   r   r   r   r+   ó  ó   
zBorder.filthyc                 C   s`   | j jr	| d¡ t|d||fƒ | d¡ t||d |d ddƒ}| j  |d |d |¡ d S )Nó   [31m)r   r   ó   [0mr³   r\   )r»   rE   r#   r¹   r   r-   )r   r   r   r   rn   r   r   r   r1   ÷  s   

zBorder.renderN)
r   r   r	   r   rF   rG   r?   r4   r+   r1   r   r   r   r   rº   Ö  s    rº   c                   @   r   )
ÚButtonc                 C   rc   r   )r&   r   ÚlabelÚonPress)r   rÅ   rÆ   r   r   r   r     rf   zButton.__init__c                 C   s   t | jƒdfS r—   )r_   rÅ   r!   r   r   r   r4     r¾   zButton.sizeHintc                 C   s   |dkr
|   ¡  d S d S ©Nó   )rÆ   r<   r   r   r   r;   	  s   ÿzButton.characterReceivedc                 C   s:   |  dd¡ | jr| d| j d ¡ d S | | j¡ d S )Nr   s   [1mrÃ   )r   rE   r#   rÅ   r.   r   r   r   r1     s   zButton.renderN)r   r   r	   r   r4   r;   r1   r   r   r   r   rÄ      s
    rÄ   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú	TextInputc                 C   s&   t  | ¡ || _|| _d| _d| _d S )Nó    r   )r&   r   ÚonSubmitÚmaxwidthÚbufferÚcursor)r   rÌ   rË   r   r   r   r     s
   

zTextInput.__init__c                 C   s(   |d | j … | _t| jƒ| _|  ¡  d S r   )rÌ   rÍ   r_   rÎ   r*   ©r   r   r   r   r   ÚsetText  s   zTextInput.setTextc                 C   s(   | j dkr|  j d8  _ |  ¡  d S d S ©Nr   r\   )rÎ   r*   rB   r   r   r   Úfunc_LEFT_ARROW"  s   
þzTextInput.func_LEFT_ARROWc                 C   s.   | j t| jƒk r|  j d7  _ |  ¡  d S d S r—   )rÎ   r_   rÍ   r*   rB   r   r   r   Úfunc_RIGHT_ARROW'  s   þzTextInput.func_RIGHT_ARROWc                 C   sN   | j dkr%| jd | j d … | j| j d …  | _|  j d8  _ |  ¡  d S d S rÑ   )rÎ   rÍ   r*   r!   r   r   r   r8   ,  s
   
&ýzTextInput.backspaceReceivedc                 C   sl   |dkr|   | j¡ d S t| jƒ| jk r4| jd | j… | | j| jd …  | _|  jd7  _|  ¡  d S d S )NrÈ   r\   )rË   rÍ   r_   rÌ   rÎ   r*   r<   r   r   r   r;   2  s   "ÿûzTextInput.characterReceivedc                 C   s   | j d dfS r—   )rÌ   r!   r   r   r   r4   =  r¾   zTextInput.sizeHintc                 C   s¨   |   ¡ }| dd¡ | jrB| |d | j… ¡ t||| j| jd … p$dƒ | || jd d … ¡ | d| jt|ƒ d  ¡ d S | jt|ƒ }| |d|  ¡ d S )Nr   r\   rš   ó   _)Ú_renderTextr   rE   r#   rÎ   rÌ   r_   )r   r   r   r   ÚcurrentTextÚmorer   r   r   r1   @  s    zTextInput.renderc                 C   ó   | j S r   )rÍ   r!   r   r   r   rÕ   L  ó   zTextInput._renderTextN)r   r   r	   r   rÐ   rÒ   rÓ   r8   r;   r4   r1   rÕ   r   r   r   r   rÉ     s    rÉ   c                   @   r�   )ÚPasswordInputc                 C   s   dt | jƒ S )NÚ*)r_   rÍ   r!   r   r   r   rÕ   Q  r¾   zPasswordInput._renderTextN)r   r   r	   rÕ   r   r   r   r   rÚ   P  r•   rÚ   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú
TextOutputrÊ   Nc                 C   rq   r   )r&   r   Úsize)r   rÝ   r   r   r   r   X  rS   zTextOutput.__init__c                 C   rØ   r   )rÝ   r!   r   r   r   r4   \  rÙ   zTextOutput.sizeHintc                 C   s8   |  dd¡ | jd |… }| |d|t|ƒ   ¡ d S ©Nr   rš   )r   r   r#   r_   )r   r   r   r   r   r   r   r   r1   _  s   zTextOutput.renderc                 C   s   || _ |  ¡  d S r   )r   r*   rÏ   r   r   r   rÐ   d  rH   zTextOutput.setTextc                 C   r@   r   rA   r!   r   r   r   rF   h  rÙ   zTextOutput.focusReceivedr   )	r   r   r	   r   r   r4   r1   rÐ   rF   r   r   r   r   rÜ   U  s    
rÜ   c                   @   s.   e Zd Zedƒ\ZZdefdd„Zdd„ ZdS )ÚTextOutputArear³   Nc                 C   s   t  | |¡ || _d S r   )rÜ   r   Ú	longLines)r   rÝ   rà   r   r   r   r   o  s   
zTextOutputArea.__init__c                 C   sä   d}| j  ¡ }g }|rX| j| jkrC| d¡}t|tƒs | d¡}g }t 	||¡D ]}	t|	t
ƒs4|	 d¡}	| |	¡ q(| |p@dg¡ n| | d¡d |… ¡ t|ƒ|krVn|st|d |… ƒD ]\}}
| d|¡ | |
¡ q`d S )Nr   rI   rÊ   )r   Ú
splitlinesrà   ÚWRAPÚpoprK   rL   rM   ÚtptextÚ
greedyWrapÚbytesÚencoderT   Úextendr_   r�   r   r#   )r   r   r   r   rl   Ú
inputLinesÚoutputLinesÚlineÚwrappedLinesÚwrappedLineÚLr   r   r   r1   s  s,   





òþzTextOutputArea.render)r   r   r	   rk   râ   ÚTRUNCATEr   r1   r   r   r   r   rß   l  s    rß   c                   @   sh   e Zd ZdZdZedd„ ƒZejdd„ ƒZedd„ ƒZejdd„ ƒZdZ	d	Z
d
d„ Zdd„ Zdd„ ZdS )ÚViewportr   c                 C   rØ   r   )Ú_xOffsetr!   r   r   r   ÚxOffset�  rC   zViewport.xOffsetc                 C   ó    | j |kr|| _ |  ¡  d S d S r   )rñ   r*   ©r   r¡   r   r   r   rò   “  ó   
þc                 C   rØ   r   )Ú_yOffsetr!   r   r   r   ÚyOffset™  rC   zViewport.yOffsetc                 C   ró   r   )rö   r*   rô   r   r   r   r÷   �  rõ   é    é   c                 C   sD   t  | ¡ || _| | j_t ¡ | _| j| j_| j	| j_
| j ¡  d S r   )r&   r   r»   r)   r   ÚTerminalBufferÚ_bufr�   r   rž   r   ÚconnectionMader¼   r   r   r   r   ¦  s   



zViewport.__init__c                 C   r¿   r   rÀ   r!   r   r   r   r+   °  rÁ   zViewport.filthyc           	      C   s®   | j  | j| j| j¡ t| jj| j| j| … ƒD ];\}}| d|¡ d}t|| j	| j	| … ƒD ]\}\}}|| jj
u r?d}| |¡ q1||k rT| d|| d  ¡ qd S )Nr   rš   r\   )r»   r-   r�   rž   rû   r�   Úlinesrö   r   rñ   Úvoidr#   )	r   r   r   r   r    rë   rl   r[   Úattrr   r   r   r1   ´  s   ÿ$€özViewport.renderN)r   r   r	   rñ   rö   Úpropertyrò   Úsetterr÷   r�   rž   r   r+   r1   r   r   r   r   rð   ‹  s     




rð   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú
_Scrollbarc                 C   s   t  | ¡ || _d| _d S )Nç        )r&   r   ÚonScrollÚpercent)r   r  r   r   r   r   Æ  rf   z_Scrollbar.__init__c                 C   ó$   t dtd|  d¡ƒƒ| _|  ¡  d S )Nç      ð?r  éÿÿÿÿ©r   ru   r  r  r*   r!   r   r   r   ÚsmallerË  ó   z_Scrollbar.smallerc                 C   r  )Nr  r  r\   r	  r!   r   r   r   ÚbiggerÏ  r  z_Scrollbar.biggerN)r   r   r	   r   r
  r  r   r   r   r   r  Å  s    r  c                   @   ó<   e Zd Zdd„ Zdd„ Zdd„ ZdZdZd	Zd
Z	dd„ Z
dS )ÚHorizontalScrollbarc                 C   ó   dS )Nr—   r   r!   r   r   r   r4   Õ  r3   zHorizontalScrollbar.sizeHintc                 C   ó   |   ¡  d S r   ©r
  rB   r   r   r   rÒ   Ø  r%   z#HorizontalScrollbar.func_LEFT_ARROWc                 C   r  r   ©r  rB   r   r   r   rÓ   Û  r%   z$HorizontalScrollbar.func_RIGHT_ARROWu   â—€u   â–¶õ   â–‘õ   â–“c                 C   sd   |  dd¡ |d }t|| j ƒ}|| }| j| j|  | j | j|  | j }| | d¡¡ d S )Nr   rp   rI   )	r   r{   r  Ú_leftÚ_barÚ_sliderÚ_rightr#   rç   )r   r   r   r   rl   ÚbeforeÚafterÚmer   r   r   r1   ã  s   ÿþýüÿzHorizontalScrollbar.renderN)r   r   r	   r4   rÒ   rÓ   r  r  r  r  r1   r   r   r   r   r  Ô  ó    r  c                   @   r  )ÚVerticalScrollbarc                 C   r  )N)r\   Nr   r!   r   r   r   r4   ó  r3   zVerticalScrollbar.sizeHintc                 C   r  r   r  rB   r   r   r   Úfunc_UP_ARROWö  r%   zVerticalScrollbar.func_UP_ARROWc                 C   r  r   r  rB   r   r   r   Úfunc_DOWN_ARROWù  r%   z!VerticalScrollbar.func_DOWN_ARROWu   â–²u   â–¼r  r  c                 C   s¨   |  dd¡ t| j|d  ƒ}| | j d¡¡ td|d ƒD ]!}|  d|¡ ||d kr7| | j d¡¡ q| | j d¡¡ q|  d|d ¡ | | j	 d¡¡ d S )Nr   r³   rI   r\   )
r   r{   r  r#   Ú_uprç   rk   r  r  Ú_down)r   r   r   r   Úknobr¦   r   r   r   r1     s   zVerticalScrollbar.renderN)r   r   r	   r4   r  r  r   r!  r  r  r1   r   r   r   r   r  ò  r  r  c                   @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚScrolledAreaz”
    A L{ScrolledArea} contains another widget wrapped in a viewport and
    vertical and horizontal scrollbars for moving the viewport around.
    c                 C   sL   t  | ¡ t|ƒ| _t| jƒ| _t| jƒ| _	| j| j| j	fD ]}| |_
qd S r   )r&   r   rð   Ú	_viewportr  Ú_horizScrollÚ_horizr  Ú_vertScrollÚ_vertr)   )r   r»   rx   r   r   r   r     s   

ÿzScrolledArea.__init__c                 C   ó.   | j  j|7  _td| j jƒ| j _| j jd S ©Nr   g      9@)r$  rò   ru   ©r   rl   r   r   r   r%    ó   zScrolledArea._horizScrollc                 C   r)  r*  )r$  r÷   ru   r+  r   r   r   r'  #  r,  zScrolledArea._vertScrollc                 C   ó   | j  ¡  d S r   )r(  r
  rB   r   r   r   r  (  r¾   zScrolledArea.func_UP_ARROWc                 C   r-  r   )r(  r  rB   r   r   r   r  +  r¾   zScrolledArea.func_DOWN_ARROWc                 C   r-  r   )r&  r
  rB   r   r   r   rÒ   .  r¾   zScrolledArea.func_LEFT_ARROWc                 C   r-  r   )r&  r  rB   r   r   r   rÓ   1  r¾   zScrolledArea.func_RIGHT_ARROWc                 C   s,   | j  ¡  | j ¡  | j ¡  t | ¡ d S r   )r$  r+   r&  r(  r&   r!   r   r   r   r+   4  s   


zScrolledArea.filthyc                 C   sº   t ||d |d ddƒ}| j |d |d |¡ | jr | d¡ t|dd|d ƒ t|dd|d ƒ | j d|d t |d|d |d dƒ¡ | j |dt ||dd|d ƒ¡ | d¡ d S )Nr³   r\   rÂ   r   rÃ   )	r   r$  r-   rE   r#   r­   r±   r(  r&  )r   r   r   r   Úwrapperr   r   r   r1   :  s   
ÿÿzScrolledArea.renderN)r   r   r	   r
   r   r%  r'  r  r  rÒ   rÓ   r+   r1   r   r   r   r   r#    s    	r#  c                 C   s6   |   ¡  |  ttjƒ¡ |  |¡ |  ¡  |  ¡  d S r   )r   r   rL   r   ÚREVERSE_VIDEOr#   r   r   )r   r[   r   r   r   rÎ   J  s
   
rÎ   c                   @   sV   e Zd ZdZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú	Selectionr   Nc                 C   s>   t  | ¡ || _|| _|| _|d urttt| jƒƒ| _d S d S r   )	r&   r   ÚsequenceÚonSelectÚ
minVisibleru   r‘   r_   r�   )r   r1  r2  r3  r   r   r   r   Y  s   
ÿzSelection.__init__c                 C   s   | j d ur| j| j fS d S r   )r3  r�   r!   r   r   r   r4   a  s   
ÿzSelection.sizeHintc                 C   s@   | j dkr|  j d8  _ | jdkr|  jd8  _|  ¡  d S d S rÑ   )ÚfocusedIndexÚrenderOffsetr*   rB   r   r   r   r  e  s   

üzSelection.func_UP_ARROWc                 C   sB   | j dkr|  j| j 8  _d| _ n
td| j| j ƒ| _|  ¡  d S r¤   )r5  r4  ru   r   r*   rB   r   r   r   Ú	func_PGUPl  s
   
zSelection.func_PGUPc                 C   sP   | j t| jƒd k r&|  j d7  _ | j| jd k r |  jd7  _|  ¡  d S d S r—   )r4  r_   r1  r5  r   r*   rB   r   r   r   r  t  s   üzSelection.func_DOWN_ARROWc                 C   sŽ   | j | jd kr2| j| j  d }|| j t| jƒkr$t| jƒ| j d }|  j|7  _| jd | _ ntt| jƒd | j| j ƒ| _|  ¡  d S r—   )r5  r   r4  r_   r1  r   r*   )r   r>   Úchanger   r   r   Ú	func_PGDN{  s   ÿzSelection.func_PGDNc                 C   s"   |dkr|   | j| j ¡ d S d S rÇ   )r2  r1  r4  r<   r   r   r   r;   ˆ  s   ÿzSelection.characterReceivedc           
      C   sè   || _ | j| j }|t| jƒ| krtdt| jƒ| ƒ}| j||| … }t|ƒD ]H\}}| d|¡ || jkrU| ¡  | j	rJt
tjƒt
tjƒf}nt
tjƒf}|j|Ž  |d |… }	| |	d|t|	ƒ   ¡ || jkrq| ¡  q)d S rÞ   )r   r4  r5  r_   r1  ru   r�   r   r   rE   rL   r   r/  ÚBOLDr   r#   r   )
r   r   r   r   ÚstartÚelementsrl   ÚeleÚmodesr   r   r   r   r1   Œ  s&   


€ôzSelection.renderr   )r   r   r	   r4  r5  r   r4   r  r6  r  r8  r;   r1   r   r   r   r   r0  R  s    
r0  )$r
   r›   Útwisted.conch.insultsr   r   Útwisted.pythonr   rä   Ú	Exceptionr   r   r&   rQ   rb   rj   ro   rŠ   rŒ   rŽ   r–   r­   r±   r¹   rº   rÄ   rÉ   rÚ   rÜ   rß   rð   r  r  r  r#  rÎ   r0  r   r   r   r   Ú<module>   s>   JP:Q1*;:;