
    ;OOfwX                     h   d dl mZmZ d dlmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z  G d d ed      e      Z! G d de      Z"d Z#e$dk(  r e#        yy)    )divisionprint_function)Text
WidgetWrapdelegate_to_widget_mixinBOXFLOW)CompositeCanvas)connect_signal)ColumnsOverlay)is_mouse_press)calc_coords)disconnect_signal)python3_repr)WidgetDecoration)ACTIVATEc                   0    e Zd ZdZdZddZd	dZd Zd Zy)
SelectableIconFTc                 H    | j                   j                  |       || _        y)a  
        :param text: markup for this widget; see :class:`Text` for
                     description of text markup
        :param cursor_position: position the cursor will appear in the
                                text when this widget is in focus

        This is a text widget that is selectable.  A cursor
        displayed at a fixed location in the text when in focus.
        This widget has no special handling of keyboard or mouse input.
        N)_SelectableIcon__super__init___cursor_position)selftextcursor_positions      K/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/urwid/wimp.pyr   zSelectableIcon.__init__'   s     	d# /    c                     | j                   j                  ||      }|r!t        |      }| j                  |      |_        |S )a  
        Render the text content of this widget with a cursor when
        in focus.

        >>> si = SelectableIcon(u"[!]")
        >>> si
        <SelectableIcon selectable flow widget '[!]'>
        >>> si.render((4,), focus=True).cursor
        (0, 0)
        >>> si = SelectableIcon("((*))", 2)
        >>> si.render((8,), focus=True).cursor
        (2, 0)
        >>> si.render((2,), focus=True).cursor
        (0, 1)
        )r   renderr
   get_cursor_coordscursor)r   sizefocuscs       r   r    zSelectableIcon.render5   s>      LLe,"A--d3AHr   c                     | j                   t        | j                        kD  ry|\  }| j                  |      }t	        | j                  || j                         \  }}||k  ry||fS )z
        Return the position of the cursor if visible.  This method
        is required for widgets that display a cursor.
        N)r   lenr   get_line_translationr   )r   r#   maxcoltransxys         r   r!   z SelectableIcon.get_cursor_coordsL   se    
   3tyy>1 	))&1499eT-B-BC1Q;!tr   c                     |S )zn
        No keys are handled by this widget.  This method is
        required for selectable widgets.
         r   r#   keys      r   keypresszSelectableIcon.keypress\   s	    
 
