
    jj34                        d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 erd dl
mZ  G d de	      Z G d	 d
e      Z G d de      Zy)    )annotationsN)Decimal)TYPE_CHECKING)Edit)	Containerc                  f     e Zd ZdZdZ	 d	ddd	 	 	 	 	 	 	 	 	 d
 fdZddZ	 	 	 	 	 	 d fdZ xZS )NumEdita  NumEdit - edit numerical types

    based on the characters in 'allowed' different numerical types
    can be edited:
      + regular int: 0123456789
      + regular float: 0123456789.
      + regular oct: 01234567
      + regular hex: 0123456789abcdef
    $0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZTFtrim_leading_zerosallow_negativec                   t         |   ||       || _        || _        || _        |$t        j                  dt        d       || _        y y )NzT'trimLeadingZeros' argument is deprecated. Use 'trim_leading_zeros' keyword argument   
stacklevel)super__init___allowed_trim_leading_zeros_allow_negativewarningswarnDeprecationWarning)selfallowedcaptiondefaulttrimLeadingZerosr   r   	__class__s          V/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/urwid/numedit.pyr   zNumEdit.__init__0   sU     	'*#5 -'MMf"
 (8D$ (    c                    t        |      dk(  rQ|j                         | j                  v ry| j                  xr& |dk(  xr | j                  dk(  xr d| j
                  vS y)z5
        Return true for allowed characters.
           T-r   F)lenupperr   r   edit_pos	edit_text)r   chs     r    
valid_charzNumEdit.valid_charG   s\     r7a<xxzT]]*''jB#Ij$--1:LjQT\`\j\jQjjr!   c                B   t         |   ||      }|s| j                  r| j                  dkD  rp| j                  dd dk(  r^| j                  | j                  dz
         | j                  | j                  dd        | j                  dkD  r| j                  dd dk(  r^|S )a  
        Handle editing keystrokes.  Remove leading zeros.

        >>> e, size = NumEdit("0123456789", "", "5002"), (10,)
        >>> e.keypress(size, "home")
        >>> e.keypress(size, "delete")
        >>> assert e.edit_text == "002"
        >>> e.keypress(size, "end")
        >>> assert e.edit_text == "2"
        >>> # binary only
        >>> e, size = NumEdit("01", "", ""), (10,)
        >>> assert e.edit_text == ""
        >>> e.keypress(size, "1")
        >>> e.keypress(size, "0")
        >>> e.keypress(size, "1")
        >>> assert e.edit_text == "101"
        >>> e, size = NumEdit("0123456789", "", "", allow_negative=True), (10,)
        >>> e.keypress(size, "-")
        >>> e.keypress(size, "1")
        >>> e.edit_text
        '-1'
        >>> e.keypress(size, "home")
        >>> e.keypress(size, "delete")
        >>> e.edit_text
        '1'
        >>> e.keypress(size, "end")
        >>> e.keypress(size, "-")
        '-'
        >>> e.edit_text
        '1'
        r   Nr#   0)r   keypressr   r'   r(   set_edit_posset_edit_text)r   sizekey	unhandledr   s       r    r-   zNumEdit.keypressR   s    H G$T3/	T55--!#r(:c(A!!$--!"34""4>>!"#56 --!#r(:c(A r!   )N)
r   zContainer[str]r   zstr | bytesr   bool | Noner   boolr   r4   )r)   strreturnr4   )r0   z
tuple[int]r1   r5   r6   
str | None)	__name__
__module____qualname____doc__ALLOWEDr   r*   r-   __classcell__r   s   @r    r	   r	   #   s     5G )-8 $($88 	8
 &8 !8 8.	,, , 
	, ,r!   r	   c                  P     e Zd ZdZ	 	 	 ddd	 	 	 	 	 	 	 d fdZd	dZd
