o
    Òó·il  ã                   @  sÄ  d Z ddlm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 d0d1„ d1eƒZ G d2d3„ d3e ƒZ!G d4d5„ d5e ƒZ"G d6d7„ d7eƒZ#d8d9„ Z$G d:d;„ d;eƒZ%dS )<z<
Simple insults-based widget library

@author: Jp Calderone
é    )ÚannotationsN)ÚhelperÚinsults)Útextc                   @  ó   e Zd ZdZdS )Ú
YieldFocusz,
    Input focus manipulation exception
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úbC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-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U dZdZdZdZded< dZde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d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚWidgetFNz
int | Noner   r   c                 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+   7   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.   D   s   üzWidget.drawc                 C  ó   d S r   r   r/   r   r   r   r2   K   ó   zWidget.renderc                 C  r3   r   r   r"   r   r   r   ÚsizeHintN   r4   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   ZFUNCTION_KEYSÚfunctionKeyReceivedÚcharacterReceived©r   ÚkeyIDÚmodifierr   r   r   ÚkeystrokeReceivedQ   s   
zWidget.keystrokeReceivedc                 C  ó   t ƒ ‚r   ©r   ©r   r>   r   r   r   r8   [   ó   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 r1   rD   r"   r   r   r   Ú	focusLosth   ó   zWidget.focusLostc                 C  r3   r   r   r"   r   r   r   r9   l   r4   zWidget.backspaceReceivedc                 C  sL   |}t |tƒs| d¡}d|dd…  }t| |d ƒ}|d ur$||ƒ d S d S )Núutf-8Zfunc_é   éÿÿÿÿ)Ú
isinstanceÚstrÚdecodeÚgetattr)r   r=   r>   ÚnameÚ
methodNameÚfuncr   r   r   r:   o   s   

ÿzWidget.functionKeyReceivedc                 C  r3   r   r   r<   r   r   r   r;   |   r4   zWidget.characterReceived)r   r	   r
   rE   r*   r)   r   Ú__annotations__r   r+   r,   r0   r.   r2   r5   r?   r8   rF   rG   r9   r:   r;   r   r   r   r   r'   0   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*   rU   Ú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*   rU   Úremover+   rY   r   r   r   ÚremChildš   s   zContainerWidget.remChildc                 C  s"   | j D ]}| ¡  qt | ¡ d S r   )rU   r,   r'   )r   Úchr   r   r   r,       s   

zContainerWidget.filthyc                 C  s   | j D ]	}| |||¡ qd S r   )rU   r.   )r   r   r   r   r^   r   r   r   r2   ¥   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ƒ ‚)NrJ   r   )	r+   rX   rG   rU   ÚindexÚ
ValueErrorr   ÚlenrF   )r   rX   ZcurFocusr   r   r   ÚchangeFocus©   s*   

ÿÿù	zContainerWidget.changeFocusc                 C  s   |   ¡  d| _d S r(   )rb   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   )rX   r?   r   rb   r+   r'   r<   r   r   r   r?   Å   s   
þz!ContainerWidget.keystrokeReceived)r   r	   r
   r   rX   rE   r   r[   r]   r,   r2   rb   rF   r?   r   r   r   r   rT   €   s    rT   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   )rT   r   ÚpainterÚ	scheduler)r   re   rf   r   r   r   r   é   ó   