r   N)r   F)	__name__
__module____qualname__ignore_focus_selectabler   r    r!   r1   r.   r   r   r   r   $   s     LK0. r   r   c                       e Zd Zy)CheckBoxErrorN)r3   r4   r5   r.   r   r   r9   r9   c   s    r   r9   c                       e Zd Zd Z edd       edd       edd      dZdZdd	gZ	 	 ddZd Z	d Z
d Zd Z ee      ZddZd Z eee      Zd Zd Zd Zy
)CheckBoxc                 "    t        t        g      S N	frozensetr	   r   s    r   sizingzCheckBox.sizingg       $  r   z[X]   z[ ]z[#]TFmixed   change
postchangeNc                    | j                   j                  d       t        d      | _        || _        d| _        |rt        d|z  d      | j                  d<   |rt        | d||       | j                  |       | j                  |       y)a  
        :param label: markup for check box label
        :param state: False, True or "mixed"
        :param has_mixed: True if "mixed" is a state to cycle through
        :param on_state_change: shorthand for connect_signal()
                                function call for a single callback
        :param user_data: user_data for on_state_change

        Signals supported: ``'change'``, ``"postchange"``

        Register signal handler with::

          urwid.connect_signal(check_box, 'change', callback, user_data)

        where callback is callback(check_box, new_state [,user_data])
        Unregister signal handlers with::

          urwid.disconnect_signal(check_box, 'change', callback, user_data)

        >>> CheckBox(u"Confirm")
        <CheckBox selectable flow widget 'Confirm' state=False>
        >>> CheckBox(u"Yogourt", "mixed", True)
        <CheckBox selectable flow widget 'Yogourt' state='mixed'>
        >>> cb = CheckBox(u"Extra onions", True)
        >>> cb
        <CheckBox selectable flow widget 'Extra onions' state=True>
        >>> cb.render((20,), focus=True).text # ... = b in Python 3
        [...'[X] Extra onions    ']
        N z[%s]rC   TrG   )_CheckBox__superr   r   _label	has_mixed_stater   statesr   	set_label	set_state)r   labelstaterM   on_state_change	user_datachecked_symbols          r   r   zCheckBox.__init__u   sw    > 	d#2h" .w/G KDKK 4?IFuur   c                 d    | j                   j                         t        | j                        gz   S r=   )rK   _repr_wordsr   rR   r@   s    r   rX   zCheckBox._repr_words   s-    ||'')$-& & 	&r   c                 `    t        | j                  j                         | j                        S )N)rS   )dictrK   _repr_attrsrS   r@   s    r   r[   zCheckBox._repr_attrs   s%    DLL,,.** 	r   c                 :    | j                   j                  |       y)au  
        Change the check box label.

        label -- markup for label.  See Text widget for description
        of text markup.

        >>> cb = CheckBox(u"foo")
        >>> cb
        <CheckBox selectable flow widget 'foo' state=False>
        >>> cb.set_label(('bright_attr', u"bar"))
        >>> cb
        <CheckBox selectable flow widget 'bar' state=False>
        NrL   set_textr   rR   s     r   rP   zCheckBox.set_label   s     	U#r   c                 .    | j                   j                  S )a>  
        Return label text.

        >>> cb = CheckBox(u"Seriously")
        >>> print(cb.get_label())
        Seriously
        >>> print(cb.label)
        Seriously
        >>> cb.set_label([('bright_attr', u"flashy"), u" normal"])
        >>> print(cb.label)  #  only text is returned
        flashy normal
        rL   r   r@   s    r   	get_labelzCheckBox.get_label   s     {{r   c                    | j                   |k(  ry|| j                  vr"t        t        |       dt        |            | j                   }|r|| j	                  d|       || _         t        d| j                  | j                  |   f| j                  g      | _        d| j                  _	        |r|| j	                  d|       yyy)a  
        Set the CheckBox state.

        state -- True, False or "mixed"
        do_callback -- False to suppress signal from this change

        >>> changes = []
        >>> def callback_a(cb, state, user_data):
        ...     changes.append("A %r %r" % (state, user_data))
        >>> def callback_b(cb, state):
        ...     changes.append("B %r" % state)
        >>> cb = CheckBox('test', False, False)
        >>> key1 = connect_signal(cb, 'change', callback_a, "user_a")
        >>> key2 = connect_signal(cb, 'change', callback_b)
        >>> cb.set_state(True) # both callbacks will be triggered
        >>> cb.state
        True
        >>> disconnect_signal(cb, 'change', callback_a, "user_a")
        >>> cb.state = False
        >>> cb.state
        False
        >>> cb.set_state(True)
        >>> cb.state
        True
        >>> cb.set_state(False, False) # don't send signal
        >>> changes
        ["A True 'user_a'", 'B True', 'B False', 'B True']
        Nz Invalid state: rG   fixedr   rH   )
rN   rO   r9   repr_emitr   reserve_columnsrL   _w	focus_col)r   rS   do_callback	old_states       r   rQ   zCheckBox.set_state   s    : ;;%#T
DK!) * *
 KK	90JJx'd**DKK,>@KK  90JJ|Y/ 1;r   c                     | j                   S )z!Return the state of the checkbox.)rN   r@   s    r   	get_statezCheckBox.get_state   s    {{r   c                 T    | j                   |   t        k7  r|S | j                          y)a  
        Toggle state on 'activate' command.

        >>> assert CheckBox._command_map[' '] == 'activate'
        >>> assert CheckBox._command_map['enter'] == 'activate'
        >>> size = (10,)
        >>> cb = CheckBox('press me')
        >>> cb.state
        False
        >>> cb.keypress(size, ' ')
        >>> cb.state
        True
        >>> cb.keypress(size, ' ')
        >>> cb.state
        False
        N)_command_mapr   toggle_stater/   s      r   r1   zCheckBox.keypress  s(    " S!X-Jr   c                    | j                   dk(  r| j                  d       y| j                   dk(  r0| j                  r| j                  d       y| j                  d       y| j                   dk(  r| j                  d       yy)aM  
        Cycle to the next valid state.

        >>> cb = CheckBox("3-state", has_mixed=True)
        >>> cb.state
        False
        >>> cb.toggle_state()
        >>> cb.state
        True
        >>> cb.toggle_state()
        >>> cb.state
        'mixed'
        >>> cb.toggle_state()
        >>> cb.state
        False
        FTrE   N)rS   rQ   rM   r@   s    r   rp   zCheckBox.toggle_state  sd    " ::NN4 ZZ4~~w'u%ZZ7"NN5! #r   c                 F    |dk7  st        |      sy| j                          y)a  
        Toggle state on button 1 press.

        >>> size = (20,)
        >>> cb = CheckBox("clickme")
        >>> cb.state
        False
        >>> cb.mouse_event(size, 'mouse press', 1, 2, 0, True)
        True
        >>> cb.state
        True
        rC   FT)r   rp   r   r#   eventbuttonr+   r,   r$   s          r   mouse_eventzCheckBox.mouse_event3  s$     Q;nU3r   )FFNNNT)r3   r4   r5   rA   r   rO   rg   signalsr   rX   r[   rP   rb   propertyrR   rQ   rm   rS   r1   rp   rv   r.   r   r   r;   r;   f   s    ! UA&eQ'q),F O
 &G5:BF*X&$$  YE00d Y	*E,"6r   r;   c                   `    e Zd Z edd       edd       edd      dZdZ	 	 ddZdd	Zd
 Zy)RadioButtonz(X)rC   z( )z(#)rD   rF   Nc                     |dk(  r| }|| _         | j                  j                  ||d||       |j                  |        y)a  
        :param group: list for radio buttons in same group
        :param label: markup for radio button label
        :param state: False, True, "mixed" or "first True"
        :param on_state_change: shorthand for connect_signal()
                                function call for a single 'change' callback
        :param user_data: user_data for on_state_change

        This function will append the new radio button to group.
        "first True" will set to True if group is empty.

        Signals supported: ``'change'``, ``"postchange"``

        Register signal handler with::

          urwid.connect_signal(radio_button, 'change', callback, user_data)

        where callback is callback(radio_button, new_state [,user_data])
        Unregister signal handlers with::

          urwid.disconnect_signal(radio_button, 'change', callback, user_data)

        >>> bgroup = [] # button group
        >>> b1 = RadioButton(bgroup, u"Agree")
        >>> b2 = RadioButton(bgroup, u"Disagree")
        >>> len(bgroup)
        2
        >>> b1
        <RadioButton selectable flow widget 'Agree' state=True>
        >>> b2
        <RadioButton selectable flow widget 'Disagree' state=False>
        >>> b2.render((15,), focus=True).text # ... = b in Python 3
        [...'( ) Disagree   ']
        
first TrueFN)group_RadioButton__superr   append)r   r~   rR   rS   rT   rU   s         r   r   zRadioButton.__init__M  sD    H ,IE
eUE?	Tr   c                     | j                   |k(  ry| j                  j                  ||       |dury| j                  D ]%  }|| u r|j                   s|j                  d       ' y)a  
        Set the RadioButton state.

        state -- True, False or "mixed"

        do_callback -- False to suppress signal from this change

        If state is True all other radio buttons in the same button
        group will be set to False.

        >>> bgroup = [] # button group
        >>> b1 = RadioButton(bgroup, u"Agree")
        >>> b2 = RadioButton(bgroup, u"Disagree")
        >>> b3 = RadioButton(bgroup, u"Unsure")
        >>> b1.state, b2.state, b3.state
        (True, False, False)
        >>> b2.set_state(True)
        >>> b1.state, b2.state, b3.state
        (False, True, False)
        >>> def relabel_button(radio_button, new_state):
        ...     radio_button.set_label(u"Think Harder!")
        >>> key = connect_signal(b3, 'change', relabel_button)
        >>> b3
        <RadioButton selectable flow widget 'Unsure' state=False>
        >>> b3.set_state(True) # this will trigger the callback
        >>> b3
        <RadioButton selectable flow widget 'Think Harder!' state=True>
        NTF)rN   r   rQ   r~   )r   rS   rj   cbs       r   rQ   zRadioButton.set_state{  se    : ;;%uk2  ** 	$BTz8yyU#	$r   c                 &    | j                  d       y)a  
        Set state to True.

        >>> bgroup = [] # button group
        >>> b1 = RadioButton(bgroup, "Agree")
        >>> b2 = RadioButton(bgroup, "Disagree")
        >>> b1.state, b2.state
        (True, False)
        >>> b2.toggle_state()
        >>> b1.state, b2.state
        (False, True)
        >>> b2.toggle_state()
        >>> b1.state, b2.state
        (False, True)
        TN)rQ   r@   s    r   rp   zRadioButton.toggle_state  s      	tr   )r}   NNrw   )	r3   r4   r5   r   rO   rg   r   rQ   rp   r.   r   r   r{   r{   F  sE    UA&eQ'q),F O+7-1*\+$\r   r{   c                   n    e Zd Zd Z ed      Z ed      ZdgZddZd Z	d Z
d	 Z ee      Zd
 Zd Zy)Buttonc                 "    t        t        g      S r=   r>   r@   s    r   rA   zButton.sizing  rB   r   <>clickNc                    t        dd      | _        t        dd| j                  f| j                  dd| j                  fgd      }| j
                  j                  |       |rt        | d||       | j                  |       y)a  
        :param label: markup for button label
        :param on_press: shorthand for connect_signal()
                         function call for a single callback
        :param user_data: user_data for on_press

        Signals supported: ``'click'``

        Register signal handler with::

          urwid.connect_signal(button, 'click', callback, user_data)

        where callback is callback(button [,user_data])
        Unregister signal handlers with::

          urwid.disconnect_signal(button, 'click', callback, user_data)

        >>> Button(u"Ok")
        <Button selectable flow widget 'Ok'>
        >>> b = Button("Cancel")
        >>> b.render((15,), focus=True).text # ... = b in Python 3
        [...'< Cancel      >']
        rJ   r   rd   rC   )dividecharsr   N)	r   rL   r   button_leftbutton_right_Button__superr   r   rP   )r   rR   on_pressrU   colss        r   r   zButton.__init__  s    0 %R+a))*KKa**+- 	
 	d# 4(I>ur   c                 d    | j                   j                         t        | j                        gz   S r=   )r   rX   r   rR   r@   s    r   rX   zButton._repr_words  s-    ||'')$-& & 	&r   c                 :    | j                   j                  |       y)z
        Change the button label.

        label -- markup for button label

        >>> b = Button("Ok")
        >>> b.set_label(u"Yup yup")
        >>> b
        <Button selectable flow widget 'Yup yup'>
        Nr]   r_   s     r   rP   zButton.set_label  s     	U#r   c                 .    | j                   j                  S )z
        Return label text.

        >>> b = Button(u"Ok")
        >>> print(b.get_label())
        Ok
        >>> print(b.label)
        Ok
        ra   r@   s    r   rb   zButton.get_label  s     {{r   c                 V    | j                   |   t        k7  r|S | j                  d       y)aD  
        Send 'click' signal on 'activate' command.

        >>> assert Button._command_map[' '] == 'activate'
        >>> assert Button._command_map['enter'] == 'activate'
        >>> size = (15,)
        >>> b = Button(u"Cancel")
        >>> clicked_buttons = []
        >>> def handle_click(button):
        ...     clicked_buttons.append(button.label)
        >>> key = connect_signal(b, 'click', handle_click)
        >>> b.keypress(size, 'enter')
        >>> b.keypress(size, ' ')
        >>> clicked_buttons # ... = u in Python 2
        [...'Cancel', ...'Cancel']
        r   N)ro   r   rf   r/   s      r   r1   zButton.keypress  s(    " S!X-J

7r   c                 H    |dk7  st        |      sy| j                  d       y)a  
        Send 'click' signal on button 1 press.

        >>> size = (15,)
        >>> b = Button(u"Ok")
        >>> clicked_buttons = []
        >>> def handle_click(button):
        ...     clicked_buttons.append(button.label)
        >>> key = connect_signal(b, 'click', handle_click)
        >>> b.mouse_event(size, 'mouse press', 1, 4, 0, True)
        True
        >>> b.mouse_event(size, 'mouse press', 2, 4, 0, True) # ignored
        False
        >>> clicked_buttons # ... = u in Python 2
        [...'Ok']
        rC   Fr   T)r   rf   rs   s          r   rv   zButton.mouse_event!  s$    " Q;nU3