dZ xZS )IntegerEditzEdit widget for integer valuesFr   c                  || _         d}| j                  d| j                    }|t        |t        t        t
        f      st        d      t        |t              rPt        |      rEd| d}t        j                  |t	        |      t        j                        sBt        d| d|       t        |t
              r!|j                         d   d	k7  rt        d
      t	        |      }t        | 5  |||| j                   dk(  |       y)a  
        caption -- caption markup
        default -- default edit value

        >>> IntegerEdit("", 42)
        <IntegerEdit selectable flow widget '42' edit_pos=2>
        >>> e, size = IntegerEdit("", "5002"), (10,)
        >>> e.keypress(size, "home")
        >>> e.keypress(size, "delete")
        >>> assert e.edit_text == "002"
        >>> e.keypress(size, "end")
        >>> assert e.edit_text == "2"
        >>> e.keypress(size, "9")
        >>> e.keypress(size, "0")
        >>> assert e.edit_text == "290"
        >>> e, size = IntegerEdit("", ""), (10,)
        >>> assert e.value() is None
        >>> # binary
        >>> e, size = IntegerEdit("", "1010", base=2), (10,)
        >>> e.keypress(size, "end")
        >>> e.keypress(size, "1")
        >>> assert e.edit_text == "10101"
        >>> assert e.value() == Decimal("21")
        >>> # HEX
        >>> e, size = IntegerEdit("", "10", base=16), (10,)
        >>> e.keypress(size, "end")
        >>> e.keypress(size, "F")
        >>> e.keypress(size, "f")
        >>> assert e.edit_text == "10Ff"
        >>> assert e.keypress(size, "G") == "G"  # unhandled key
        >>> assert e.edit_text == "10Ff"
        >>> # keep leading 0's when not base 10
        >>> e, size = IntegerEdit("", "10FF", base=16), (10,)
        >>> assert e.edit_text == "10FF"
        >>> assert e.value() == Decimal("4351")
        >>> e.keypress(size, "home")
        >>> e.keypress(size, "delete")
        >>> e.keypress(size, "0")
        >>> assert e.edit_text == "00FF"
        >>> # test exception on incompatible value for base
        >>> e, size = IntegerEdit("", "10FG", base=16), (10,)
        Traceback (most recent call last):
            ...
        ValueError: invalid value: 10FG for base 16
        >>> # test exception on float init value
        >>> e, size = IntegerEdit("", 10.0), (10,)
        Traceback (most recent call last):
            ...
        ValueError: default: Only 'str', 'int', 'long' or Decimal input allowed
        >>> e, size = IntegerEdit("", Decimal("10.0")), (10,)
        Traceback (most recent call last):
            ...
        ValueError: not an 'integer Decimal' instance
         N3default: Only 'str', 'int' or Decimal input allowedz^[z]+$zinvalid value: z
 for base    r   z!not an 'integer Decimal' instance
   r   )baser<   
isinstanceintr5   r   
ValueErrorr%   rematch
IGNORECASEas_tupler   r   )	r   r   r   rG   r   valallowed_charsvalidation_rer   s	           r    r   zIntegerEdit.__init__   s    | 	[tyy1gS'':; !VWW '3'CL"$]O3 7xxs7|R]]K$wiz$%PQQGW-'2B2B2DQ2G12L !DEE g,C $		R) 	 	
r!   c                n    | j                   r)t        t        | j                   | j                              S y)z
        Return the numeric value of self.edit_text.

        >>> e, size = IntegerEdit(), (10,)
        >>> e.keypress(size, "5")
        >>> e.keypress(size, "1")
        >>> assert e.value() == 51
        N)r(   r   rI   rG   r   s    r    valuezIntegerEdit.value   s(     >>3t~~tyy9::r!   c                \    | j                   r t        | j                   | j                        S y)a  Enforced int value return.

        >>> e, size = IntegerEdit(allow_negative=True), (10,)
        >>> assert int(e) == 0
        >>> e.keypress(size, "-")
        >>> e.keypress(size, "4")
        >>> e.keypress(size, "2")
        >>> assert int(e) == -42
        r   )r(   rI   rG   rS   s    r    __int__zIntegerEdit.__int__   s#     >>t~~tyy11r!   )rC   NrF   )r   zint | str | Decimal | NonerG   rI   r   r4   r6   Noner6   zDecimal | None)r6   rI   )r8   r9   r:   r;   r   rT   rV   r=   r>   s   @r    r@   r@      sY    ( .2	Z
  %Z
 ,Z
 	Z
 Z
 
Z
xr!   r@   c                  b     e Zd ZdZ	 	 	 	 d	dddd	 	 	 	 	 	 	 	 	 	 	 	 	 d
 fdZddZddZ xZS )	FloatEditzEdit widget for float values.T.F)preserve_significancedecimal_separatorr   c               H   d| _         || _        |#t        j                  dt        d       || _        | j                  dvrt        d| j                         |t        j                  dt        d       |}d}|w|dk7  rrt        |t        t        t        f      st        d	      t        |t              r|rt        |       t        |      }|rt        |t              r|| _         t        |      }t        	| 1  | j                  d
