JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrB  f?@s0ddlZddlTddlmZmZddlmZddlmZdZ yej ej e e ZWnek rne ZYnXej ereZ nej e sede fe fdd Zdd d ZGd d d ZGdddZGdddeZGdddZddZedkr,ddlmZeddddddlmZeedS)N)*)Frame Scrollbar)idleConf) zoomheightZIconszcan't find icon directory (%r)c Cst}ddl}|tj|d}|g}d}}x|D]}tjtj|d}t||d} | | t || ddd} | j ||dt ||d } | j |d|d|d}|d kr<|d }d}q 1 if one scrolls fast. Flicking the wheel generates up to maybe 20 events with n up to 10 or more 1. Macs use wheel down (delta = 1*n) to scroll up, so positive delta means to scroll up on both systems. X-11 sends Control-Button-4,5 events instead. The widget parameter is needed so browser label bindings can pass the underlying canvas. This function depends on widget.yview to not be overridden by a subclass. rNZunitsbreak) Z EventTypeZ MouseWheelZdeltaZ ButtonPressZnumtypewidgetyviewZSCROLL)eventr)Zuplinesr!r!r" wheel_event;s  r-c@seZdZddZddZddZd*dd Zd+d d Zd d ZddZ d,ddZ d-ddZ d.ddZ ddZ ddZddZddZddZd d!Zd/d"d#Zd0d$d%Zd1d&d'Zd2d(d)ZdS)3TreeNodecCs:||_||_||_d|_d|_g|_d|_|_i|_dS)N collapsedF) canvasparentitemstateselectedchildrenxy iconimages)selfr0r1r2r!r!r"__init__Vs zTreeNode.__init__cCs6x*|jddD]}|j||qWd|_dS)N)r5removedestroyr1)r9cr!r!r"r<`s  zTreeNode.destroycCsfy |j|Stk rYnXtj|\}}|p6d}tjt||}t|j|d}||j|<|S)Nz.gif)rr) r8KeyErrorrrrrICONDIRrr0)r9rrZextfullnamer r!r!r" geticonimagefs  zTreeNode.geticonimageNcCs:|jr dS|d|_|j|j||dS)NT)r4 deselectallr0deleteimage_iddrawicondrawtext)r9r+r!r!r"selectrszTreeNode.selectcCs2|js dSd|_|j|j||dS)NF)r4r0rCrDrErF)r9r+r!r!r"deselect{s zTreeNode.deselectcCs|jr|jn|dS)N)r1rB deselecttree)r9r!r!r"rBs zTreeNode.deselectallcCs*|jr|x|jD] }|qWdS)N)r4rHr5rI)r9childr!r!r"rIs zTreeNode.deselecttreecCs*|jdkr|n||jdS)Nexpandedr')r3collapseexpandr2 OnDoubleClick)r9r+r!r!r"flips    z TreeNode.flipcCs2|jsdS|jdkr.d|_||dS)NrK)r2 _IsExpandabler3updateview)r9r+r!r!r"rMs   zTreeNode.expandcCs|jdkrd|_|dS)Nr/)r3rQ)r9r+r!r!r"rLs zTreeNode.collapsec Cs|jd}|jd}||}|jd}|j}|j|}||krV||krVdS|j|jd\}}} } ||kr||kr|||} n|} t| | } |j| dS)Nrr scrollregion)r7lastvisiblechildr0ZcanvasyZ winfo_heightZ_getintsfloatZ yview_moveto) r9topZbottomZheightZ visible_topZvisible_heightZvisible_bottomx0y0x1y1Zfractionr!r!r"rRs     z TreeNode.viewcCs&|jr|jdkr|jdS|SdS)NrK)r5r3rU)r9r!r!r"rUszTreeNode.lastvisiblechildcCs|jr|jnj|jd}d|jd<|j|jt|dd|jt\}}}}|jjdd||fd||jd<dS)NZcursorZwatchrr)rT)r1rQr0rCZALLdrawbbox configure)r9Z oldcursorrXrYrZr[r!r!r"rQs      zTreeNode.updatecCsxd}|||_|_|||jdkr4||S|jsz|j}|sP|dSx(|D] }||j ||}|j |qVW|d}||}d} x|jD]}|} |j j |d|d||ddd| ||}|j r|jdkrd } |j} n d } |j} || } |j j|d| d| d } |j | d | |j | d ddqW|j j |d|d|d| ddd} |j | |S)NrKrSr r]Zgray50)fillZ minusnodeZplusnode)r z<1>z cSsdS)Nr!)r6r!r!r"zTreeNode.draw..r)r6r7rErFr3r5r2 _GetSubList __class__r0rZ create_liner^rPrLrMrA create_imagetag_bindZ tag_lower)r9r6r7Zdysublistr2rJZcxZcyZcylastZiconnamecallbackr idr!r!r"r^sD    "     z TreeNode.drawcCs~|jr |jp|jpd}n|jp,d}||}|jj|j|jd|d}||_ |j |d|j |j |d|j dS)NZ openfolderZfoldernw)anchorr z<1>z ) r4r2GetSelectedIconName GetIconNamerAr0rhr6r7rDrirGrO)r9Z imagenamer rlr!r!r"rEs   zTreeNode.drawiconc sjdd}jd}j}|rjj||d|d}j|djj|djj |\}}}}t |dd }j pd } y j Wnt k rYn Xy jWn*t k rtj| d d d d _YnXt} jrjt| dnjt| djj||djd}jdjjdjjdfddjdfddjdfdd|_dS)Nrar r$rm)rnrz<1>z rz rr)rr ZpadxZpadyZhiliteZnormal)rnZwindowz cs t|jS)N)r-r0)e)r9r!r"rdrez#TreeNode.drawtext..z cs t|jS)N)r-r0)rr)r9r!r"rd rez cs t|jS)N)r-r0)rr)r9r!r"rd!re)r6r7r2 GetLabelTextr0Z create_textrirGrOr_maxGetTextentryAttributeError edit_finishr rrZ CurrentThemer4r`Z GetHighlightZ create_windowbindselect_or_editZtext_id) r9ZtextxZtextyZ labeltextrlrXrYrZr[rZthemer!)r9r"rFs@       zTreeNode.drawtextcCs*|jr|jr||n ||dS)N)r4r2 IsEditableeditrG)r9r+r!r!r"rz$s zTreeNode.select_or_editcCsrt|jdddd|_|jd|jd|jdt|jjdd|j|jd|j |jd|j dS) Nrr )r highlightthicknesswidthrr&)Zipadxzz) ZEntryr rvinsertZselection_rangeZENDpack focus_setryrx edit_cancel)r9r+r!r!r"r|*s z TreeNode.editcCs|y|j}|`Wntk r"dSX|}||rR||jkrR|j||j}||jd<||j dS)Nr) rvrwgetr<r2ruSetTextr rFr0r)r9r+rvrr!r!r"rx3s   zTreeNode.edit_finishcCsBy|j}|`Wntk r"dSX|||jdS)N)rvrwr<rFr0r)r9r+rvr!r!r"rBszTreeNode.edit_cancel)N)N)N)N)N)N)N)N)N)__name__ __module__ __qualname__r:r<rArGrHrBrIrOrMrLrRrUrQr^rErFrzr|rxrr!r!r!r"r.Ts(      * %  r.c@steZdZdZddZddZddZdZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZddZdS)TreeItemzAbstract class representing tree items. Methods should typically be overridden, otherwise a default action is used. cCsdS)z)Constructor. Do whatever you need to do.Nr!)r9r!r!r"r:VszTreeItem.__init__cCsdS)zReturn text string to display.Nr!)r9r!r!r"ruYszTreeItem.GetTextcCsdS)z>Return label text string to display in front of text (if any).Nr!)r9r!r!r"rs\szTreeItem.GetLabelTextNcCs|jdkr||_|jS)z%Do not override! Called by TreeNode.N) expandable IsExpandable)r9r!r!r"rPas  zTreeItem._IsExpandablecCsdS)z"Return whether there are subitems.r r!)r9r!r!r"rgszTreeItem.IsExpandablecCs"|s gS|}|sd|_|S)z%Do not override! Called by TreeNode.r)r GetSubListr)r9rjr!r!r"rfks zTreeItem._GetSubListcCsdS)z-Return whether the item's text may be edited.Nr!)r9r!r!r"r{tszTreeItem.IsEditablecCsdS)z+Change the item's text (if it is editable).Nr!)r9rr!r!r"rwszTreeItem.SetTextcCsdS)z-Return name of icon to be displayed normally.Nr!)r9r!r!r"rpzszTreeItem.GetIconNamecCsdS)z2Return name of icon to be displayed when selected.Nr!)r9r!r!r"ro}szTreeItem.GetSelectedIconNamecCsdS)z%Return list of items forming sublist.Nr!)r9r!r!r"rszTreeItem.GetSubListcCsdS)z%Called on a double-click on the item.Nr!)r9r!r!r"rNszTreeItem.OnDoubleClick)rrr__doc__r:rursrrPrrfr{rrprorrNr!r!r!r"rMs rc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS) FileTreeItemz4Example TreeItem subclass -- browse the file system.cCs ||_dS)N)r)r9rr!r!r"r:szFileTreeItem.__init__cCstj|jp|jS)N)rrr)r9r!r!r"ruszFileTreeItem.GetTextcCstj|jdkS)N)rrr)r9r!r!r"r{szFileTreeItem.IsEditablecCsltj|j}tj||}tj|tj|jkr:dSyt|j|||_Wntk rfYnXdS)N)rrdirnamerrenameOSError)r9rnewpathr!r!r"rs zFileTreeItem.SetTextcCs|s dSdS)Npython)r)r9r!r!r"rpszFileTreeItem.GetIconNamecCstj|jS)N)rrisdir)r9r!r!r"rszFileTreeItem.IsExpandablecCsjyt|j}Wntk r$gSX|jtjjdg}x*|D]"}ttj|j|}||q@W|S)N)key) rlistdirrrrnormcaserrr)r9namesrjrr2r!r!r"rs zFileTreeItem.GetSubListN) rrrrr:rur{rrprrr!r!r!r"rs rc@s<eZdZddZddZddZddZd d Zd d Zd S)ScrolledCanvascKshd|krd|d<||_t||_|jjddd|jjdddt|jf||_|jjddddt|jdd |_ |j jddd dt|jd d d |_ |j jdddd|j j |jd<|jj |j d<|j j |jd<|jj |j d<|jd|j|jd|j|jd|j|jd|j|jdt|jdt|jdt|jd|j|jdS)NZyscrollincrementrSrr )ZweightZnsew)r r Zstickyvbar)rZnsehbarZ horizontal)rZorientZewsZyscrollcommandZcommandZxscrollcommandz z zz z z z z )rrframeZ rowconfigureZcolumnconfigureZCanvasr0rrrrsetr*Zxviewrypage_up page_downunit_up unit_downr- zoom_heightr)r9rZoptsr!r!r"r:s2 zScrolledCanvas.__init__cCs|jdddS)Nr\pager')r0 yview_scroll)r9r+r!r!r"rszScrolledCanvas.page_upcCs|jdddS)Nr rr')r0r)r9r+r!r!r"rszScrolledCanvas.page_downcCs|jdddS)Nr\unitr')r0r)r9r+r!r!r"rszScrolledCanvas.unit_upcCs|jdddS)Nr rr')r0r)r9r+r!r!r"rszScrolledCanvas.unit_downcCst|jdS)Nr')rrr)r9r+r!r!r"rs zScrolledCanvas.zoom_heightN) rrrr:rrrrrr!r!r!r"rs rcCst|}tt|ddd\}}|d|d|dft|dddd}|jjdd td t t }t |j d|}| dS) N+r z+%d+%d2Zwhiter)Zbgr}Z takefocusZboth)rMrcZside)ZToplevelmapintZgeometrysplitrrrZLEFTrr?r.r0rM)r1rWr6r7Zscr2Znoder!r!r" _tree_widgets r__main__)mainzidlelib.idle_test.test_treerF) verbosityexit)run)N)rZtkinterZ tkinter.ttkrrZidlelib.configrZidlelibrr?rrr__file__Z_icondir NameErrorr RuntimeErrorr#r-r.rrrrrZunittestrZidlelib.idle_test.htestrr!r!r!r"s4       z<..