7r   )NN)r3   r4   r5   rA   r   r   r   rx   r   rX   rP   rb   ry   rR   r1   rv   r.   r   r   r   r     sM    ! s)K9LiG%N&
$
  YE,r   r   c                   2    e Zd Zd Zd Zd Zd Zd ZddZy)	PopUpLauncherc                 H    | j                   j                  |       d | _        y r=   )_PopUpLauncher__superr   _pop_up_widgetr   original_widgets     r   r   zPopUpLauncher.__init__;  s    o."r   c                     t        d      )z
        Subclass must override this method and return a widget
        to be used for the pop-up.  This method is called once each time
        the pop-up is opened.
        "Subclass must override this methodNotImplementedErrorr@   s    r   create_pop_upzPopUpLauncher.create_pop_up?  s     ""FGGr   c                     t        d      )z
        Subclass must override this method and have it return a dict, eg:

        {'left':0, 'top':1, 'overlay_width':30, 'overlay_height':4}

        This method is called each time this widget is rendered.
        r   r   r@   s    r   get_pop_up_parametersz#PopUpLauncher.get_pop_up_parametersG  s     ""FGGr   c                 N    | j                         | _        | j                          y r=   )r   r   _invalidater@   s    r   open_pop_upzPopUpLauncher.open_pop_upQ  s    "002r   c                 2    d | _         | j                          y r=   )r   r   r@   s    r   close_pop_upzPopUpLauncher.close_pop_upU  s    "r   c                     | j                   j                  ||      }| j                  r6t        |      } |j                  | j                  fi | j                          |S r=   )r   r    r   r
   
