grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a BjŒj%=ã@sŽddlmZmZddlZddlmZGdd„deƒZGdd„dejƒZ Gdd „d e ƒZ Gd d „d e ƒZ Gd d „d ej ƒZGdd„dejƒZdS)é)ÚdivisionÚprint_functionN)ÚSelectableIconc@s eZdZdS)ÚTreeWidgetErrorN)Ú__name__Ú __module__Ú __qualname__©r r ú5/usr/lib64/python3.9/site-packages/urwid/treetools.pyr%src@s eZdZdZdZeddƒZeddƒZdd„Zdd „Z d d „Z d d „Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$S)%Ú TreeWidgetz9A widget representing something in a nested tree display.éú+rú-cCs8||_d|_t|dƒ |_d|_| ¡}|j |¡dS)NÚget_first_childT)Ú_nodeÚ _innerwidgetÚhasattrÚis_leafÚexpandedÚget_indented_widgetÚ_TreeWidget__superÚ__init__)ÚselfÚnodeÚwidgetr r r r/s zTreeWidget.__init__cCs|j S)zS Allow selection of non-leaf nodes so children may be (un)expanded )r©rr r r Ú selectable7szTreeWidget.selectablecCsL| ¡}|js4tjdd|j|jg|jf|gdd�}| ¡}tj|d|d�S)NÚfixedé)Z dividechars)Úrelativeéd)ÚwidthÚleft) Úget_inner_widgetrÚurwidZColumnsÚunexpanded_iconÚ expanded_iconrÚget_indent_colsZPadding)rrÚ indent_colsr r r r=sÿþþÿzTreeWidget.get_indented_widgetcCs |j|jg|j|jjjd<dS)z-Update display widget text for parent widgetsrN)r%r&rÚ_wZ base_widgetZ widget_listrr r r Úupdate_expanded_iconGsÿÿzTreeWidget.update_expanded_iconcCs|j| ¡ ¡S©N)r(Úget_nodeÚ get_depthrr r r r'MszTreeWidget.get_indent_colscCs|jdur| ¡|_|jSr+)rÚload_inner_widgetrr r r r#Ps  zTreeWidget.get_inner_widgetcCst | ¡¡Sr+)r$ÚTextÚget_display_textrr r r r.UszTreeWidget.load_inner_widgetcCs|jSr+)rrr r r r,XszTreeWidget.get_nodecCs | ¡ ¡dt| ¡ ¡ƒS)Nz: )r,Úget_keyÚstrÚ get_valuerr r r r0[sÿzTreeWidget.get_display_textcCsn| ¡}|dur|S| ¡}| ¡}| ¡}|durV|dkrV| ¡}| ¡}|d8}q,|durbdS| ¡SdS)z5Return the next TreeWidget depth first from this one.Nrr)Ú first_childr,Ú next_siblingr-Ú get_parentÚ get_widget)rZ firstchildÚthisnodeZnextnodeÚdepthr r r Ú next_inorder_szTreeWidget.next_inordercCsp|j}| ¡}|dur8| ¡}| ¡}|dur2|S|Sn4| ¡}|durT|dkrTdS|durd| ¡}| ¡SdS)z9Return the previous TreeWidget depth first from this one.Nr)rÚ prev_siblingr7Ú last_childr-r6)rr8ZprevnodeZ prevwidgetÚ lastchildr9r r r Ú prev_inordervszTreeWidget.prev_inordercCsZ|jr |S|dvr"d|_| ¡n4|dkr:d|_| ¡n|j ¡rR|j ||¡S|SdS)z2Handle expand & collapse requests (non-leaf nodes))r ÚrightTrFN)rrr*r)rrÚkeypress©rÚsizeÚkeyr r r r@Œs   zTreeWidget.keypresscCsH|js|dks|dkrdS|dkrD|| ¡krD|j |_| ¡dSdS)Nz mouse pressrFrT)rr'rr*)rrBZeventZbuttonÚcolÚrowÚfocusr r r Ú mouse_eventœs zTreeWidget.mouse_eventcCs4|js |jsdS|j ¡r,|j ¡}| ¡SdSdS)zReturn first child if expanded.N)rrrÚ has_childrenrr7)rZ firstnoder r r r4§s    zTreeWidget.first_childcCsJ|js |jsdS|j ¡r*|j ¡ ¡}ndS| ¡}|durB|S|SdS)zReturn last child if expanded.N)rrrrHÚget_last_childr7r<)rr=Zlastdescendantr r r r<²s  zTreeWidget.last_childN)rrrÚ__doc__r(rr%r&rrrr*r'r#r.r,r0r:r>r@rGr4r<r r r r r )s&     r c@sŒeZdZdZd"dd„Zd#dd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd d!„ZdS)$ÚTreeNodea: Store tree contents and cache TreeWidget objects. A TreeNode consists of the following elements: * key: accessor token for parent nodes * value: subclass-specific data * parent: a TreeNode which contains a pointer back to this object * widget: The widget used to render the object NcCs"||_||_||_||_d|_dSr+)Ú_keyÚ_parentÚ_valueÚ_depthÚ_widget©rÚvalueÚparentrCr9r r r rÌs zTreeNode.__init__FcCs"|jdus|dkr| ¡|_|jS)z! Return the widget for this node.NT)rPÚ load_widget©rÚreloadr r r r7Ós zTreeNode.get_widgetcCst|ƒSr+)r rr r r rTÙszTreeNode.load_widgetcCs<|jdur|jdurd|_n|jdur6|j ¡d|_|jS)Nrr)rOrMr-rr r r r-Üs  zTreeNode.get_depthcCs.| ¡dkrdS| ¡}| ¡}| |¡SdS©Nr)r-r1r6Úget_child_index)rrCrSr r r Ú get_indexãs  zTreeNode.get_indexcCs|jSr+©rLrr r r r1ëszTreeNode.get_keycCs ||_dSr+rZ©rrCr r r Úset_keyîszTreeNode.set_keycCs| ¡ |j|¡dSr+)r6Úchange_child_keyrLr[r r r Ú change_keyñszTreeNode.change_keycCs&|jdkr | ¡dkr | ¡|_|jSrW)rMr-Ú load_parentrr r r r6ôs zTreeNode.get_parentcCs tdƒ‚dS)z¦Provide TreeNode with a parent for the current node. This function is only required if the tree was instantiated from a child node (virtual function)ú(virtual function. Implement in subclassN©rrr r r r_ùszTreeNode.load_parentcCs|jSr+)rNrr r r r3ÿszTreeNode.get_valuecCs | ¡dkSrW)r-rr r r Úis_rootszTreeNode.is_rootcCs&| ¡dkr| ¡ | ¡¡SdSdSrW)r-r6Ú next_childr1rr r r r5s zTreeNode.next_siblingcCs&| ¡dkr| ¡ | ¡¡SdSdSrW)r-r6Ú prev_childr1rr r r r; s zTreeNode.prev_siblingcCs|}| ¡dur| ¡}q|Sr+)r6)rÚrootr r r Úget_roots  zTreeNode.get_root)NNN)F)rrrrJrr7rTr-rYr1r\r^r6r_r3rbr5r;rfr r r r rKÃs   rKc@s†eZdZdZd dd„Zd!dd„Zdd „Zd d „Zd"d d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„ZdS)#Ú ParentNodez"Maintain sort order for TreeNodes.NcCs$tj|||||d�d|_i|_dS)N)rSrCr9)rKrÚ _child_keysÚ _childrenrQr r r rszParentNode.__init__FcCs"|jdus|dkr| ¡|_|jS)z,Return a possibly ordered list of child keysNT)rhÚload_child_keysrUr r r Úget_child_keys s zParentNode.get_child_keyscCs tdƒ‚dS)zPProvide ParentNode with an ordered list of child keys (virtual function)r`Nrarr r r rj&szParentNode.load_child_keyscCs| |¡}| ¡S)z8Return the widget for a given key. Create if necessary.)Úget_child_noder7)rrCÚchildr r r Úget_child_widget+s zParentNode.get_child_widgetcCs,||jvs|dkr"| |¡|j|<|j|S)zr,rr r r Úget_prev–s zTreeWalker.get_prevN) rrrrJrr|r}r�r‚r r r r rz}s rzc@sPeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dS)Ú TreeListBoxzPA ListBox with special handling for navigation and collapsing of TreeWidgetscCs|j ||¡}| ||¡Sr+)Z_TreeListBox__superr@Úunhandled_inputrAr r r r@£szTreeListBox.keypresscCs0|dkr| |¡n|dkr(| |¡n|SdS)zHandle macro-navigation keysr"rN)Úmove_focus_to_parentÚcollapse_focus_parent)rrBÚinputr r r r„§s   zTreeListBox.unhandled_inputcCs>|j ¡\}}| |¡|j ¡\}}||kr:| |d¡dS)zCollapse parent directory.rN)Úbodyr|r…r@)rrBrÚposZpwidgetZpposr r r r†°s  z!TreeListBox.collapse_focus_parentcCs�|j ¡\}}| ¡}|dur"dS| |¡\}}}|\}} } } } |\} }|D].\}}}||8}||krL| |||¡dSqL| || ¡¡dS)z(Move focus to parent of widget in focus.N)rˆr|r6Zcalculate_visibleÚ change_focus)rrBrr‰Ú parentposZmiddleÚtopZbottomÚ row_offsetZ focus_widgetZ focus_posZ focus_rowsZcursorZtrim_topZ fill_aboveZrowsr r r r…ºsz TreeListBox.move_focus_to_parentcCs | |¡Sr+)Ú focus_home©rrBr r r Ú_keypress_max_leftÑszTreeListBox._keypress_max_leftcCs | |¡Sr+)Ú focus_endr�r r r Ú_keypress_max_rightÔszTreeListBox._keypress_max_rightcCs&|j ¡\}}| ¡}| ||¡dS)zMove focus to very top.N)rˆr|rfrŠ)rrBrr‰Úrootnoder r r rŽ×szTreeListBox.focus_homec CsP|\}}|j ¡\}}| ¡}| ¡}| ¡}|rL| ¡} | || |d¡dS)zMove focus to far bottom.rN)rˆr|rfr7r<r,rŠ) rrBZmaxrowZmaxcolrr‰r“Z rootwidgetZ lastwidgetZlastnoder r r r‘ÞszTreeListBox.focus_endN) rrrrJr@r„r†r…r�r’rŽr‘r r r r rƒŸs  rƒ)Z __future__rrr$Z urwid.wimprÚ RuntimeErrorrZ WidgetWrapr ÚobjectrKrgZ ListWalkerrzZListBoxrƒr r r r Ús  Ue"