
    jj_                    B   d dl mZ d dlZd dlZd dlZddlmZmZmZ ddl	m
Z
mZ ej                  rd dlmZ d dlmZ d dlmZmZ dd	lmZ d
Z ej.                  dd      Z G d de      ZdZdZdZdZdZdZdZ dZ! G d de"ejF                        Z$ejJ                   G d dejL                               Z'ejJ                   G d de'ejL                               Z(ejJ                   G d de'ejL                               Z)d$dZ* G d  d!e
e         Z+ G d" d#e
e         Z,y)%    )annotationsN   )BOX_SYMBOLSSHADE_SYMBOLSSizing)WidgetDecorationWidgetError)Iterator)Literal)CanvasCompositeCanvas)Widget)	ScrollBar
ScrollableScrollableErrorScrollbarSymbolsWrappedWidgetSupportsScroll)boundc                      e Zd ZdZy)r   z"Scrollable specific widget errors.N)__name__
__module____qualname____doc__     `/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/urwid/widget/scrollable.pyr   r   /   s    ,r   r   zline upz	line downzpage upz	page downzto topzto endleftrightc                     e Zd ZdZej
                  Zej                  Zej                  Zej                  Ze	j                  j                  Ze	j                  j                  Ze	j                  j                  Ze	j                  j"                  Ze	j&                  j                  Ze	j&                  j                  Ze	j&                  j                  Ze	j&                  j"                  Ze	j0                  j                  Zy)r   z&Common symbols suitable for scrollbar.N)r   r   r   r   r   
FULL_BLOCK
DARK_SHADEMEDIUM_SHADE
LITE_SHADEr   LIGHTVERTICALDRAWING_LIGHTVERTICAL_2_DASHDRAWING_LIGHT_2_DASHVERTICAL_3_DASHDRAWING_LIGHT_3_DASHVERTICAL_4_DASHDRAWING_LIGHT_4_DASHHEAVYDRAWING_HEAVYDRAWING_HEAVY_2_DASHDRAWING_HEAVY_3_DASHDRAWING_HEAVY_4_DASHDOUBLEDRAWING_DOUBLEr   r   r   r   r   @   s    0))J))J --L))J%%..M&,,<<&,,<<&,,<<%%..M&,,<<&,,<<&,,<< ''00Nr   r   c                  r    e Zd ZdZd
dZddZdddZedd       ZddZ		 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ
dddZy	)WidgetProtoz{Protocol for widget.

    Due to protocol cannot inherit non-protocol bases, define several obligatory Widget methods.
    c                     y Nr   selfs    r   sizingzWidgetProto.sizing]       r   c                     y r8   r   r9   s    r   
selectablezWidgetProto.selectable_   r<   r   c                     y r8   r   r:   sizefocuss      r   packzWidgetProto.packa   r<   r   c                    t         r8   )NotImplementedErrorr9   s    r   base_widgetzWidgetProto.base_widgetc   s    !!r   c                     y r8   r   r:   rA   keys      r   keypresszWidgetProto.keypressg   r<   r   c                     y r8   r   )r:   rA   eventbuttoncolrowrB   s          r   mouse_eventzWidgetProto.mouse_eventi   s     r   c                     y r8   r   r@   s      r   renderzWidgetProto.renders   r<   r   Nreturnzfrozenset[Sizing]rT   boolF)rA   tuple[int, int]rB   rV   rT   rX   )rT   r   rA   rX   rI   strrT   z
str | NonerA   rX   rL   rZ   rM   intrN   r\   rO   r\   rB   rV   rT   zbool | NonerA   rX   rB   rV   rT   r   )r   r   r   r   r;   r>   rC   propertyrF   rJ   rP   rR   r   r   r   r6   r6   U   sy     /%V" " K  	
    
 Pr   r6   c                  $    e Zd ZdZdddZdddZy)	r   zScroll specific methods.c                     y r8   r   r@   s      r   get_scrollposzSupportsScroll.get_scrollposz   r<   r   Nc                     y r8   r   r@   s      r   rows_maxzSupportsScroll.rows_max|   r<   r   rW   rA   rX   rB   rV   rT   r\   NFrA   ztuple[int, int] | NonerB   rV   rT   r\   )r   r   r   r   ra   rc   r   r   r   r   r   v   s    "S\r   c                  .    e Zd ZdZdddZdddZdddZy)	SupportsRelativeScrollz!Relative scroll-specific methods.c                     y r8   r   r@   s      r   require_relative_scrollz.SupportsRelativeScroll.require_relative_scroll   r<   r   c                     y r8   r   r@   s      r   get_first_visible_posz,SupportsRelativeScroll.get_first_visible_pos   r<   r   c                     y r8   r   r@   s      r   get_visible_amountz)SupportsRelativeScroll.get_visible_amount   r<   r   NrW   )rA   rX   rB   rV   rT   rV   rd   )r   r   r   r   rj   rl   rn   r   r   r   rh   rh      s    +^[Xr   rh   c              #     K   | h}|  t        | d|       x} |vr(|j                  |        |  t        | d|       x} |vr'y y w)Noriginal_widget)getattradd)wvisiteds     r   	orig_iterru      sR     cG
G,a001
@A ,a001
@s   ?AAc                       e Zd ZddZddZdd fdZ	 d	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ		 	 	 	 ddZ
ddd	Zdd
ZdddZ xZS )r   c                6    t        t        j                  f      S r8   	frozensetr   BOXr9   s    r   r;   zScrollable.sizing       &**''r   c                     yNTr   r9   s    r   r>   zScrollable.selectable       r   c                   |j                         t        t        j                  t        j                  f      z  st        d|      d| _        d| _        d| _        d| _	        d| _
        || _        t        | 5  |       y)ad  Box widget that makes a fixed or flow widget vertically scrollable

        .. note::
            Focusable widgets are handled, including switching focus, but possibly not intuitively,
            depending on the arrangement of widgets.

            When switching focus to a widget that is ouside of the visible part of the original widget,
            the canvas scrolls up/down to the focused widget.

            It would be better to scroll until the next focusable widget is in sight first.
            But for that to work we must somehow obtain a list of focusable rows in the original canvas.
        zNot a fixed or flow widget: r   N)r;   ry   r   FIXEDFLOW
ValueError	_trim_top_scroll_action_forward_keypress_old_cursor_coords_rows_max_cachedforce_forward_keypresssuper__init__)r:   widgetr   	__class__s      r   r   zScrollable.__init__   st     }}FLL&+++F!GG;F:FGG"!%"& !&<# r   c                    ddl m} |\  }d fd} j                   j                  |      }j	                  ||      }|j                  |      }|j                         |j                         }
}	|	k  r|	z
  x}dkD  r|j                  d|       |
|k  r||
z
  x}dkD  r|j                  d|       |	k  r|
|k  r|S  j                  ||        j                  }|
|z
  |z
  }|	z
  }|dkD  r|j                  |       |dkD  r|j                  |       |dkD  r|j                  d|        |j                   |j                  \  }}||k\  s|dk  rd |_        |j                  	d _        |S |j                  Ad _        t!        dd      r+t#        j$                  t&              5   |        d d d        |S |S j)                          _        |S # 1 sw Y   |S xY w)Nr   canvasc                 8   d} d}d}t        j                        D ]  \  }\  }}|j                  f      }|j                         x}r| |z  } |s| j                  k\  rd}F|sI|sd}|j                         s^|_        d }j                         }	t        |	d      r|	}n?t        |	d      r3|	j                  }
t        |
d      r|
j                  }nt        |
d      r|
}|r4t        |d      r(t        t        |dd             r|j                  d d         y  y )Nr   FTkey_timeoutrp   rJ   )	enumeratecontentsrR   rowsr   r>   
focus_item	get_focushasattrrp   callablerq   rJ   )chlast_hiddenfirst_visiblepwirs   _owcanvwhstnfnomaxcolowr:   s              r   automove_cursorz*Scrollable.render.<locals>.automove_cursor   s   BK!M )"++ 6  Wa&+%2%"HB"rT^^';"&K ((,<<> $'BMBBr=1 %67//"2'89!#!3!3B$R7!#Bgb-8XgbR\^bFc=dD$/A r   TFautomove_cursor_on_scroll)rT   None)urwidr   _original_widget_get_original_widget_sizerR   r   colsr   pad_trim_left_rightpad_trim_top_bottom_adjust_trim_topr   trimtrim_endcursorr   rq   
contextlibsuppress	Exceptionr>   )r:   rA   rB   r   maxrowr   ow_size	canv_fullcanv	canv_cols	canv_rows	pad_widthfill_heighttrim_topr   
trim_right_curscolcursrowr   r   s   `                 @@r   rR   zScrollable.render   s   
 	!$	N ""006IIgu-	 %%i0#yy{DIIK9	)1C$CIq#H$$Q	26I3E$EK#J$$Q49#6KdD) >>v%0'
