grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a BjŒjÅUã@s.ddlmZmZddlmZmZmZmZmZddl m Z ddl m Z ddl mZmZddlmZddlmZddl mZdd lmZdd lmZdd lmZGd d „d eƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZ Gdd„dedƒeƒZ!Gdd„deƒZ"dd„Z#e$dk�r*e#ƒdS)é)Ú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@s8eZdZdZdZd dd„Zddd„Zdd „Zd d „Zd S)ÚSelectableIconFTrcCs|j |¡||_dS)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ÚtextZcursor_position©rú0/usr/lib64/python3.9/site-packages/urwid/wimp.pyr&s zSelectableIcon.__init__cCs*|j ||¡}|r&t|ƒ}| |¡|_|S)a± Render the text content of this widget with a cursor when in focus. >>> si = SelectableIcon(u"[!]") >>> si >>> 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_coordsZcursor)rÚsizeÚfocusÚcrrrr4s  zSelectableIcon.rendercCsL|jt|jƒkrdS|\}| |¡}t|j||jƒ\}}||krDdS||fS)zƒ Return the position of the cursor if visible. This method is required for widgets that display a cursor. N)rÚlenrZget_line_translationr)rrZmaxcolZtransÚxÚyrrrrKs z SelectableIcon.get_cursor_coordscCs|S)zn No keys are handled by this widget. This method is required for selectable widgets. r©rrÚkeyrrrÚkeypress[szSelectableIcon.keypressN)r)F) Ú__name__Ú __module__Ú __qualname__Z ignore_focusÚ _selectablerrrr%rrrrr#s   rc@s eZdZdS)Ú CheckBoxErrorN)r&r'r(rrrrr*bsr*c@s¤eZdZdd„ZeddƒeddƒeddƒdœZdZd d gZd"d d„Zdd„Z dd„Z dd„Z dd„Z e e ƒZd#dd„Zdd„Ze eeƒZdd„Zdd„Zd d!„Zd S)$ÚCheckBoxcCs ttgƒS©N©Ú frozensetr©rrrrÚsizingfszCheckBox.sizingz[X]éz[ ]z[#]©TFÚmixedéÚchangeÚ postchangeFNcCsd|j d¡tdƒ|_||_d|_|r:td|dƒ|jd<|rLt|d||ƒ|  |¡|  |¡dS)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(u"Yogourt", "mixed", True) >>> cb = CheckBox(u"Extra onions", True) >>> cb >>> cb.render((20,), focus=True).text # ... = b in Python 3 [...'[X] Extra onions '] NÚz[%s]r1Tr5) Ú_CheckBox__superrrÚ_labelÚ has_mixedÚ_staterÚstatesr Ú set_labelÚ set_state)rÚlabelÚstater:Úon_state_changeÚ user_dataZchecked_symbolrrrrts   zCheckBox.__init__cCs|j ¡t|jƒgSr,)r8Ú _repr_wordsrr?r/rrrrC sÿzCheckBox._repr_wordscCst|j ¡|jd�S)N)r@)Údictr8Ú _repr_attrsr@r/rrrrE¤s ÿzCheckBox._repr_attrscCs|j |¡dS)au Change the check box label. label -- markup for label. See Text widget for description of text markup. >>> cb = CheckBox(u"foo") >>> cb >>> cb.set_label(('bright_attr', u"bar")) >>> cb N©r9Zset_text©rr?rrrr=¨szCheckBox.set_labelcCs|jjS)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 ©r9rr/rrrÚ get_labelºs zCheckBox.get_labelTcCs–|j|krdS||jvr0tdt|ƒt|ƒfƒ‚|j}|rN|durN| d|¡||_td|j|j|f|jgƒ|_d|j_ |r’|dur’| d|¡dS)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%s Invalid state: %sr5Úfixedrr6) r;r<r*ÚreprÚ_emitr Úreserve_columnsr9Z_wZ focus_col)rr@Ú do_callbackZ old_staterrrr>Ês"   ÿ  þ zCheckBox.set_statecCs|jS)z!Return the state of the checkbox.)r;r/rrrÚ get_stateüszCheckBox.get_statecCs|j|tkr|S| ¡dS)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#rrrr%szCheckBox.keypresscCsV|jdkr| d¡n<|jdkr>|jr2| d¡qR| d¡n|jdkrR| d¡dS)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 FTr3N)r@r>r:r/rrrrQs      zCheckBox.toggle_statecCs |dkst|ƒsdS| ¡dS)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 r1FT)r rQ©rrZeventZbuttonr!r"rrrrÚ mouse_event2s zCheckBox.mouse_event)FFNNN)T)r&r'r(r0rr<rMÚsignalsrrCrEr=rIÚpropertyr?r>rOr@r%rQrSrrrrr+es*ýÿ , 2 r+c@sJeZdZeddƒeddƒeddƒdœZdZdd d „Zdd d „Zdd„ZdS)Ú RadioButtonz(X)r1z( )z(#)r2r4ú first TrueNcCs6|dkr| }||_|j ||d||¡| |¡dS)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 >>> b2 >>> b2.render((15,), focus=True).text # ... = b in Python 3 [...'( ) Disagree '] rWFN)ÚgroupÚ_RadioButton__superrÚappend)rrXr?r@rArBrrrrLs$ÿzRadioButton.__init__TcCsR|j|krdS|j ||¡|dur(dS|jD]}||ur>> 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 >>> b3.set_state(True) # this will trigger the callback >>> b3 NTF)r;rYr>rX)rr@rNÚcbrrrr>zs   zRadioButton.set_statecCs| d¡dS)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)r>r/rrrrQ¨szRadioButton.toggle_state)rWNN)T) r&r'r(rr<rMrr>rQrrrrrVEsýÿ . .rVc@sdeZdZdd„ZedƒZedƒZdgZddd„Zd d „Z d d „Z d d„Z e e ƒZ dd„Zdd„ZdS)ÚButtoncCs ttgƒSr,r-r/rrrr0¼sz Button.sizingú<ú>ÚclickNcCs\tddƒ|_tdd|jf|jdd|jfgdd�}|j |¡|rNt|d||ƒ| |¡dS)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")