set_pop_upr   )r   r#   r$   canvs       r   r    zPopUpLauncher.renderY  sR    ||""4/"4(DDOOD//P43M3M3OPr   Nr2   )	r3   r4   r5   r   r   r   r   r   r    r.   r   r   r   r   9  s"    #HHr   r   _original_widgetc                   \    e Zd Z eeg      ZdZd Zd ZddZ	d Z
d Zd Zd Zd	 ZddZy
)PopUpTargetTc                 j    | j                   j                  |       d | _        | j                  | _        y r=   )_PopUpTarget__superr   _pop_upr   _current_widgetr   s     r   r   zPopUpTarget.__init__g  s)    o.#44r   c                 n   | j                   j                  ||      }|| _        |j                         }|rg|\  }}\  }}}	| j                  |k7  r+|| _        t        || j                   d|f|d|f|	      | _        y | j                  j                  d|f|d|f|	       y d | _        | j                   | _        y )Nr$   z
fixed leftz	fixed top)r   r    _cache_original_canvas
get_pop_upr   r   r   set_overlay_parameters)
r   r#   r$   r   pop_uplefttopwoverlay_widthoverlay_heights
             r   _update_overlayzPopUpTarget._update_overlayl  s    $$++D+>&*#"4:2D# 2=.||q  '.q$2G2G!4(- #&(8$ $$;;!4(- #&8  DL#'#8#8D r   c                 `    | j                  ||       | j                  j                  ||      S )Nr   )r   r   r    r   r#   r$   s      r   r    zPopUpTarget.render  s.    T5)##**4u*==r   c                 \    | j                  |d       | j                  j                  |      S NT)r   r   r!   r   r#   s     r   r!   zPopUpTarget.get_cursor_coords  s)    T4(##55d;;r   c                 \    | j                  |d       | j                  j                  |      S r   )r   r   get_pref_colr   s     r   r   zPopUpTarget.get_pref_col  s)    T4(##0066r   c                 ^    | j                  |d       | j                  j                  ||      S r   )r   r   r1   r/   s      r   r1   zPopUpTarget.keypress  s+    T4(##,,T377r   c                 `    | j                  |d       | j                  j                  |||      S r   )r   r   move_cursor_to_coords)r   r#   r+   r,   s       r   r   z!PopUpTarget.move_cursor_to_coords  s-    T4(##99$1EEr   c                 f    | j                  ||       | j                  j                  ||||||      S r=   )r   r   rv   rs   s          r   rv   zPopUpTarget.mouse_event  s3    T5)##//eVQ5QQr   Nc                 \    | j                  ||       | j                  j                  |      S r=   )r   r   packr   s      r   r   zPopUpTarget.pack  s)    T5)##((..r   r2   )NF)r3   r4   r5   setr   _sizingr7   r   r   r    r!   r   r1   r   rv   r   r.   r   r   r   r   a  sC     3%jGK5
9(><78FR/r   r   c                  ,    dd l } | j                          y )Nr   )doctesttestmod)r   s    r   _testr     s    OOr   __main__N)%
__future__r   r   urwid.widgetr   r   r   r   r	   urwid.canvasr
   urwid.signalsr   urwid.containerr   r   
urwid.utilr   urwid.text_layoutr   r   urwid.split_reprr   urwid.decorationr   urwid.command_mapr   r   	Exceptionr9   r;   r{   r   r   r   r   r3   r.   r   r   <module>r      s   , 0
 
 ( ( , % ) + ) - &=T =~	I 	]z ]@s( slzZ zz%,-?@%P3/" 3/t Z	G r   