o bk@sdZddlZddlmZmZddlmZGdddeZ GdddZ Gd d d Z Gd d d e Z Gd dde Z Gddde ZGddde ZGdddeZGdddeZGddde ZGddde ZddZddZdd ZGd!d"d"e ZGd#d$d$e ZGd%d&d&e ZGd'd(d(eZGd)d*d*e ZGd+d,d,eZGd-d.d.e ZGd/d0d0e ZGd1d2d2eZGd3d4d4eZ Gd5d6d6e Z!d7d8Z"Gd9d:d:e Z#dS);z< Simple insults-based widget library @author: Jp Calderone N)helperinsults)textc@eZdZdZdS) YieldFocusz, Input focus manipulation exception N)__name__ __module__ __qualname____doc__r r >/usr/lib/python3/dist-packages/twisted/conch/insults/window.pyrrc@,eZdZddZddZddZddZd S) BoundedTerminalWrappercCsJ||_||_||_||_||_|j|_|j|_|j|_|j|_|j |_ dSN) widthheightxoffyoffterminal cursorForwardselectCharacterSetselectGraphicRendition saveCursor restoreCursor)selfrrrrrr r r __init__s zBoundedTerminalWrapper.__init__cCs*|j|jt|j||jt|j|Sr)rcursorPositionrminrrr)rxyr r r r"s z%BoundedTerminalWrapper.cursorPositioncCs|j|j|jSr)rrrrrr r r cursorHome'sz!BoundedTerminalWrapper.cursorHomecCs |j|Sr)rwrite)rdatar r r r#* zBoundedTerminalWrapper.writeN)rrr rrr"r#r r r r rs   rc@seZdZdZdZdZdZZddZddZ ddZ d d Z d d Z d dZ ddZddZddZddZddZddZddZdS)WidgetFNcCs4|jsd|_|jdur|jjs|jdSdSdSNT)dirtyparentrepaintr!r r r r*4s zWidget.repaintcCs d|_dSr')r(r!r r r filthy: z Widget.filthycCs|||||dSr)r+drawrrrrr r r redraw=sz Widget.redrawcCsB||jks ||jks |jr||_||_d|_||||dSdSNF)rrr(renderr.r r r r-As z Widget.drawcCdSrr r.r r r r1Hz Widget.rendercCr2rr r!r r r sizeHintKr3zWidget.sizeHintcCsT|dkr ||dS|dkr|dS|tjvr"|||dS|||dS)N ) tabReceivedbackspaceReceivedr FUNCTION_KEYSfunctionKeyReceivedcharacterReceivedrkeyIDmodifierr r r keystrokeReceivedNs  zWidget.keystrokeReceivedcCtrrrr>r r r r7XzWidget.tabReceivedcCsd|_|dS)z Called when focus is being given to this widget. May raise YieldFocus is this widget does not want focus. TNfocusedr*r!r r r focusReceived\s zWidget.focusReceivedcCsd|_|dSr0rDr!r r r focusLoste zWidget.focusLostcCr2rr r!r r r r8ir3zWidget.backspaceReceivedcCs@|}t|ts |d}t|d|d}|dur||dSdS)Nutf-8func_) isinstancestrdecodegetattr)rr=r>namefuncr r r r:ls   zWidget.functionKeyReceivedcCr2rr r<r r r r;tr3zWidget.characterReceived)rrr rEr)r(rrr*r+r/r-r1r4r?r7rFrGr8r:r;r r r r r&.s$   r&c@sXeZdZdZdZdZddZddZdd Zd d Z d d Z ddZ ddZ ddZ dS)ContainerWidgetzZ @ivar focusedChild: The contained widget which currently has focus, or None. NFcCst|g|_dSr)r&rchildrenr!r r r r  zContainerWidget.__init__cCsb|jdusJ||_|j||jdur+|jr+z|Wn ty'Ynw||_|dSr)r)rRappend focusedChildrErFrr*rchildr r r addChilds    zContainerWidget.addChildcCs,|j|usJd|_|j||dSr)r)rRremover*rVr r r remChilds  zContainerWidget.remChildcCs"|jD]}|qt|dSr)rRr+r&)rchr r r r+s  zContainerWidget.filthycCs|jD] }||||qdSr)rRr-)rrrrr[r r r r1s zContainerWidget.rendercCs||jdur)|j|j}d|_z |j|d}Wn ty(twd}|t|jkrXz |j|Wn tyH|d7}Yn w|j||_dS|t|jks2t)Nr) r*rUrGrRindex ValueErrorrlenrF)rrUcurFocusr r r changeFocuss*       zContainerWidget.changeFocuscCs|d|_dSr')rarEr!r r r rFs zContainerWidget.focusReceivedcCsV|jdur"z |j||WdSty!||YdSwt|||dSr)rUr?rrar*r&r<r r r r?s  z!ContainerWidget.keystrokeReceived)rrr r rUrErrXrZr+r1rarFr?r r r r rQxs  rQc@s@eZdZdZdZddZdZddZdd Zd d Z d d Z dS) 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} with a short timeout). TcCt|||_||_dSr)rQrpainter scheduler)rrdrer r r r  zTopWindow.__init__NcCs,|jdurt|_||jt|dSr) _paintCallobjectre_paintrQr*r!r r r r*s  zTopWindow.repaintcCsd|_|dSr)rgrdr!r r r rirHzTopWindow._paintc CsJzt|WdSty$z t|WYdSty#YYdSwwr)rQrarr!r r r ras  zTopWindow.changeFocuscCs2z t|||WdSty|YdSwr)rQr?rrar<r r r r?s  zTopWindow.keystrokeReceived) rrr r rErrgr*rirar?r r r r rbs rbc@seZdZddZddZdS) AbsoluteBoxcCsFtt|jD]}|j|d|ur|||f|j|<dSqtd|)Nrz No such child)ranger_rRr^)rrWrr nr r r moveChilds  zAbsoluteBox.moveChildcCs<|jD]\}}}t|||||||}||||qdSr)rRrr-)rrrrr[rr wrapr r r r1 szAbsoluteBox.renderN)rrr rmr1r r r r rjs rjc@s6eZdZed\ZZZefddZddZddZ dS) _BoxcCt|||_dSr)rQrgravity)rrrr r r rrSz _Box.__init__cCsd}d}|jD]`}|}|durd}|jdkr@|ddur!d}n |dur+||d7}|ddur4d}q|dur?t||d}q|ddurId}n |durTt||d}|ddur]d}q|durg||d7}q||fS)NrNNr\)rRr4variableDimensionmax)rrrr[hintr r r r4s4        z _Box.sizeHintcCs|jsdSd}g}|jD]}|}|durd}||jdur#|d7}|||jq ||f|j}tdd|D} |rFt|| |} d} } t||jD]6\} }| durZ| } ||}}|jdkrg| }n| }t|||| | }|||||jdkr| | 7} qP| | 7} qPdS)Nrrsr\css|] }|dur|VqdSrr ).0wr r r Dsz_Box.render..) rRr4rtrTsumintziprr-)rrrrgreedywantsr[rvlength totalWant leftForGreedy widthOffset heightOffsetwantsubWidth subHeightrnr r r r15sF      z _Box.renderN) rrr rkTOPCENTERBOTTOMrr4r1r r r r ros   roc@r)HBoxrNrrr rtr r r r rbr rc@r)VBoxr\Nrr r r r rfr rc@eZdZddZdS)Packerc Cs|jsdStt|jdd}ddt|D}t|jD]\}}||t||qt}t|j|||||dS)Ng?cSsg|]}tqSr )r)rwrlr r r psz!Packer.render..) rRr{r_rk enumeraterXrmapr1) rrrrrootboxesrlr[hr r r r1ks z Packer.renderN)rrr r1r r r r rj rc@sDeZdZdZdZddZddZddZd d Zd d Z d dZ dS)CanvasFNcCst||dddSNr\)r&rresizer!r r r r}s zCanvas.__init__cCstdd||}|jdur1tt||jD]}tt||jD]}|||f||||<q!q||_||_||_|j|krD|d|_|j|krP|d|_dSdS)NB r\)arraycontentsrkr_width_heightrr )rrrrrr r r r rs    z Canvas.resizecCs|\}}|j|j||Srrr)rr]rr r r r __getitem__szCanvas.__getitem__cCs |\}}||j|j||<dSrr)rr]valuerr r r r __setitem__szCanvas.__setitem__cCstddt|j|_dS)Nrr)rr_rr!r r r clearsz Canvas.clearcCs|r|sdS||jks||jkr|||t|D]%}|d||j|j||j||j}|d|}||qdSNr)rrrrkrrtobytesr#)rrrrirr r r r1s     z Canvas.render) rrr rErrrrrrr1r r r r rxs rcCsB|tjtj||||d|||tjtjdS)Nq)rr CS_DRAWINGG0rr#CS_US)rr leftrightr r r horizontalLines rcCsJ|tjtjt||D] }||||dq |tjtjdS)Nx)rrrrrkrr#r)rrtopbottomrlr r r verticalLines   rcCs|\}}|\}}|tjtj||||d|d|d|dt|dD]}||||d|d||d|dq/|d||d|d|d|d|d |tjtjd 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. lrkr\rrmjN) rrrrrr#rkrr)rposition dimensionrrrrrlr r r rectangles"        rc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)BordercCst|||_||j_dSr)r&r containeer)rrr r r rs  zBorder.__init__cC |jSr)rrFr!r r r rFr,zBorder.focusReceivedcCrr)rrGr!r r r rGr,zBorder.focusLostcCs|j||Sr)rr?r<r r r r?zBorder.keystrokeReceivedcCs`|j}|dur d}|ddurd}n|dd}|ddur&d}||fS|dd}||fS)Nrsrrr\)rr4)rrvrr r r r r4s     zBorder.sizeHintcC|jt|dSrrr+r&r!r r r r+ z Border.filthycCs`|jjr |dt|d||f|dt||d|ddd}|j|d|d|dS)N)rrrr\)rrEr#rrr-)rrrrrnr r r r1s   z Border.renderN) rrr rrFrGr?r4r+r1r r r r rs rc@r) ButtoncCrcr)r&rlabelonPress)rrrr r r rrfzButton.__init__cCst|jdfSr)r_rr!r r r r4rzButton.sizeHintcCs|dkr |dSdSN )rr<r r r r; s zButton.characterReceivedcCs:|dd|jr|d|jddS||jdS)Nrsr)rrEr#rr.r r r r1 s z Button.renderN)rrr rr4r;r1r r r r rs  rc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS) TextInputcCs&t|||_||_d|_d|_dS)Nr)r&ronSubmitmaxwidthbuffercursor)rrrr r r rs  zTextInput.__init__cCs(|d|j|_t|j|_|dSr)rrr_rr*rrr r r setTexts  zTextInput.setTextcCs(|jdkr|jd8_|dSdSNrr\)rr*rBr r r func_LEFT_ARROW"s  zTextInput.func_LEFT_ARROWcCs.|jt|jkr|jd7_|dSdSr)rr_rr*rBr r r func_RIGHT_ARROW's zTextInput.func_RIGHT_ARROWcCsN|jdkr%|jd|jd|j|jd|_|jd8_|dSdSr)rrr*r!r r r r8,s & zTextInput.backspaceReceivedcCsl|dkr ||jdSt|j|jkr4|jd|j||j|jd|_|jd7_|dSdS)Nrr\)rrr_rrr*r<r r r r;2s" zTextInput.characterReceivedcCs|jddfSr)rr!r r r r4=rzTextInput.sizeHintcCs|}|dd|jrB||d|jt|||j|jdp$d|||jdd|d|jt|ddS|jt|}||d|dS)Nrr\r_) _renderTextrrEr#rrr_)rrrr currentTextmorer r r r1@s  zTextInput.rendercC|jSr)rr!r r r rLzTextInput._renderTextN) rrr rrrrr8r;r4r1rr r r r rs  rc@r) PasswordInputcCsdt|jS)N*)r_rr!r r r rQrzPasswordInput._renderTextN)rrr rr r r r rPrrc@s:eZdZdZd ddZddZddZd d Zd d ZdS) TextOutputrNcCrqr)r&rsize)rrr r r rXrSzTextOutput.__init__cCrr)rr!r r r r4\rzTextOutput.sizeHintcCs8|dd|jd|}||d|t|dSNrr)rrr#r_)rrrrrr r r r1_s zTextOutput.rendercCs||_|dSr)rr*rr r r rdrHzTextOutput.setTextcCr@rrAr!r r r rFhrzTextOutput.focusReceivedr) rrr rrr4r1rrFr r r r rUs  rc@s.eZdZed\ZZdefddZddZdS)TextOutputArearNcCst||||_dSr)rr longLines)rrrr r r ros  zTextOutputArea.__init__c Csd}|j}g}|rX|j|jkrC|d}t|ts |d}g}t ||D]} t| t s4| d} | | q(| |p@dgn | |dd|t||krVn|s t|d|D]\}} |d||| q`dS)NrrIr)r splitlinesrWRAPpoprKrLrMtptext greedyWrapbytesencoderTextendr_rrr#) rrrrrl inputLines outputLinesline wrappedLines wrappedLineLr r r r1ss,           zTextOutputArea.render)rrr rkrTRUNCATErr1r r r r rls  rc@sheZdZdZdZeddZejddZeddZejddZdZ d Z d d Z d d Z ddZ dS)ViewportrcCrr)_xOffsetr!r r r xOffsetrCzViewport.xOffsetcC |j|kr||_|dSdSr)rr*rrr r r r  cCrr)_yOffsetr!r r r yOffsetrCzViewport.yOffsetcCrr)rr*rr r r rrcCsDt|||_||j_t|_|j|j_|j |j_ |j dSr) r&rrr)rTerminalBuffer_bufrrrrconnectionMaderr r r rs    zViewport.__init__cCrrrr!r r r r+rzViewport.filthyc Cs|j|j|j|jt|jj|j|j|D];\}}|d|d}t||j |j |D]\}\}}||jj ur?d}| |q1||krT| d||dqdS)Nrrr\) rr-rrrrlinesrrrvoidr#) rrrrr rrlr[attrr r r r1s $  zViewport.renderN)rrr rrpropertyrsetterrrrrr+r1r r r r rs      rc@s$eZdZddZddZddZdS) _ScrollbarcCst|||_d|_dS)N)r&ronScrollpercent)rrr r r rrfz_Scrollbar.__init__cC$tdtd|d|_|dS)N?rrrurrr*r!r r r smaller z_Scrollbar.smallercCr)Nrrr\r r!r r r biggerr z_Scrollbar.biggerN)rrr rr r r r r r rs rc@<eZdZddZddZddZdZdZd Zd Z d d Z d S)HorizontalScrollbarcCdS)Nrr r!r r r r4r3zHorizontalScrollbar.sizeHintcC |dSrr rBr r r rr%z#HorizontalScrollbar.func_LEFT_ARROWcCrrr rBr r r rr%z$HorizontalScrollbar.func_RIGHT_ARROWu◀u▶░▓cCsd|dd|d}t||j}||}|j|j||j|j||j}||ddS)NrrprI) rr{r_left_bar_slider_rightr#r)rrrrrlbeforeaftermer r r r1s zHorizontalScrollbar.renderN) rrr r4rrrrrrr1r r r r r rc@r )VerticalScrollbarcCr)N)r\Nr r!r r r r4r3zVerticalScrollbar.sizeHintcCrrrrBr r r func_UP_ARROWr%zVerticalScrollbar.func_UP_ARROWcCrrrrBr r r func_DOWN_ARROWr%z!VerticalScrollbar.func_DOWN_ARROWu▲u▼rrcCs|ddt|j|d}||jdtd|dD]!}|d|||dkr7||jdq||jdq|d|d||j ddS)NrrrIr\) rr{rr#_uprrkrr_down)rrrrknobrr r r r1s   zVerticalScrollbar.renderN) rrr r4rrr r!rrr1r r r r rrrc@sXeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dS) ScrolledAreaz A L{ScrolledArea} contains another widget wrapped in a viewport and vertical and horizontal scrollbars for moving the viewport around. cCsLt|t||_t|j|_t|j|_ |j|j|j fD]}||_ qdSr) r&rr _viewportr _horizScroll_horizr _vertScroll_vertr))rrrxr r r rs    zScrolledArea.__init__cC.|jj|7_td|jj|j_|jjdSNrg9@)r$rrurrlr r r r% zScrolledArea._horizScrollcCr)r*)r$rrur+r r r r'#r,zScrolledArea._vertScrollcC|jdSr)r(r rBr r r r(rzScrolledArea.func_UP_ARROWcCr-r)r(r rBr r r r+rzScrolledArea.func_DOWN_ARROWcCr-r)r&r rBr r r r.rzScrolledArea.func_LEFT_ARROWcCr-r)r&r rBr r r r1rzScrolledArea.func_RIGHT_ARROWcCs,|j|j|jt|dSr)r$r+r&r(r&r!r r r r+4s   zScrolledArea.filthyc Cst||d|ddd}|j|d|d||jr |dt|dd|dt|dd|d|jd|dt|d|d|dd|j|dt||dd|d|ddS)Nrr\rrr) rr$r-rEr#rrr(r&)rrrrwrapperr r r r1:s zScrolledArea.renderN) rrr r rr%r'rrrrr+r1r r r r r#s  r#cCs6||ttj||||dSr)rrrLr REVERSE_VIDEOr#rr)rr[r r r rJs   rc@sVeZdZdZdZdddZddZddZd d Zd d Z d dZ ddZ ddZ dS) SelectionrNcCs>t|||_||_||_|durttt|j|_dSdSr) r&rsequenceonSelect minVisiblerurr_r)rr1r2r3r r r rYs zSelection.__init__cCs|jdur |j|jfSdSr)r3rr!r r r r4as  zSelection.sizeHintcCs@|jdkr|jd8_|jdkr|jd8_|dSdSr) focusedIndex renderOffsetr*rBr r r res   zSelection.func_UP_ARROWcCsB|jdkr|j|j8_d|_n td|j|j|_|dSr)r5r4rurr*rBr r r func_PGUPls  zSelection.func_PGUPcCsP|jt|jdkr&|jd7_|j|jdkr |jd7_|dSdSr)r4r_r1r5rr*rBr r r rts  zSelection.func_DOWN_ARROWcCs|j|jdkr2|j|jd}||jt|jkr$t|j|jd}|j|7_|jd|_ntt|jd|j|j|_|dSr)r5rr4r_r1rr*)rr>changer r r func_PGDN{s zSelection.func_PGDNcCs"|dkr||j|jdSdSr)r2r1r4r<r r r r;szSelection.characterReceivedc Cs||_|j|j}|t|j|krtdt|j|}|j|||}t|D]H\}}|d|||jkrU||j rJt t j t t j f}nt t j f}|j||d|} || d|t| ||jkrq|q)dSr)rr4r5r_r1rurrrrErLrr/BOLDrr#r) rrrrstartelementsrlelemodesrr r r r1s&       zSelection.renderr) rrr r4r5rr4rr6rr8r;r1r r r r r0Rs  r0)$r rtwisted.conch.insultsrrtwisted.pythonrr Exceptionrrr&rQrbrjrorrrrrrrrrrrrrrrrrr#rr0r r r r s> JP:Q1*;:;