zTopWindow.__init__Nc                 C  s,   | j d u rtƒ | _ |  | j¡ t | ¡ d S r   )Ú
_paintCallÚobjectrf   Ú_paintrT   r+   r"   r   r   r   r+   ð   s   
zTopWindow.repaintc                 C  s   d | _ |  ¡  d S r   )rh   re   r"   r   r   r   rj   ö   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   )rT   rb   r   r"   r   r   r   rb   ú   s   ÿýzTopWindow.changeFocusc                 C  s2   z
t  | ||¡ W d S  ty   |  ¡  Y d S w r   )rT   r?   r   rb   r<   r   r   r   r?     s
   ÿzTopWindow.keystrokeReceived)r   r	   r
   r   rE   r   rh   r+   rj   rb   r?   r   r   r   r   rc   Ð   s    	rc   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)Úrangera   rU   r`   )r   rZ   r    r!   Únr   r   r   Ú	moveChild  s   þ
zAbsoluteBox.moveChildc                 C  s<   | j D ]\}}}t||| || ||ƒ}| |||¡ qd S r   )rU   r   r.   )r   r   r   r   r^   r    r!   Úwrapr   r   r   r2     s   þzAbsoluteBox.renderN)r   r	   r
   rn   r2   r   r   r   r   rk   
  s    rk   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   )rT   r   Úgravity)r   rs   r   r   r   r     rV   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   ©NNrJ   )rU   r5   ÚvariableDimensionÚmax)r   r   r   r^   Úhintr   r   r   r5      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   rt   rJ   c                 s  s   � | ]	}|d ur|V  qd S r   r   )Ú.0Úwr   r   r   Ú	<genexpr>L  s   € z_Box.render.<locals>.<genexpr>)	rU   r5   ru   rW   ÚsumÚintÚzipr   r.   )r   r   r   r   ZgreedyZwantsr^   rw   ÚlengthZ	totalWantZleftForGreedyZwidthOffsetZheightOffsetZwantZsubWidthZ	subHeightro   r   r   r   r2   =  sF   


û


ëz_Box.renderN)
r   r	   r
   rl   ZTOPZCENTERZBOTTOMr   r5   r2   r   r   r   r   rp     s
    rp   c                   @  r   )ÚHBoxr   N©r   r	   r
   ru   r   r   r   r   r   j  r   r   c                   @  r   )ÚVBoxrJ   Nr€   r   r   r   r   r�   n  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�   )rx   rm   r   r   r   Ú
<listcomp>x  s    z!Packer.render.<locals>.<listcomp>)	rU   r|   ra   rl   Ú	enumerater[   r   Úmapr2   )	r   r   r   r   ÚrootZboxesrm   r^   Úhr   r   r   r2   s  s   zPacker.renderN)r   r	   r
   r2   r   r   r   r   rƒ   r  ó    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 ©NrJ   )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ó    rJ   )ÚarrayÚcontentsrl   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�   ra   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Œ   rl   r   r�   Útobytesr$   )r   r   r   r   Úir   r   r   r   r2   ¢  s   ÿþúzCanvas.render)r   r	   r
   rE   r�   r   rŒ   r”   r–   r—   r2   r   r   r   r   rŠ   €  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�   rl   r   r$   rž   )r   r    ÚtopÚbottomrm   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›   é   ó   krJ   r¢   r   ó   mó   jN)	r   r   rœ   r�   r   r$   rl   r   rž   )r   ÚpositionZ	dimensionr£   rŸ   r   r   rm   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 )Nrt   r   r§   rJ   )r®   r5   )r   rw   r    r!   r   r   r   r5   í  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§   rJ   )r®   rE   r$   r¬   r   r.   )r   r   r   r   ro   r   r   r   r2   ÿ  s   

zBorder.renderN)
r   r	   r
   r   rF   rG   r?   r5   r,   r2   r   r   r   r   r­   Þ  s    r­   c                   @  r   )
ÚButtonc                 C  rd   r   )r'   r   ÚlabelÚonPress)r   r¸   r¹   r   r   r   r   	  rg   zButton.__init__c                 C  s   t | jƒdfS r‹   )ra   r¸   r"   r   r   r   r5     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   r2     s   zButton.renderN)r   r	   r
   r   r5   r;   r2   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À   ra   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   rJ   )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Á   ra   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   r9   4  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»   rJ   )r¾   rÀ   ra   r¿   rÁ   r+   r<   r   r   r   r;   :  s   "ÿûzTextInput.characterReceivedc                 C  s   | j d dfS r‹   )r¿   r"   r   r   r   r5   E  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   rJ   rŽ   ó   _)Ú_renderTextr   rE   r$   rÁ   r¿   ra   )r   r   r   r   ZcurrentTextÚmorer   r   r   r2   H  s    zTextInput.renderc                 C  ó   | j S r   )rÀ   r"   r   r   r   rÈ   T  ó   zTextInput._renderTextN)r   r	   r
   r   rÃ   rÅ   rÆ   r9   r;   r5   r2   rÈ   r   r   r   r   r¼     s    r¼   c                   @  r‚   )ÚPasswordInputc                 C  s   dt | jƒ S )NÚ*)ra   rÀ   r"   r   r   r   rÈ   Y  r±   zPasswordInput._renderTextN)r   r	   r
   rÈ   r   r   r   r   rÌ   X  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  rr   r   )r'   r   Úsize)r   rÏ   r   r   r   r   `  rV   zTextOutput.__init__c                 C  rÊ   r   )rÏ   r"   r   r   r   r5   d  rË   zTextOutput.sizeHintc                 C  s8   |  dd¡ | jd |… }| |d|t|ƒ   ¡ d S ©Nr   rŽ   )r   r   r$   ra   )r   r   r   r   r   r   r   r   r2   g  s   zTextOutput.renderc                 C  s   || _ |  ¡  d S r   )r   r+   rÂ   r   r   r   rÃ   l  rH   zTextOutput.setTextc                 C  r@   r   rA   r"   r   r   r   rF   p  rË   zTextOutput.focusReceivedr   )	r   r	   r
   r   r   r5   r2   rÃ   rF   r   r   r   r   rÎ   ]  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   w  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rVqX|st|d |… ƒD ]\}}