a<IIha<MM(#>$$Q4 ;;" $Hg& GaK" ;;"%)D"0 / )%*D" r6>((3 &#%&" t &(]]_D"#&" s   .GG#c                   ddl m} | j                  s| j                  rT| j                  }| j                  |      }t        |d      r|j                  |      | _        |j                  ||      }|y | j                  }||   |j                  k(  rt        | _        n||   |j                  k(  rt        | _        nz||   |j                   k(  rt"        | _        n\||   |j$                  k(  rt&        | _        n>||   |j(                  k(  rt*        | _        n ||   |j,                  k(  rt.        | _        n|S | j1                          y )Nr   )Commandget_cursor_coords)urwid.command_mapr   r   r   r   r   r   r   r   rJ   _command_mapUPSCROLL_LINE_UPr   DOWNSCROLL_LINE_DOWNPAGE_UPSCROLL_PAGE_UP	PAGE_DOWNSCROLL_PAGE_DOWNMAX_LEFTSCROLL_TO_TOP	MAX_RIGHTSCROLL_TO_END_invalidate)r:   rA   rI   r   r   r   command_maps          r   rJ   zScrollable.keypress&  s,   
 	. !!T%@%@&&B44T:G r./*,*>*>w*G'++gs+C{ ''swzz)"0D-"2D0"0D!2!22"2D!1!11"/D!2!22"/D Jr   c                    | j                   }t        |d      r6| j                  |      }|| j                  z  }|j	                  ||||||      S y)NrP   F)r   r   r   r   rP   )	r:   rA   rL   rM   rN   rO   rB   r   r   s	            r   rP   zScrollable.mouse_eventQ  sS     ""2}%44T:G4>>!C>>'5&#sEJJr   c                  	
 | j                   }d| _         |\  }
| j                  }|j                         	|dk  r	
z
  |z   dz   }	
k  rd| _        yd	
fd}|t        k(  r ||dz
        | _        n|t        k(  r ||dz         | _        nl|t
        k(  r ||
z
  dz         | _        nO|t        k(  r ||
z   dz
        | _        n2|t        k(  rd| _        n!|t        k(  r	
z
  | _        n ||      | _        | j                  | j                  |j                  k7  re|j                  Xd| _	        |j                  \  }}|| j                  k  r|| _        y|| j                  
z   k\  rt        d|
z
  dz         | _        yyyyy)z6Adjust self._trim_top according to self._scroll_actionNr   r   c                6    t        dt        z
  |             S )Nr   )maxmin)new_trim_topr   r   s    r   ensure_boundsz2Scrollable._adjust_trim_top.<locals>.ensure_boundss  s    q#i&0,?@@r   )r   r\   rT   r\   )r   r   r   r   r   r   r   r   r   r   r   r   )r:   r   rA   action_maxcolr   r   r   r   r   r   s            @@r   r   zScrollable._adjust_trim_topb  s   $$">>IIK	a< 6)H4q8HDN	A ^#*8a<8DN''*8a<8DN~%*8f+<q+@ADN''*8f+<q+@ADN}$DN}$&/DN +84DN
 "".43J3Jdkk3Y^b^i^i^u&*D# $Hg'!(DNNV33!$Q&(81(<!= 4 _v3Y.r   c                    | j                   }|j                         }t        j                  |v r|d   fS t        j                  |v ryt        |d      )Nr   r   z sizing is not supported)r   r;   r   r   r   r   )r:   rA   r   r;   s       r   r   z$Scrollable._get_original_widget_size  sT     "";;& G:<<6!&>?@@r   c                    | j                   S )a%  Current scrolling position.

        Lower limit is 0, upper limit is the maximum number of rows with the given maxcol minus maxrow.

        ..note::
            The returned value may be too low or too high if the position has
            changed but the widget wasn't rendered yet.
        )r   r@   s      r   ra   zScrollable.get_scrollpos  s     ~~r   c                D    t        |      | _        | j                          y)a  Set scrolling position

        If `position` is positive it is interpreted as lines from the top.
        If `position` is negative it is interpreted as lines from the bottom.

        Values that are too high or too low values are automatically adjusted during rendering.
        N)r\   r   r   )r:   positions     r   set_scrollposzScrollable.set_scrollpos  s     Xr   c                   || j                   }| j                  |      }|j                         }t        j                  |v r&|j                  ||      d   | _        | j                  S t        j                  |v r#|j                  ||      | _        | j                  S t        d| j                         | j                  S )zReturn the number of rows for `size`

        If `size` is not given, the currently rendered number of rows is returned.
        r   zNot a flow/box widget: )
r   r   r;   r   r   rC   r   r   r   r   )r:   rA   rB   r   r   r;   s         r   rc   zScrollable.rows_max  s    
 &&B44T:GYY[F||v%(*(?(B%
 $$$	 &(*(?% $$$ &(?@U@U?X&YZZ$$$r   rS   rU   rW   )r   r   r   rV   rT   r   )rA   rX   rB   rV   rT   r   rY   r[   )r   r   rA   rX   rT   r   )rA   rX   rT   ztuple[int] | tuple[()]re   rf   )r   typing.SupportsIntrT   r   )r   r   r   r;   r>   r   rR   rJ   rP   r   r   ra   r   rc   __classcell__r   s   @r   r   r      s    (!6 ss s 
	sj)) ) 
	)V  	
    
"/>b
A
A 
 
A		% %r   r   c                  8    e Zd ZeZddZddZej                  dedf	 	 	 	 	 	 	 	 	 	 	 d fdZ		 d	 	 	 	 	 ddZ
edd       Zej                  dd       Zedd	       Zej                  dd
       Zedd       Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ xZS )r   c                6    t        t        j                  f      S r8   rx   r9   s    r   r;   zScrollBar.sizing  r{   r   c                     yr}   r   r9   s    r   r>   zScrollBar.selectable  r~   r    r   c                ,   t         j                  |j                         vrt        d|      t	        d t        |      D              st        d|      t        | !  |       || _	        || _
        || _        t        d|      | _        d| _        y)a  Box widget that adds a scrollbar to `widget`

        `widget` must be a box widget with the following methods:
          - `get_scrollpos` takes the arguments `size` and `focus` and returns the index of the first visible row.
          - `set_scrollpos` (optional; needed for mouse click support) takes the index of the first visible row.
          - `rows_max` takes `size` and `focus` and returns the total number of rows `widget` can render.

        `thumb_char` is the character used for the scrollbar handle.
        `trough_char` is used for the space above and below the handle.
        `side` must be 'left' or 'right'.
        `width` specifies the number of columns the scrollbar uses.
        zNot a box widget: c              3  <   K   | ]  }t        |t                y wr8   )
isinstancer   ).0rs   s     r   	<genexpr>z%ScrollBar.__init__.<locals>.<genexpr>  s     LQ:a0Ls   zNot a scrollable widget: r   )r   r   N)r   rz   r;   r   anyru   	TypeErrorr   r   _thumb_char_trough_charscrollbar_sider   scrollbar_width_original_widget_size)r:   r   
thumb_chartrough_charsidewidthr   s         r   r   zScrollBar.__init__  s    ( ::V]]_,1&<==L)F:KLL7zBCC %'""1e}%+"r   c           
         ddl m} d fd}d fd}\  }}t        d| j                  z
        |f|d   z
  } j                   j
                  t        t              xr( t        fddD              xr j                        }	|	r~ t        dt        dt                           }
 |       }j                        }j                        }t        |
||      }
|
|z
  }t        d	|t        d
|
      z        }|
|k(  rd}	|	sfj                        |kD  rJ |       }j                        }j!                        }||z
  }t        d	|t        d
|      z        }n |       S t        d
t#        |z              }t%              t        d
      z  }t        ||z
  |z        }|dk(  r|dkD  rt        d
||z
        }||z
  |z
  }|j'                   j(                  |d
      |j'                   j*                  |d
      |j'                   j(                  |d
      |j-                  g fdt/        |      D        fdt/        |      D        fdt/        |      D              }d dd   f|d d|fg} j0                  t2        k7  r|j5                  |      S |j5                  t7        |            S )Nr   r   c                 6    _         j                         S r8   r   rR   )rB   r   r:   rA   s   r   render_no_scrollbarz-ScrollBar.render.<locals>.render_no_scrollbar  s    )-D&99T5))r   c                 6    _         j                         S r8   r   )rB   r   r   r:   s   r   render_for_scrollbarz.ScrollBar.render.<locals>.render_for_scrollbar  s    )0D&99We,,r   c              3  6   K   | ]  }t        |        y wr8   )r   )r   attribow_bases     r   r   z#ScrollBar.render.<locals>.<genexpr>  s     ZGGV,Zs   )__length_hint____len__r  r  g      ?r   Fc              3  (   K   | ]	  }d df  y wre   r   )r   _tops     r   r   z#ScrollBar.render.<locals>.<genexpr>D  s     @3e$@   c              3  (   K   | ]	  }d df  y wre   r   )r   r  thumbs     r   r   z#ScrollBar.render.<locals>.<genexpr>E  s     D15$&Dr  c              3  (   K   | ]	  }d df  y wre   r   )r   r  bottoms     r   r   z#ScrollBar.render.<locals>.<genexpr>F  s     FA64'Fr  T)rT   r   )r   r   r   _scrollbar_widthr   scrolling_base_widgetr   rh   r   rj   rq   r\   rn   rl   r   rc   ra   roundfloatSolidCanvasr   r   CanvasCombinerange_scrollbar_sideSCROLLBAR_LEFT
CanvasJoinreversed)r:   rA   rB   r   r   r   r   r   sb_widthuse_relativeow_lenow_canvvisible_amountposposmaxthumb_weightow_rows_maxthumb_height
top_weight
top_heightbottom_heightsb_canvcombinelistr  r   r  r   r
  r  s   ```                    @@@@@@r   rR   zScrollBar.render  s   
 	!	* 	*	- 	- q&4#8#8896BGAJ&"",,
 w 67 =Z;YZZ=//e< 	  [WWiBSUX1YZ\F*,G$77GN//?C 5Fn,FsNSF^$CDL'$e,v5.0%..w>++GU;$v-"3Q1D(DE +,, 1eL6$9:; 3Z#a.0
&</:=>
?zA~Q 56J -
:   !2!2Ha@""4#3#3XqA##D$5$5xC&&@eJ.?@Dl0CD G}1EF
 dD'!*-dE8,

 >1$$[11  +!677r   c                .    t        d| j                        S )zColumns the scrollbar usesr   )r   r  r9   s    r   r   zScrollBar.scrollbar_widthT  s     1d++,,r   c                X    t        dt        |            | _        | j                          y )Nr   )r   r\   r  r   )r:   r   s     r   r   zScrollBar.scrollbar_widthY  s!     #As5z 2r   c                    | j                   S )z9Where to display the scrollbar; must be 'left' or 'right')r  r9   s    r   r   zScrollBar.scrollbar_side^  s     ###r   c                j    |t         t        hvrt        d|      || _        | j	                          y )Nz.scrollbar_side must be "left" or "right", not )r  SCROLLBAR_RIGHTr   r  r   )r:   r   s     r   r   zScrollBar.scrollbar_sidec  s6    88MdXVWW#r   c                j    | }t        |       D ]  }t        |t              s|c S  t        d|      )zCNearest `original_widget` that is compatible with the scrolling APIz+Not compatible to be wrapped by ScrollBar: )ru   r   r   r   )r:   rs   s     r   r  zScrollBar.scrolling_base_widgetj  s@     4 	A!^,	  KA5QRRr   c                N    | j                   j                  | j                  |      S r8   )r   rJ   r   rH   s      r   rJ   zScrollBar.keypressv  s#    
 $$--d.H.H#NNr   c                ^   | j                   }| j                  }d}	t        |d      r|j                  ||||||      }	|	snt        |d      rb|dk(  r2|j	                  |      }
t        |
dz
  d      }|j                  |       y|dk(  r&|j	                  |      }
|j                  |
dz          y|	S )	NFrP   r      r   r   T   )r   r   r   rP   ra   r   r   )r:   rA   rL   rM   rN   rO   rB   r   r   handledr  newposs               r   rP   zScrollBar.mouse_event}  s     "",,$2}%nnWeVS#uMG727{&&w/S1Wa  ({&&w/  q)r   rS   rU   )r   r   r   rZ   r   rZ   r   Literal['left', 'right']r   r\   rT   r   rW   r]   )rT   r\   )r   r   rT   r   )rT   r3  )r   r3  rT   r   )rT   z'SupportsScroll | SupportsRelativeScrollrY   r[   )r   r   r   r   Symbolsr;   r>   r!   r+  r   rR   r^   r   setterr   r  rJ   rP   r   r   s   @r   r   r     sq   G( +55)8,, , 	,
 ', , 
,H a8a8 a8 
	a8F - -   $ $   	S 	SOO O 
	O  	
    
r   r   )rs   r   rT   zIterator[Widget])-
__future__r   r   enumtyping	constantsr   r   r   widget_decorationr   r	   TYPE_CHECKINGcollections.abcr
   typing_extensionsr   r   r   r   r   r   __all__TypeVarr   r   r   r   r   r   r   r   r  r+  rZ   Enumr   runtime_checkableProtocolr6   r   rh   ru   r   r   r   r   r   <module>rC     sE  , #    9 9 <	()- M 6FG-k -
    1sDII 1* P&// P P@ ][&// ] ] Y[&// Y Yr%!-0 r%j	P / Pr   