d | j                  z   |||       y)a   
        caption -- caption markup
        default -- default edit value
        preserve_significance -- return value has the same signif. as default
        decimal_separator -- use '.' as separator by default, optionally a ','

        >>> FloatEdit("", "1.065434")
        <FloatEdit selectable flow widget '1.065434' edit_pos=8>
        >>> e, size = FloatEdit("", "1.065434"), (10,)
        >>> e.keypress(size, "home")
        >>> e.keypress(size, "delete")
        >>> assert e.edit_text == ".065434"
        >>> e.keypress(size, "end")
        >>> e.keypress(size, "backspace")
        >>> assert e.edit_text == ".06543"
        >>> e, size = FloatEdit(), (10,)
        >>> e.keypress(size, "5")
        >>> e.keypress(size, "1")
        >>> e.keypress(size, ".")
        >>> e.keypress(size, "5")
        >>> e.keypress(size, "1")
        >>> assert e.value() == Decimal("51.51"), e.value()
        >>> e, size = FloatEdit(decimal_separator=":"), (10,)
        Traceback (most recent call last):
            ...
        ValueError: invalid decimal separator: :
        >>> e, size = FloatEdit(decimal_separator=","), (10,)
        >>> e.keypress(size, "5")
        >>> e.keypress(size, "1")
        >>> e.keypress(size, ",")
        >>> e.keypress(size, "5")
        >>> e.keypress(size, "1")
        >>> assert e.edit_text == "51,51"
        >>> e, size = FloatEdit("", "3.1415", preserve_significance=True), (10,)
        >>> e.keypress(size, "end")
        >>> e.keypress(size, "backspace")
        >>> e.keypress(size, "backspace")
        >>> assert e.edit_text == "3.14"
        >>> assert e.value() == Decimal("3.1400")
        >>> e.keypress(size, "1")
        >>> e.keypress(size, "5")
        >>> e.keypress(size, "9")
        >>> assert e.value() == Decimal("3.1416"), e.value()
        >>> e, size = FloatEdit("", ""), (10,)
        >>> assert e.value() is None
        >>> e, size = FloatEdit("", 10.0), (10,)
        Traceback (most recent call last):
            ...
        ValueError: default: Only 'str', 'int', 'long' or Decimal input allowed
        NzS'decimalSeparator' argument is deprecated. Use 'decimal_separator' keyword argumentr   r   >   ,r[   zinvalid decimal separator: z['preserveSignificance' argument is deprecated. Use 'preserve_significance' keyword argumentrC   rD   r   rF   rA   )significance_decimal_separatorr   r   r   rJ   rH   rI   r5   r   floatr   r   r<   )
r   r   r   preserveSignificancedecimalSeparatorr\   r]   r   rO   r   s
            r    r   zFloatEdit.__init__   s   z !"3'MMe"
 '7D#""*4:4;R;R:STUU+MMm"
 %9!7b=gS'':; !VWW'3'Gg!'*$GW)E$+!g,Ca+d.E.EEwPSdrsr!   c                    | j                   rXt        | j                   j                  | j                  d            }| j                  |j                  | j                        S |S y)z=
        Return the numeric value of self.edit_text.
        r[   N)r(   r   replacera   r`   quantize)r   
normalizeds     r    rT   zFloatEdit.valuec  sY     >> !7!78O8OQT!UVJ  ,!**4+<+<==r!   c                z    | j                   r/t        | j                   j                  | j                  d            S y)a1  Enforced float value return.

        >>> e, size = FloatEdit(allow_negative=True), (10,)
        >>> assert float(e) == 0.0
        >>> e.keypress(size, "-")
        >>> e.keypress(size, "4")
        >>> e.keypress(size, ".")
        >>> e.keypress(size, "2")
        >>> assert float(e) == -4.2
        r[   g        )r(   rb   rf   ra   rS   s    r    	__float__zFloatEdit.__float__o  s0     >>//0G0GMNNr!   )rC   NNN)r   zstr | int | Decimal | Nonerc   r3   rd   r7   r\   r4   r]   r5   r   r4   r6   rW   rX   )r6   rb   )r8   r9   r:   r;   r   rT   rj   r=   r>   s   @r    rZ   rZ      s    ' .2,0'+at '+!$$at ,at *	at
 %at  $at at at 
atF
r!   rZ   )
__future__r   rK   r   decimalr   typingr   urwidr   collections.abcr   r	   r@   rZ    r!   r    <module>rq      sK   , # 	     )[d [|y' yx r!   