
    ;OOf+                     f    d dl mZ d dlmZ d dlZ G d de      Z G d de      Z G d d	e      Zy)
    )Edit)DecimalNc                   4     e Zd ZdZdZd fd	Zd Z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
    $0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZc                 J    t         t        |   ||       || _        || _        y )N)superr   __init___allowedtrimLeadingZeros)selfallowedcaptiondefaultr   	__class__s        N/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/urwid/numedit.pyr
   zNumEdit.__init__(   s#    gt%gw7 0    c                 Z    t        |      dk(  xr |j                         | j                  v S )z5
        Return true for allowed characters.
           )lenupperr   )r   chs     r   
valid_charzNumEdit.valid_char-   s&     2w!|;
dmm ;;r   c                 X   |\  }t        j                  | |f|      }|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 )aC  
        Handle editing keystrokes.  Remove leading zeros.

        >>> e, size = NumEdit("0123456789", u"", "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", u"", ""), (10,)
        >>> assert e.edit_text == ""
        >>> e.keypress(size, '1')
        >>> e.keypress(size, '0')
        >>> e.keypress(size, '1')
        >>> assert e.edit_text == "101"
        r   Nr   0)r   keypressr   edit_pos	edit_textset_edit_posset_edit_text)r   sizekeymaxcol	unhandleds        r   r   zNumEdit.keypress3   s    $ 	MM$	37	$$mma'DNN2A,>#,E%%dmma&78&&t~~ab'9: mma'DNN2A,>#,E r   )T)	__name__
__module____qualname____doc__ALLOWEDr
   r   r   __classcell__r   s   @r   r   r      s     5G1
<r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )IntegerEditzEdit widget for integer valuesc                 D   || _         d}| j                  d| j                    }|t        |t        t        t
        f      st        d      t        |t              ret        |      rZdj                  |      }t        j                  |t	        |      t        j                        sLt        dj                  ||            t        |t
              r!|j                         d   dk7  rt        d      t	        |      }t        t        | ?  |||| j                   d	k(  
       y)a  
        caption -- caption markup
        default -- default edit value

        >>> IntegerEdit(u"", 42)
        <IntegerEdit selectable flow widget '42' edit_pos=2>
        >>> e, size = IntegerEdit(u"", "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(u"", "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(u"", "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(u"", "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 incompatable value for base
        >>> e, size = IntegerEdit(u"", "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(u"", 10.0), (10,)
        Traceback (most recent call last):
            ...
        ValueError: default: Only 'str', 'int', 'long' or Decimal input allowed
        >>> e, size = IntegerEdit(u"", Decimal("10.0")), (10,)
        Traceback (most recent call last):
            ...
        ValueError: not an 'integer Decimal' instance
         N;default: Only 'str', 'int', 'long' or Decimal input allowedz^[{}]+$zinvalid value: {} for base {}   r   z!not an 'integer Decimal' instance
   )r   )baser)   
isinstanceintstrr   
ValueErrorr   formatrematch
IGNORECASEas_tupler	   r-   r
   )r   r   r   r3   valallowed_charsvalidation_rer   s          r   r
   zIntegerEdit.__init__U   s   n 	Zdii0gS'':;  "C D D
 '3'CL ) 0 0 ?xxs7|R]]K$%D%K%K%,d&4 5 5 GW-##%a(A-$%HII g,Ck4)-#<@IIO 	* 	N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   r5   r3   )r   s    r   valuezIntegerEdit.value   s(     >>3t~~tyy9::r   )r/   Nr2   r%   r&   r'   r(   r
   rA   r*   r+   s   @r   r-   r-   R   s    (QNfr   r-   c                   .     e Zd ZdZ	 	 d fd	Zd Z xZS )	FloatEditzEdit widget for float values.c                    d| _         || _        |dvrt        dj                  |            d}||dk7  rt	        |t
        t        t        f      st        d      t	        |t              r!t        |      rt        |       t        |      }|r!t        |j                         d         | _         t        |      }t        t        | ;  | j                  dd |z   ||       y)	a  
        caption -- caption markup
        default -- default edit value
        preserveSignificance -- return value has the same signif. as default
        decimalSeparator -- use '.' as separator by default, optionally a ','

        >>> FloatEdit(u"",  "1.065434")
        <FloatEdit selectable flow widget '1.065434' edit_pos=8>
        >>> e, size = FloatEdit(u"", "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, size = FloatEdit(decimalSeparator=":"), (10,)
        Traceback (most recent call last):
            ...
        ValueError: invalid decimalSeparator: :
        >>> e, size = FloatEdit(decimalSeparator=","), (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", preserveSignificance=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, size = FloatEdit("", ""), (10,)
        >>> assert e.value() is None
        >>> e, size = FloatEdit(u"", 10.0), (10,)
        Traceback (most recent call last):
            ...
        ValueError: default: Only 'str', 'int', 'long' or Decimal input allowed
        N).,zinvalid decimalSeparator: {}r/   r0   r1   r   r2   )significance_decimalSeparatorr7   r8   r4   r5   r6   r   r   floatabsr<   r	   rD   r
   r)   )r   r   r   preserveSignificancedecimalSeparatorr=   r   s         r   r
   zFloatEdit.__init__   s    h !!1:-;BB-/ 0 0 7b=gS'':;  "C D D '3'CLg!'*#$'(8(8(:1(=$>!g,Ci'Qr(:=M(M(/	6r   c                     | j                   rd}| j                  rdj                  | j                        }| j                   j                  | j                        D cg c]  }| c}dgz   dd \  }}| j                  ret        t        |            | j                  kD  rDt        |      dt        t        |            | j                  z
  z  z  }t        t        |            }t        |j                  |t        |                  S yc c}w )	z=
        Return the numeric value of self.edit_text.
        z	{ip}.{fp}z{{ip}}.{{fp:<0{sig}d}})sigr   r1   r2   )ipfpN)r   rH   r8   splitrI   r   r6   rJ   r5   roundr   )r   fmtvrP   rQ   s        r   rA   zFloatEdit.value  s     >>C   /55$:K:K5L nn**4+A+ABDQq DGHcJKLQPFB   SR\D4E4E%E2Yc#b'lT5F5F&F!GGr^3::B:899Ds   	D)r/   NTrF   rB   r+   s   @r   rD   rD      s    '+/=@K6Zr   rD   )urwidr   decimalr   r9   r   r-   rD    r   r   <module>rY      s:   .   	3d 3lb' bJg gr   