| d|¡ | |
¡ q`d S )Nr   rI   r½   )r   Ú
splitlinesrÒ   ÚWRAPÚpoprL   rM   rN   ÚtptextZ
greedyWrapÚbytesÚencoderW   Úextendra   r…   r   r$   )r   r   r   r   rm   Z
inputLinesZoutputLinesÚlineZwrappedLinesZwrappedLineÚLr   r   r   r2   {  s,   





òþzTextOutputArea.render)r   r	   r
   rl   rÔ   ZTRUNCATEr   r2   r   r   r   r   rÑ   t  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   ZTerminalBufferÚ_bufr‘   r   r’   r   Z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Ž   rJ   )r®   r.   r‘   r’   ræ   r…   Úlinesrâ   r   rÝ   Zvoidr$   )	r   r   r   r   r!   rÚ   rm   r^   Úattrr   r   r   r2   ¼  s   ÿ$€özViewport.renderN)r   r	   r
   rÝ   râ   ÚpropertyrÞ   Úsetterrã   r‘   r’   r   r,   r2   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   Î  rg   z_Scrollbar.__init__c                 C  ó$   t dtd|  d¡ƒƒ| _|  ¡  d S )Nç      ð?rì   rK   ©r   rv   rí   rî   r+   r"   r   r   r   ÚsmallerÓ  ó   z_Scrollbar.smallerc                 C  rï   )Nrð   rì   rJ   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   r5   Ý  r4   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   rq   rI   )	r   r|   rî   Ú_leftÚ_barÚ_sliderÚ_rightr$   rØ   )r   r   r   r   rm   ÚbeforeÚafterÚmer   r   r   r2   ë  s   ÿþýüÿzHorizontalScrollbar.renderN)r   r	   r
   r5   rÅ   rÆ   rý   r   rþ   rÿ   r2   r   r   r   r   rö   Ü  ó    rö   c                   @  rõ   )ÚVerticalScrollbarc                 C  r÷   )N)rJ   Nr   r"   r   r   r   r5   û  r4   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   rJ   )
r   r|   rî   r$   Ú_uprØ   rl   rþ   rÿ   Ú_down)r   r   r   r   Zknobrš   r   r   r   r2   	  s   zVerticalScrollbar.renderN)r   r	   r
   r5   r  r  r  r	  rþ   rÿ   r2   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®   ry   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Þ   rv   ©r   rm   r   r   r   r  &  ó   zScrolledArea._horizScrollc                 C  r  r  )r  rã   rv   r  r   r   r   r  +  r  zScrolledArea._vertScrollc                 C  ó   | j  ¡  d S r   )r  rò   rB   r   r   r   r  0  r±   zScrolledArea.func_UP_ARROWc                 C  r  r   )r  rô   rB   r   r   r   r  3  r±   zScrolledArea.func_DOWN_ARROWc                 C  r  r   )r  rò   rB   r   r   r   rÅ   6  r±   zScrolledArea.func_LEFT_ARROWc                 C  r  r   )r  rô   rB   r   r   r   rÆ   9  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,   <  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§   rJ   rµ   r   r¶   )	r   r  r.   rE   r$   r¡   r¥   r  r  )r   r   r   r   Úwrapperr   r   r   r2   B  s   
ÿÿzScrolledArea.renderN)r   r	   r
   r   r   r  r  r  r  rÅ   rÆ   r,   r2   r   r   r   r   r
    s    	r
  c                 C  s6   |   ¡  |  ttjƒ¡ |  |¡ |  ¡  |  ¡  d S r   )r   r   rM   r   ÚREVERSE_VIDEOr$   r   r   )r   r^   r   r   r   rÁ   R  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Ú
minVisiblerv   r†   ra   r‘   )r   r  r  r  r   r   r   r   a  s   
ÿzSelection.__init__c                 C  s   | j d ur| j| j fS d S r   )r  r‘   r"   r   r   r   r5   i  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  m  s   

üzSelection.func_UP_ARROWc                 C  sB   | j dkr|  j| j 8  _d| _ n
td| j| j ƒ| _|  ¡  d S r˜   )r  r  rv   r   r+   rB   r   r   r   Ú	func_PGUPt  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‹   )r  ra   r  r  r   r+   rB   r   r   r   r  |  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‹   )r  r   r  ra   r  r   r+   )r   r>   Zchanger   r   r   Ú	func_PGDNƒ  s   ÿzSelection.func_PGDNc                 C  s"   |dkr|   | j| j ¡ d S d S rº   )r  r  r  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   r  r  ra   r  rv   r…   r   r   rE   rM   r   r  ZBOLDr   r$   r   )
r   r   r   r   ÚstartÚelementsrm   ZeleÚmodesr   r   r   r   r2   ”  s&   


€ôzSelection.renderr   )r   r	   r
   r  r  r   r5   r  r  r  r  r;   r2   r   r   r   r   r  Z  s    
r  )&r   Ú
__future__r   r�   Ztwisted.conch.insultsr   r   Ztwisted.pythonr   rÖ   Ú	Exceptionr   r   r'   rT   rc   rk   rp   r   r�   rƒ   rŠ   r¡   r¥   r¬   r­   r·   r¼   rÌ   rÎ   rÑ   rÜ   rë   rö   r  r
  rÁ   r  r   r   r   r   Ú<module>   s@   PP:Q1*;:;