�ɲɾ�����ӯ�����һ��ˣ��������С���˴��ͣ�������P���ҹ��ñ˽��ά�Բ��������˸߸ԣ�������ơ��ҹ��ñ�����ά�Բ���ˡ���˳^�ӣ������ӡ� ���ͯj�ӣ��ƺ���ӣ� ? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!__pycache__/generictreemodel.cpython-36.opt-1.pyc000064400000034302152525342270015667 0ustar003 <_6@stddlZddlZddlZddlZddlmZddlmZGdddejZddZ dd Z Gd d d ejej Z dS) N)GObject)Gtkc@s<eZdZdejfdejfdejfdejfgZeddZdS) _CTreeIterstamp user_dataZ user_data2Z user_data3cCs$tjt}tj|jt||S)N)sys getsizeofobjectctypesZPOINTERZ from_addressid)clsiteroffsetr(/usr/lib64/python3.6/generictreemodel.py from_iter&s z_CTreeIter.from_iterN) __name__ __module__ __qualname__r Zc_intZc_void_pZ_fields_ classmethodrrrrrr s  rcCstj|}tj|jjtjjS)N)rrr castcontentsrZ py_objectvalue)r Zciterrrr_get_user_data_as_pyobject,s rcsfdd}|S)a]Returns a function which can act as a decorator for wrapping exceptions and returning "default_return" upon an exception being thrown. This is used to wrap Gtk.TreeModel "do_" method implementations so we can return a proper value from the override upon an exception occurring with client code implemented by the "on_" methods. csfdd}|S)Nc s*y ||StjtjYnXS)N)r excepthookexc_info)argsZkargs)default_returnfuncrr wrapped_func:s  z9handle_exception..decorator..wrapped_funcr)rr)r)rr decorator9sz#handle_exception..decoratorr)rr r)rrhandle_exception1s r!cseZdZdZejdeddZfddZddZ d d Z d d Z d dZ ddZ ddZddZddZdTfdd ZedddZedddZeejdd ZedUd"d#Zed!d$d%Zedd&d'Zedd(d)ZedVd*d+Zed!d,d-Zedd.d/ZedWd0d1ZedXd2d3Zedd4d5Z edd6d7Z!d8d9Z"d:d;Z#dd?Z%d@dAZ&dBdCZ'dDdEZ(dFdGZ)dHdIZ*dJdKZ+dLdMZ,dNdOZ-dPdQZ.dRdSZ/Z0S)YGenericTreeModelaA base implementation of a Gtk.TreeModel for python. The GenericTreeModel eases implementing the Gtk.TreeModel interface in Python. The class can be subclassed to provide a TreeModel implementation which works directly with Python objects instead of iterators. All of the on_* methods should be overridden by subclasses to provide the underlying implementation a way to access custom model data. For the purposes of this API, all custom model data supplied or handed back through the overridable API will use the argument names: node, parent, and child in regards to user data python objects. The create_tree_iter, set_user_data, invalidate_iters, iter_is_valid methods are available to help manage Gtk.TreeIter objects and their Python object references. GenericTreeModel manages a pool of user data nodes that have been used with iters. This pool stores a references to user data nodes as a dictionary value with the key being the integer id of the data. This id is what the Gtk.TreeIter objects use to reference data in the pool. References will be removed from the pool when the model is deleted or explicitly by using the optional "node" argument to the "row_deleted" method when notifying the model of row deletion. TzIf True, strong references to user data attached to iters are stored in a dictionary pool (default). Otherwise the user data is stored as a raw pointer to a python object without a reference.)defaulttypeZblurbcs(tt|jd|_t|_|jdS)zFInitialize. Make sure to call this from derived classes if overridden.rN)superr"__init__rdict _held_refsinvalidate_iters)self) __class__rrr&gszGenericTreeModel.__init__c#sbtjdg}xP|r\|jdk r.jVfddtjD}|jt|qWdS)zHDepth-first iteration of the entire TreeModel yielding the python nodes.Ncsg|]}j|qSr)Ziter_nth_child).0i)itr*rr ysz5GenericTreeModel.iter_depth_first..) collectionsdequepopleft get_user_datarangeZiter_n_children extendleftreversed)r*stackZchildrenr)r.r*riter_depth_firstrs  z!GenericTreeModel.iter_depth_firstcCs,d|_|jr(|j|jkr"|j|j=d|_dS)z?Clear user data and its reference from the iter and this model.rN)rrr()r*r rrrinvalidate_iter|s   z GenericTreeModel.invalidate_itercCstjdd|_|jjdS)z This method invalidates all TreeIter objects associated with this custom tree model and frees their locally pooled references. liNi)randomZrandintrr(clear)r*rrrr)sz!GenericTreeModel.invalidate_iterscCs |j|jkS)zv :Returns: True if the gtk.TreeIter specified by iter is valid for the custom tree model. )r)r*r rrr iter_is_validszGenericTreeModel.iter_is_validcCs|jr|j|jSt|SdS)zGet the user_data associated with the given TreeIter. GenericTreeModel stores arbitrary Python objects mapped to instances of Gtk.TreeIter. This method allows to retrieve the Python object held by the given iterator. N)leak_referencesr(rr)r*r rrrr3s zGenericTreeModel.get_user_datacCs<t||_|dkr|j|n|j|_|jr8||j|j<dS)zApplies user_data and stamp to the given iter. If the models "leak_references" property is set, a reference to the user_data is stored with the model to ensure we don't run into bad memory problems with the TreeIter. N)r rr9rr=r()r*r rrrr set_user_datas   zGenericTreeModel.set_user_datacCstj}|j|||S)aCreate a Gtk.TreeIter instance with the given user_data specific for this model. Use this method to create Gtk.TreeIter instance instead of directly calling Gtk.Treeiter(), this will ensure proper reference managment of wrapped used_data. )rZTreeIterr>)r*rr rrrcreate_tree_iters z!GenericTreeModel.create_tree_itercCs"|dkr dS|j|}d|fSdS)zyInternal creation of a (bool, TreeIter) pair for returning directly back to the view interfacing with this model.NFT)FN)r?)r*datar.rrr_create_tree_iters z"GenericTreeModel._create_tree_iterNcs.tt|j|t|}||jkr*|j|=dS)aNotify the model a row has been deleted. Use the node parameter to ensure the user_data reference associated with the path is properly freed by this model. :Parameters: path : Gtk.TreePath Path to the row that has been deleted. node : object Python object used as the node returned from "on_get_iter". This is optional but ensures the model will not leak references to this object. N)r%r" row_deletedr r()r*pathnodeZnode_id)r+rrrBs  zGenericTreeModel.row_deletedrcCs|jS)zInternal method.) on_get_flags)r*rrr do_get_flagsszGenericTreeModel.do_get_flagscCs|jS)zInternal method.)on_get_n_columns)r*rrrdo_get_n_columnssz!GenericTreeModel.do_get_n_columnscCs |j|S)zInternal method.)on_get_column_type)r*indexrrrdo_get_column_typesz#GenericTreeModel.do_get_column_typeFcCs|j|j|S)zInternal method.)rA on_get_iter)r*rCrrr do_get_iterszGenericTreeModel.do_get_itercCs8|dkr|jd}n|j|j|}|j|||dk S)zInternal method.N) on_iter_nextr3r>)r*r Z next_datarrr do_iter_nexts   zGenericTreeModel.do_iter_nextcCs*|j|j|}|dkrdStj|SdS)zInternal method.N) on_get_pathr3rZTreePath)r*r rCrrr do_get_pathszGenericTreeModel.do_get_pathcCs|j|j||S)zInternal method.) on_get_valuer3)r*r columnrrr do_get_valueszGenericTreeModel.do_get_valuecCs"|r|j|nd}|j|j|S)zInternal method.N)r3rAon_iter_children)r*parentr@rrrdo_iter_childrensz!GenericTreeModel.do_iter_childrencCs|j|j|S)zInternal method.)on_iter_has_childr3)r*rVrrrdo_iter_has_child sz"GenericTreeModel.do_iter_has_childcCs"|dkr|jdS|j|j|S)zInternal method.N)on_iter_n_childrenr3)r*r rrrdo_iter_n_childrens z#GenericTreeModel.do_iter_n_childrencCs2|dkr|jd|}n|j|j||}|j|S)zInternal method.N)on_iter_nth_childr3rA)r*rVnr@rrrdo_iter_nth_childsz"GenericTreeModel.do_iter_nth_childcCs|j|j|j|S)zInternal method.)rAon_iter_parentr3)r*childrrrdo_iter_parentszGenericTreeModel.do_iter_parentcCs|j|j|dS)N) on_ref_noder3)r*r rrr do_ref_node#szGenericTreeModel.do_ref_nodecCs|j|j|dS)N) on_unref_noder3)r*r rrr do_unref_node'szGenericTreeModel.do_unref_nodecCstdS)zyOverridable. :Returns Gtk.TreeModelFlags: The flags for this model. See: Gtk.TreeModelFlags N)NotImplementedError)r*rrrrE.szGenericTreeModel.on_get_flagscCstdS)zZOverridable. :Returns: The number of columns for this model. N)rf)r*rrrrG6sz!GenericTreeModel.on_get_n_columnscCstdS)zYOverridable. :Returns: The column type for the given index. N)rf)r*rJrrrrI>sz#GenericTreeModel.on_get_column_typecCstdS)zcOverridable. :Returns: A python object (node) for the given TreePath. N)rf)r*rCrrrrLFszGenericTreeModel.on_get_itercCstdS)zOverridable. :Parameters: node : object Node at current level. :Returns: A python object (node) following the given node at the current level. N)rf)r*rDrrrrNNs zGenericTreeModel.on_iter_nextcCstdS)zSOverridable. :Returns: A TreePath for the given node. N)rf)r*rDrrrrPZszGenericTreeModel.on_get_pathcCstdS)zOverridable. :Parameters: node : object column : int Column index to get the value from. :Returns: The value of the column for the given node.N)rf)r*rDrSrrrrRbs zGenericTreeModel.on_get_valuecCstdS)zOverridable. :Returns: The first child of parent or None if parent has no children. If parent is None, return the first node of the model. N)rf)r*rVrrrrUnsz!GenericTreeModel.on_iter_childrencCstdS)zYOverridable. :Returns: True if the given node has children. N)rf)r*rDrrrrXwsz"GenericTreeModel.on_iter_has_childcCstdS)zOverridable. :Returns: The number of children for the given node. If node is None, return the number of top level nodes. N)rf)r*rDrrrrZsz#GenericTreeModel.on_iter_n_childrencCstdS)ahOverridable. :Parameters: parent : object n : int Index of child within parent. :Returns: The child for the given parent index starting at 0. If parent None, return the top level node corresponding to "n". If "n" is larger then available nodes, return None. N)rf)r*rVr]rrrr\s z"GenericTreeModel.on_iter_nth_childcCstdS)zjOverridable. :Returns: The parent node of child or None if child is a top level node.N)rf)r*r`rrrr_szGenericTreeModel.on_iter_parentcCsdS)Nr)r*rDrrrrbszGenericTreeModel.on_ref_nodecCsdS)Nr)r*rDrrrrdszGenericTreeModel.on_unref_node)N)FN)FN)FN)FN)1rrr__doc__rZPropertyboolr=r&r8r9r)r<r3r>r?rArBr!rFrHZ TYPE_INVALIDrKrMrOrQrTrWrYr[r^rarcrerErGrIrLrNrPrRrUrXrZr\r_rbrd __classcell__rr)r+rr"FsR            r") rr:r0r Z gi.repositoryrrZ Structurerrr!Z TreeModelr"rrrrs   __pycache__/pygtkcompat.cpython-36.pyc000064400000050200152525342270013750 0ustar003 <_T@sdZddlZddlZy>ddlmZeejejdddlmZWdQRXWn$e k rvddlmZeYnXddl Z ddl m Z gZ gZeZiZddZd d Zd$d d Zd%ddZddZddZd&ddZddZddZd'ddZddZd d!Zd"d#ZdS)(a PyGTK compatibility layer. This modules goes a little bit longer to maintain PyGTK compatibility than the normal overrides system. It is recommended to not depend on this layer, but only use it as an intermediate step when porting your application to PyGI. Compatibility might never be 100%, but the aim is to make it possible to run a well behaved PyGTK application mostly unmodified on top of PyGI. N)UserListignore)reload)GObjectcCs,t||t}t|||tj|||fdS)N)getattr_unsetsetattr_patchesappend)objname new_value old_valuer#/usr/lib64/python3.6/pygtkcompat.py_patch<s  rcCs*tjj|t}|tj|<tj||fdS)N)sysmodulesgetr_module_patchesr )r r rrrr _patch_moduleBs rc "Cs`|dkr |}|jjdddj}x6t|D](}yt||d}Wnw.YnXyht|tjrxV|jj D]H\}}|j }|j |dd}|r|j |r|t |d}t|||qnWWntk rw.YnXyjt|tjr} tj+d?t,| j-Gfd@dAdA} tdA| j.j/dfdCdD } tj.dE| j.j0dfdFdG } tj.dH| j1j/dfdIdJ } tj1dE| j1j0dfdKdL }tj1dH|j2j/dfdMdN }tj2dE|j2j0dfdOdP }tj2dH|j2j3t4ffdQdR }tj2dS|GdTdUdUj5}tdU|j6j7 t4f fdVdW }tj6dX|GfdYdZdZj6}tdZ|fd[d\}td]|fd^d_}td`|dadb}tj8dct,|fddde}tdf|dgdh}tj6di|tdjj9j:tdkj;jtdljtdnj.get_formats..make_dict)r )ZformatsrOrPrN)orig_get_formatsrr get_formatss  zenable_gtk..get_formatsZpixbuf_get_formatscsby@yjdddd}Wntk r2j}YnX||Wntk r\|}YnX|S)Nr)Z Rectangler%)windowZrect)rForig_get_frame_extentsrrget_frame_extentssz%enable_gtk..get_frame_extentsrUcs|ddS)Nrr)self)orig_get_originrr get_originszenable_gtk..get_originrXZ screen_widthZ screen_heightcs||jjfS)N)Z get_visualZget_best_depth)rS)orig_gdk_window_get_geometryrrgdk_window_get_geometry sz+enable_gtk..gdk_window_get_geometry get_geometryGtk)r\ZgdkZ pygtk_versioncZ gtk_versioncSstjdtjdddS)Nz%set_tool_item_type() is not supportedr]) stacklevel)warningswarnr8PyGIDeprecationWarning)Z menuactionZgtyperrrset_tool_item_type sz&enable_gtk..set_tool_item_typerccseZdZdfdd ZdS)zenable_gtk..Alignmentcs.j|||j_||j_||j_||j_dS)N)__init__Zpropsxalignyalignxscaleyscale)rVrfrgrhri)orig_Alignmentrrre*s  z&enable_gtk..Alignment.__init__N)rdrdrdrd)r __module__ __qualname__rer)rjrr Alignment)srmTcs|||||dS)Nr)rVchildexpandfillpadding) orig_pack_endrrpack_end7szenable_gtk..pack_endrscs|||||dS)Nr)rVrnrorprq)orig_pack_startrr pack_start=szenable_gtk..pack_startrucs|||dS)Nr)rVcellro)orig_tree_view_column_pack_endrrtree_view_column_pack_endEsz-enable_gtk..tree_view_column_pack_endcs|||dS)Nr)rVrvro) orig_tree_view_column_pack_startrrtree_view_column_pack_startKsz/enable_gtk..tree_view_column_pack_startcs|||dS)Nr)rVrvro)orig_cell_pack_endrr cell_pack_endSsz!enable_gtk..cell_pack_endcs|||dS)Nr)rVrvro)orig_cell_pack_startrrcell_pack_startYsz#enable_gtk..cell_pack_startcsfdd}||||dS)Ncs |dtkr|dd}|S)Nrrr)r)args)funcrrcallback`s  z8enable_gtk..set_cell_data_func..callbackr)rVrvr user_datar)orig_set_cell_data_func)rrset_cell_data_func_s z&enable_gtk..set_cell_data_funcrc@s eZdZdS)z'enable_gtk..GenericCellRendererN)rrkrlrrrrGenericCellRendererisrcsfdd}|||dS)Ncs |dtkr|dd}|S)Nrrr)r)r)rrrrrs  z>enable_gtk..combo_row_separator_func..callbackr)rVrrr)orig_combo_row_separator_func)rrcombo_row_separator_funcqs z,enable_gtk..combo_row_separator_funcset_row_separator_funccs(eZdZfddZddZddZdS)z!enable_gtk..ComboBoxEntrycsjj|fddi|dS)NZ has_entryT)ComboBoxre)rVkwds)r\rrre|sz*enable_gtk..ComboBoxEntry.__init__cSs|j|dS)N)set_entry_text_column)rVZ text_columnrrrset_text_columnsz1enable_gtk..ComboBoxEntry.set_text_columncSs|jS)N)Zget_entry_text_column)rVrrrget_text_columnsz1enable_gtk..ComboBoxEntry.get_text_columnN)rrkrlrerrr)r\rr ComboBoxEntry{s rcsjS)N)rr)r\rrcombo_box_entry_newsz'enable_gtk..combo_box_entry_newrcs j|dS)N)model)r)r)r\rrcombo_box_entry_new_with_modelsz2enable_gtk..combo_box_entry_new_with_modelrcSstjdtjdddS)Nz)install_child_property() is not supportedr])r_)r`rar8rb)Z containerr.Zpspecrrrinstall_child_propertysz*enable_gtk..install_child_propertyrcs*j}jt}|j||jd|S)Nr)rZ ListStorestrZ set_modelr)Zcombor)r\rrnew_texts    zenable_gtk..new_textZcombo_box_new_textcSs|j}|j|gdS)N)Z get_modelr )rVtextrrrr append_textszenable_gtk..append_textrZexpander_new_with_mnemonicZicon_theme_get_defaultZimage_new_from_pixbufZimage_new_from_stockZimage_new_from_animationZimage_new_from_icon_setZimage_new_from_fileZsettings_get_defaultZwindow_set_default_iconZ clipboard_getZ connect_groupZstatus_icon_position_menuZ set_tooltipcseZdZdfdd ZdS)zenable_gtk..HScaleNcsj||ddS)N) adjustment)re)rVr) orig_HScalerrresz#enable_gtk..HScale.__init__)N)rrkrlrer)rrrHScalesrcseZdZdfdd ZdS)zenable_gtk..VScaleNcsj||ddS)N)r)re)rVr) orig_VScalerrresz#enable_gtk..VScale.__init__)N)rrkrlrer)rrrVScalesrZ stock_addcSsdS)Nr)r!rrrszenable_gtk..rS)fgetZwidget_get_default_directioncsGdddt}||S)Nc@seZdZddZdS)z5enable_gtk..size_request..SizeRequestcSs(|j|_|j|_tj||j|jgdS)N)heightwidthrre)rVZreqrrrresz>enable_gtk..size_request..SizeRequest.__init__N)rrkrlrerrrr SizeRequestsr)r)widgetr)orig_size_requestrr size_requestsz enable_gtk..size_requestrZhide_allcs eZdZddZfddZdS)zenable_gtk..BaseGettercSs ||_dS)N)context)rVrrrrresz'enable_gtk..BaseGetter.__init__cs:|jj|}jt|jdt|jdt|jddS)Ni)redgreenblue)rZget_background_colorColorintrrr)rVstateZcolor)rFrr __getitem__s  z*enable_gtk..BaseGetter.__getitem__N)rrkrlrerr)rFrr BaseGettersrcseZdZfddZdS)zenable_gtk..Stylescs(|j}||_jdddd|_dS)Nr)rrr)Zget_style_contextbaserZblack)rVrr)rrFrrres z#enable_gtk..Styles.__init__N)rrkrlrer)rrFrrStylessrcseZdZfddZdS)z#enable_gtk..StyleDescriptorcs|S)Nr)rVinstanceZclass_)rrr__get__sz+enable_gtk..StyleDescriptor.__get__N)rrkrlrr)rrrStyleDescriptorsrZstyleF?cs||||||S)Nr)rVZmarkZ within_marginZ use_alignrfrg)orig_text_view_scroll_to_markrrtext_view_scroll_to_marksz,enable_gtk..text_view_scroll_to_markscroll_to_markrg?c s6j} jd} |dks"|dkrFt|d| _t|d| _| jjO} |dksV|dkrzt|d| _t|d| _| jjO} |dks|dkrt|d| _ t|d| _ | jj O} |dks| dkrt|d| _ t| d| _ | jjO} | dks| dkr(| dks| dkrtd| | _| | _| jjO} ||| | S)Nrgzaspect ratios must be positive)ZGeometryZ WindowHintsmax min_width min_heightZMIN_SIZE max_width max_heightZMAX_SIZE base_width base_heightZ BASE_SIZE width_inc height_incZ RESIZE_INCr% min_aspect max_aspectZASPECT)rVZgeometry_widgetrrrrrrrrrrZgeometryZ geom_mask)rForig_set_geometry_hintsrrset_geometry_hintss2              z&enable_gtk..set_geometry_hintsrZwindow_list_toplevelsZwindow_set_default_icon_namec@s eZdZdS)zenable_gtk..UnixPrintN)rrkrlrrrr UnixPrint'srZ gtkunixprintr)category)keysymsz gtk.keysymsr)generictreemodelGenericTreeModel)r:r)r]r^r)TTr)TTr)T)T)T)T)Frrrrrrrrrr) Nrrrrrrrrrr)ar3r1rrr?r@r8require_versionr7rCrr/rDrErFrGrZScreen get_defaultrJrKZ new_with_typeZ new_from_dataZ new_from_fileZnew_from_file_at_scaleAttributeErrorZnew_from_file_at_sizeZnew_from_inlineZnew_from_streamZnew_from_stream_at_scaleZnew_from_xpm_dataZ get_file_inforRZWindowrUrXrrr[r\Z MAJOR_VERSIONZ MINOR_VERSIONZ MICRO_VERSIONZAction classmethodrmZBoxrsruZTreeViewColumnZ CellLayoutrrZ CellRendererrr ContainerZExpanderZnew_with_mnemonicZ IconThemeImageZnew_from_pixbufZnew_from_stockZnew_from_animationZnew_from_icon_setZSettingsZset_default_iconZ ClipboardrZ AccelGroupZconnectZ StatusIconZ position_menuZset_tooltip_textrrZWidgetpropertyZ get_windowZget_default_directionrZhideobjectZTextViewrrZlist_toplevelsZset_default_icon_namer`catch_warnings simplefilterRuntimeWarningZ gi.overridesrrrr)$r2rCrDrErGrRrUrXrZrcrmrsrurxrzr|r~rrrrrrrrrrrrrrrrZ unixprintrrr)rrFr\rrjrrr{r}rrYrQrTrWrrrtrrrrrwryr enable_gtksD                                             #     rcCs2tdr dStjddddlm}td|dS)NZvteVtez0.0r)r)r3r8rr7rr)rrrr enable_vte9s   rcCs>tdr dStjddddlm}td|t|dddS) NZpopplerPopplerz0.18r)rZpypoppler_versionr)rrr)r3r8rr7rrr)rrrrenable_popplerBs    r1.0cCsFtd|rdStjd|ddlm}td|t|jd|jjdS)NZwebkitWebKitr)rZget_web_inspector) r3r8rr7rrrZWebViewZ get_inspector)r2rrrr enable_webkitMs     rcCs2tdr dStjddddlm}td|dS)NZgudevGUdevz1.0r)r)r3r8rr7rr)rrrr enable_gudevXs   rcCsntdr dStjddddlm}td|t|t|d|jj t|d|j j t|d|j j t|d |jjt|d d d t|d dd ddlm}td|t|ddlm}td|t|ddlm}td|t|ddlm}td|t|t|d|jt|d|jddlm}td|t||dddlm}td|t|dS)NZgstGstz0.10r)rZregistry_get_defaultZelement_registerZelement_factory_makeZ caps_new_anyZget_pygst_versioncSsdS)Nr )rrrrrrrrrnszenable_gst..Zget_gst_versioncSsdS)Nrr()rrrrrrrrros) GstInterfaceszgst.interfaces)GstAudioz gst.audio)GstVideoz gst.video)GstBasezgst.base BaseTransformBaseSink) GstControllerzgst.controller)r() GstPbutilsz gst.pbutils)r3r8rr7rrr/rZRegistryrZElementregisterZElementFactoryZmakeZCapsZnew_anyrrrrrrrr)rrrrrrrrrr enable_gstas@                rcCstdr dStjddddlm}td|t|ddt|d|jt|d |j t|d |j t|d |j t|d |j dS) NZ goocanvas GooCanvasz2.0r)rZ GOO_CANVAS_)r)Z ItemSimpleZItemrZGroupZRect) r3r8rr7rrr/rZCanvasItemSimpleZ CanvasItemZ CanvasImageZ CanvasGroupZ CanvasRect)rrrrenable_goocanvass    r)Nr)N)rB)r)__doc__rr` collectionsrrrZimpr ImportErrorr8r7rr rrrr0rrr/r3r9rArrrrrrrrrrr!sB       !     ,__pycache__/__init__.cpython-36.opt-1.pyc000064400000000624152525342270014111 0ustar003 <_#@s@ddlmZmZmZmZmZmZmZmZdddddddd gZ d S) )enable enable_gtk enable_vteenable_poppler enable_webkit enable_gudev enable_gstenable_goocanvasrrrrrrrr N) Z pygtkcompatrrrrrrrr __all__r r /usr/lib64/python3.6/__init__.pys( __pycache__/pygtkcompat.cpython-36.opt-1.pyc000064400000050200152525342270014707 0ustar003 <_T@sdZddlZddlZy>ddlmZeejejdddlmZWdQRXWn$e k rvddlmZeYnXddl Z ddl m Z gZ gZeZiZddZd d Zd$d d Zd%ddZddZddZd&ddZddZddZd'ddZddZd d!Zd"d#ZdS)(a PyGTK compatibility layer. This modules goes a little bit longer to maintain PyGTK compatibility than the normal overrides system. It is recommended to not depend on this layer, but only use it as an intermediate step when porting your application to PyGI. Compatibility might never be 100%, but the aim is to make it possible to run a well behaved PyGTK application mostly unmodified on top of PyGI. N)UserListignore)reload)GObjectcCs,t||t}t|||tj|||fdS)N)getattr_unsetsetattr_patchesappend)objname new_value old_valuer#/usr/lib64/python3.6/pygtkcompat.py_patch<s  rcCs*tjj|t}|tj|<tj||fdS)N)sysmodulesgetr_module_patchesr )r r rrrr _patch_moduleBs rc "Cs`|dkr |}|jjdddj}x6t|D](}yt||d}Wnw.YnXyht|tjrxV|jj D]H\}}|j }|j |dd}|r|j |r|t |d}t|||qnWWntk rw.YnXyjt|tjr} tj+d?t,| j-Gfd@dAdA} tdA| j.j/dfdCdD } tj.dE| j.j0dfdFdG } tj.dH| j1j/dfdIdJ } tj1dE| j1j0dfdKdL }tj1dH|j2j/dfdMdN }tj2dE|j2j0dfdOdP }tj2dH|j2j3t4ffdQdR }tj2dS|GdTdUdUj5}tdU|j6j7 t4f fdVdW }tj6dX|GfdYdZdZj6}tdZ|fd[d\}td]|fd^d_}td`|dadb}tj8dct,|fddde}tdf|dgdh}tj6di|tdjj9j:tdkj;jtdljtdnj.get_formats..make_dict)r )ZformatsrOrPrN)orig_get_formatsrr get_formatss  zenable_gtk..get_formatsZpixbuf_get_formatscsby@yjdddd}Wntk r2j}YnX||Wntk r\|}YnX|S)Nr)Z Rectangler%)windowZrect)rForig_get_frame_extentsrrget_frame_extentssz%enable_gtk..get_frame_extentsrUcs|ddS)Nrr)self)orig_get_originrr get_originszenable_gtk..get_originrXZ screen_widthZ screen_heightcs||jjfS)N)Z get_visualZget_best_depth)rS)orig_gdk_window_get_geometryrrgdk_window_get_geometry sz+enable_gtk..gdk_window_get_geometry get_geometryGtk)r\ZgdkZ pygtk_versioncZ gtk_versioncSstjdtjdddS)Nz%set_tool_item_type() is not supportedr]) stacklevel)warningswarnr8PyGIDeprecationWarning)Z menuactionZgtyperrrset_tool_item_type sz&enable_gtk..set_tool_item_typerccseZdZdfdd ZdS)zenable_gtk..Alignmentcs.j|||j_||j_||j_||j_dS)N)__init__Zpropsxalignyalignxscaleyscale)rVrfrgrhri)orig_Alignmentrrre*s  z&enable_gtk..Alignment.__init__N)rdrdrdrd)r __module__ __qualname__rer)rjrr Alignment)srmTcs|||||dS)Nr)rVchildexpandfillpadding) orig_pack_endrrpack_end7szenable_gtk..pack_endrscs|||||dS)Nr)rVrnrorprq)orig_pack_startrr pack_start=szenable_gtk..pack_startrucs|||dS)Nr)rVcellro)orig_tree_view_column_pack_endrrtree_view_column_pack_endEsz-enable_gtk..tree_view_column_pack_endcs|||dS)Nr)rVrvro) orig_tree_view_column_pack_startrrtree_view_column_pack_startKsz/enable_gtk..tree_view_column_pack_startcs|||dS)Nr)rVrvro)orig_cell_pack_endrr cell_pack_endSsz!enable_gtk..cell_pack_endcs|||dS)Nr)rVrvro)orig_cell_pack_startrrcell_pack_startYsz#enable_gtk..cell_pack_startcsfdd}||||dS)Ncs |dtkr|dd}|S)Nrrr)r)args)funcrrcallback`s  z8enable_gtk..set_cell_data_func..callbackr)rVrvr user_datar)orig_set_cell_data_func)rrset_cell_data_func_s z&enable_gtk..set_cell_data_funcrc@s eZdZdS)z'enable_gtk..GenericCellRendererN)rrkrlrrrrGenericCellRendererisrcsfdd}|||dS)Ncs |dtkr|dd}|S)Nrrr)r)r)rrrrrs  z>enable_gtk..combo_row_separator_func..callbackr)rVrrr)orig_combo_row_separator_func)rrcombo_row_separator_funcqs z,enable_gtk..combo_row_separator_funcset_row_separator_funccs(eZdZfddZddZddZdS)z!enable_gtk..ComboBoxEntrycsjj|fddi|dS)NZ has_entryT)ComboBoxre)rVkwds)r\rrre|sz*enable_gtk..ComboBoxEntry.__init__cSs|j|dS)N)set_entry_text_column)rVZ text_columnrrrset_text_columnsz1enable_gtk..ComboBoxEntry.set_text_columncSs|jS)N)Zget_entry_text_column)rVrrrget_text_columnsz1enable_gtk..ComboBoxEntry.get_text_columnN)rrkrlrerrr)r\rr ComboBoxEntry{s rcsjS)N)rr)r\rrcombo_box_entry_newsz'enable_gtk..combo_box_entry_newrcs j|dS)N)model)r)r)r\rrcombo_box_entry_new_with_modelsz2enable_gtk..combo_box_entry_new_with_modelrcSstjdtjdddS)Nz)install_child_property() is not supportedr])r_)r`rar8rb)Z containerr.Zpspecrrrinstall_child_propertysz*enable_gtk..install_child_propertyrcs*j}jt}|j||jd|S)Nr)rZ ListStorestrZ set_modelr)Zcombor)r\rrnew_texts    zenable_gtk..new_textZcombo_box_new_textcSs|j}|j|gdS)N)Z get_modelr )rVtextrrrr append_textszenable_gtk..append_textrZexpander_new_with_mnemonicZicon_theme_get_defaultZimage_new_from_pixbufZimage_new_from_stockZimage_new_from_animationZimage_new_from_icon_setZimage_new_from_fileZsettings_get_defaultZwindow_set_default_iconZ clipboard_getZ connect_groupZstatus_icon_position_menuZ set_tooltipcseZdZdfdd ZdS)zenable_gtk..HScaleNcsj||ddS)N) adjustment)re)rVr) orig_HScalerrresz#enable_gtk..HScale.__init__)N)rrkrlrer)rrrHScalesrcseZdZdfdd ZdS)zenable_gtk..VScaleNcsj||ddS)N)r)re)rVr) orig_VScalerrresz#enable_gtk..VScale.__init__)N)rrkrlrer)rrrVScalesrZ stock_addcSsdS)Nr)r!rrrszenable_gtk..rS)fgetZwidget_get_default_directioncsGdddt}||S)Nc@seZdZddZdS)z5enable_gtk..size_request..SizeRequestcSs(|j|_|j|_tj||j|jgdS)N)heightwidthrre)rVZreqrrrresz>enable_gtk..size_request..SizeRequest.__init__N)rrkrlrerrrr SizeRequestsr)r)widgetr)orig_size_requestrr size_requestsz enable_gtk..size_requestrZhide_allcs eZdZddZfddZdS)zenable_gtk..BaseGettercSs ||_dS)N)context)rVrrrrresz'enable_gtk..BaseGetter.__init__cs:|jj|}jt|jdt|jdt|jddS)Ni)redgreenblue)rZget_background_colorColorintrrr)rVstateZcolor)rFrr __getitem__s  z*enable_gtk..BaseGetter.__getitem__N)rrkrlrerr)rFrr BaseGettersrcseZdZfddZdS)zenable_gtk..Stylescs(|j}||_jdddd|_dS)Nr)rrr)Zget_style_contextbaserZblack)rVrr)rrFrrres z#enable_gtk..Styles.__init__N)rrkrlrer)rrFrrStylessrcseZdZfddZdS)z#enable_gtk..StyleDescriptorcs|S)Nr)rVinstanceZclass_)rrr__get__sz+enable_gtk..StyleDescriptor.__get__N)rrkrlrr)rrrStyleDescriptorsrZstyleF?cs||||||S)Nr)rVZmarkZ within_marginZ use_alignrfrg)orig_text_view_scroll_to_markrrtext_view_scroll_to_marksz,enable_gtk..text_view_scroll_to_markscroll_to_markrg?c s6j} jd} |dks"|dkrFt|d| _t|d| _| jjO} |dksV|dkrzt|d| _t|d| _| jjO} |dks|dkrt|d| _ t|d| _ | jj O} |dks| dkrt|d| _ t| d| _ | jjO} | dks| dkr(| dks| dkrtd| | _| | _| jjO} ||| | S)Nrgzaspect ratios must be positive)ZGeometryZ WindowHintsmax min_width min_heightZMIN_SIZE max_width max_heightZMAX_SIZE base_width base_heightZ BASE_SIZE width_inc height_incZ RESIZE_INCr% min_aspect max_aspectZASPECT)rVZgeometry_widgetrrrrrrrrrrZgeometryZ geom_mask)rForig_set_geometry_hintsrrset_geometry_hintss2              z&enable_gtk..set_geometry_hintsrZwindow_list_toplevelsZwindow_set_default_icon_namec@s eZdZdS)zenable_gtk..UnixPrintN)rrkrlrrrr UnixPrint'srZ gtkunixprintr)category)keysymsz gtk.keysymsr)generictreemodelGenericTreeModel)r:r)r]r^r)TTr)TTr)T)T)T)T)Frrrrrrrrrr) Nrrrrrrrrrr)ar3r1rrr?r@r8require_versionr7rCrr/rDrErFrGrZScreen get_defaultrJrKZ new_with_typeZ new_from_dataZ new_from_fileZnew_from_file_at_scaleAttributeErrorZnew_from_file_at_sizeZnew_from_inlineZnew_from_streamZnew_from_stream_at_scaleZnew_from_xpm_dataZ get_file_inforRZWindowrUrXrrr[r\Z MAJOR_VERSIONZ MINOR_VERSIONZ MICRO_VERSIONZAction classmethodrmZBoxrsruZTreeViewColumnZ CellLayoutrrZ CellRendererrr ContainerZExpanderZnew_with_mnemonicZ IconThemeImageZnew_from_pixbufZnew_from_stockZnew_from_animationZnew_from_icon_setZSettingsZset_default_iconZ ClipboardrZ AccelGroupZconnectZ StatusIconZ position_menuZset_tooltip_textrrZWidgetpropertyZ get_windowZget_default_directionrZhideobjectZTextViewrrZlist_toplevelsZset_default_icon_namer`catch_warnings simplefilterRuntimeWarningZ gi.overridesrrrr)$r2rCrDrErGrRrUrXrZrcrmrsrurxrzr|r~rrrrrrrrrrrrrrrrZ unixprintrrr)rrFr\rrjrrr{r}rrYrQrTrWrrrtrrrrrwryr enable_gtksD                                             #     rcCs2tdr dStjddddlm}td|dS)NZvteVtez0.0r)r)r3r8rr7rr)rrrr enable_vte9s   rcCs>tdr dStjddddlm}td|t|dddS) NZpopplerPopplerz0.18r)rZpypoppler_versionr)rrr)r3r8rr7rrr)rrrrenable_popplerBs    r1.0cCsFtd|rdStjd|ddlm}td|t|jd|jjdS)NZwebkitWebKitr)rZget_web_inspector) r3r8rr7rrrZWebViewZ get_inspector)r2rrrr enable_webkitMs     rcCs2tdr dStjddddlm}td|dS)NZgudevGUdevz1.0r)r)r3r8rr7rr)rrrr enable_gudevXs   rcCsntdr dStjddddlm}td|t|t|d|jj t|d|j j t|d|j j t|d |jjt|d d d t|d dd ddlm}td|t|ddlm}td|t|ddlm}td|t|ddlm}td|t|t|d|jt|d|jddlm}td|t||dddlm}td|t|dS)NZgstGstz0.10r)rZregistry_get_defaultZelement_registerZelement_factory_makeZ caps_new_anyZget_pygst_versioncSsdS)Nr )rrrrrrrrrnszenable_gst..Zget_gst_versioncSsdS)Nrr()rrrrrrrrros) GstInterfaceszgst.interfaces)GstAudioz gst.audio)GstVideoz gst.video)GstBasezgst.base BaseTransformBaseSink) GstControllerzgst.controller)r() GstPbutilsz gst.pbutils)r3r8rr7rrr/rZRegistryrZElementregisterZElementFactoryZmakeZCapsZnew_anyrrrrrrrr)rrrrrrrrrr enable_gstas@                rcCstdr dStjddddlm}td|t|ddt|d|jt|d |j t|d |j t|d |j t|d |j dS) NZ goocanvas GooCanvasz2.0r)rZ GOO_CANVAS_)r)Z ItemSimpleZItemrZGroupZRect) r3r8rr7rrr/rZCanvasItemSimpleZ CanvasItemZ CanvasImageZ CanvasGroupZ CanvasRect)rrrrenable_goocanvass    r)Nr)N)rB)r)__doc__rr` collectionsrrrZimpr ImportErrorr8r7rr rrrr0rrr/r3r9rArrrrrrrrrrr!sB       !     ,__pycache__/generictreemodel.cpython-36.pyc000064400000034302152525342270014730 0ustar003 <_6@stddlZddlZddlZddlZddlmZddlmZGdddejZddZ dd Z Gd d d ejej Z dS) N)GObject)Gtkc@s<eZdZdejfdejfdejfdejfgZeddZdS) _CTreeIterstamp user_dataZ user_data2Z user_data3cCs$tjt}tj|jt||S)N)sys getsizeofobjectctypesZPOINTERZ from_addressid)clsiteroffsetr(/usr/lib64/python3.6/generictreemodel.py from_iter&s z_CTreeIter.from_iterN) __name__ __module__ __qualname__r Zc_intZc_void_pZ_fields_ classmethodrrrrrr s  rcCstj|}tj|jjtjjS)N)rrr castcontentsrZ py_objectvalue)r Zciterrrr_get_user_data_as_pyobject,s rcsfdd}|S)a]Returns a function which can act as a decorator for wrapping exceptions and returning "default_return" upon an exception being thrown. This is used to wrap Gtk.TreeModel "do_" method implementations so we can return a proper value from the override upon an exception occurring with client code implemented by the "on_" methods. csfdd}|S)Nc s*y ||StjtjYnXS)N)r excepthookexc_info)argsZkargs)default_returnfuncrr wrapped_func:s  z9handle_exception..decorator..wrapped_funcr)rr)r)rr decorator9sz#handle_exception..decoratorr)rr r)rrhandle_exception1s r!cseZdZdZejdeddZfddZddZ d d Z d d Z d dZ ddZ ddZddZddZdTfdd ZedddZedddZeejdd ZedUd"d#Zed!d$d%Zedd&d'Zedd(d)ZedVd*d+Zed!d,d-Zedd.d/ZedWd0d1ZedXd2d3Zedd4d5Z edd6d7Z!d8d9Z"d:d;Z#dd?Z%d@dAZ&dBdCZ'dDdEZ(dFdGZ)dHdIZ*dJdKZ+dLdMZ,dNdOZ-dPdQZ.dRdSZ/Z0S)YGenericTreeModelaA base implementation of a Gtk.TreeModel for python. The GenericTreeModel eases implementing the Gtk.TreeModel interface in Python. The class can be subclassed to provide a TreeModel implementation which works directly with Python objects instead of iterators. All of the on_* methods should be overridden by subclasses to provide the underlying implementation a way to access custom model data. For the purposes of this API, all custom model data supplied or handed back through the overridable API will use the argument names: node, parent, and child in regards to user data python objects. The create_tree_iter, set_user_data, invalidate_iters, iter_is_valid methods are available to help manage Gtk.TreeIter objects and their Python object references. GenericTreeModel manages a pool of user data nodes that have been used with iters. This pool stores a references to user data nodes as a dictionary value with the key being the integer id of the data. This id is what the Gtk.TreeIter objects use to reference data in the pool. References will be removed from the pool when the model is deleted or explicitly by using the optional "node" argument to the "row_deleted" method when notifying the model of row deletion. TzIf True, strong references to user data attached to iters are stored in a dictionary pool (default). Otherwise the user data is stored as a raw pointer to a python object without a reference.)defaulttypeZblurbcs(tt|jd|_t|_|jdS)zFInitialize. Make sure to call this from derived classes if overridden.rN)superr"__init__rdict _held_refsinvalidate_iters)self) __class__rrr&gszGenericTreeModel.__init__c#sbtjdg}xP|r\|jdk r.jVfddtjD}|jt|qWdS)zHDepth-first iteration of the entire TreeModel yielding the python nodes.Ncsg|]}j|qSr)Ziter_nth_child).0i)itr*rr ysz5GenericTreeModel.iter_depth_first..) collectionsdequepopleft get_user_datarangeZiter_n_children extendleftreversed)r*stackZchildrenr)r.r*riter_depth_firstrs  z!GenericTreeModel.iter_depth_firstcCs,d|_|jr(|j|jkr"|j|j=d|_dS)z?Clear user data and its reference from the iter and this model.rN)rrr()r*r rrrinvalidate_iter|s   z GenericTreeModel.invalidate_itercCstjdd|_|jjdS)z This method invalidates all TreeIter objects associated with this custom tree model and frees their locally pooled references. liNi)randomZrandintrr(clear)r*rrrr)sz!GenericTreeModel.invalidate_iterscCs |j|jkS)zv :Returns: True if the gtk.TreeIter specified by iter is valid for the custom tree model. )r)r*r rrr iter_is_validszGenericTreeModel.iter_is_validcCs|jr|j|jSt|SdS)zGet the user_data associated with the given TreeIter. GenericTreeModel stores arbitrary Python objects mapped to instances of Gtk.TreeIter. This method allows to retrieve the Python object held by the given iterator. N)leak_referencesr(rr)r*r rrrr3s zGenericTreeModel.get_user_datacCs<t||_|dkr|j|n|j|_|jr8||j|j<dS)zApplies user_data and stamp to the given iter. If the models "leak_references" property is set, a reference to the user_data is stored with the model to ensure we don't run into bad memory problems with the TreeIter. N)r rr9rr=r()r*r rrrr set_user_datas   zGenericTreeModel.set_user_datacCstj}|j|||S)aCreate a Gtk.TreeIter instance with the given user_data specific for this model. Use this method to create Gtk.TreeIter instance instead of directly calling Gtk.Treeiter(), this will ensure proper reference managment of wrapped used_data. )rZTreeIterr>)r*rr rrrcreate_tree_iters z!GenericTreeModel.create_tree_itercCs"|dkr dS|j|}d|fSdS)zyInternal creation of a (bool, TreeIter) pair for returning directly back to the view interfacing with this model.NFT)FN)r?)r*datar.rrr_create_tree_iters z"GenericTreeModel._create_tree_iterNcs.tt|j|t|}||jkr*|j|=dS)aNotify the model a row has been deleted. Use the node parameter to ensure the user_data reference associated with the path is properly freed by this model. :Parameters: path : Gtk.TreePath Path to the row that has been deleted. node : object Python object used as the node returned from "on_get_iter". This is optional but ensures the model will not leak references to this object. N)r%r" row_deletedr r()r*pathnodeZnode_id)r+rrrBs  zGenericTreeModel.row_deletedrcCs|jS)zInternal method.) on_get_flags)r*rrr do_get_flagsszGenericTreeModel.do_get_flagscCs|jS)zInternal method.)on_get_n_columns)r*rrrdo_get_n_columnssz!GenericTreeModel.do_get_n_columnscCs |j|S)zInternal method.)on_get_column_type)r*indexrrrdo_get_column_typesz#GenericTreeModel.do_get_column_typeFcCs|j|j|S)zInternal method.)rA on_get_iter)r*rCrrr do_get_iterszGenericTreeModel.do_get_itercCs8|dkr|jd}n|j|j|}|j|||dk S)zInternal method.N) on_iter_nextr3r>)r*r Z next_datarrr do_iter_nexts   zGenericTreeModel.do_iter_nextcCs*|j|j|}|dkrdStj|SdS)zInternal method.N) on_get_pathr3rZTreePath)r*r rCrrr do_get_pathszGenericTreeModel.do_get_pathcCs|j|j||S)zInternal method.) on_get_valuer3)r*r columnrrr do_get_valueszGenericTreeModel.do_get_valuecCs"|r|j|nd}|j|j|S)zInternal method.N)r3rAon_iter_children)r*parentr@rrrdo_iter_childrensz!GenericTreeModel.do_iter_childrencCs|j|j|S)zInternal method.)on_iter_has_childr3)r*rVrrrdo_iter_has_child sz"GenericTreeModel.do_iter_has_childcCs"|dkr|jdS|j|j|S)zInternal method.N)on_iter_n_childrenr3)r*r rrrdo_iter_n_childrens z#GenericTreeModel.do_iter_n_childrencCs2|dkr|jd|}n|j|j||}|j|S)zInternal method.N)on_iter_nth_childr3rA)r*rVnr@rrrdo_iter_nth_childsz"GenericTreeModel.do_iter_nth_childcCs|j|j|j|S)zInternal method.)rAon_iter_parentr3)r*childrrrdo_iter_parentszGenericTreeModel.do_iter_parentcCs|j|j|dS)N) on_ref_noder3)r*r rrr do_ref_node#szGenericTreeModel.do_ref_nodecCs|j|j|dS)N) on_unref_noder3)r*r rrr do_unref_node'szGenericTreeModel.do_unref_nodecCstdS)zyOverridable. :Returns Gtk.TreeModelFlags: The flags for this model. See: Gtk.TreeModelFlags N)NotImplementedError)r*rrrrE.szGenericTreeModel.on_get_flagscCstdS)zZOverridable. :Returns: The number of columns for this model. N)rf)r*rrrrG6sz!GenericTreeModel.on_get_n_columnscCstdS)zYOverridable. :Returns: The column type for the given index. N)rf)r*rJrrrrI>sz#GenericTreeModel.on_get_column_typecCstdS)zcOverridable. :Returns: A python object (node) for the given TreePath. N)rf)r*rCrrrrLFszGenericTreeModel.on_get_itercCstdS)zOverridable. :Parameters: node : object Node at current level. :Returns: A python object (node) following the given node at the current level. N)rf)r*rDrrrrNNs zGenericTreeModel.on_iter_nextcCstdS)zSOverridable. :Returns: A TreePath for the given node. N)rf)r*rDrrrrPZszGenericTreeModel.on_get_pathcCstdS)zOverridable. :Parameters: node : object column : int Column index to get the value from. :Returns: The value of the column for the given node.N)rf)r*rDrSrrrrRbs zGenericTreeModel.on_get_valuecCstdS)zOverridable. :Returns: The first child of parent or None if parent has no children. If parent is None, return the first node of the model. N)rf)r*rVrrrrUnsz!GenericTreeModel.on_iter_childrencCstdS)zYOverridable. :Returns: True if the given node has children. N)rf)r*rDrrrrXwsz"GenericTreeModel.on_iter_has_childcCstdS)zOverridable. :Returns: The number of children for the given node. If node is None, return the number of top level nodes. N)rf)r*rDrrrrZsz#GenericTreeModel.on_iter_n_childrencCstdS)ahOverridable. :Parameters: parent : object n : int Index of child within parent. :Returns: The child for the given parent index starting at 0. If parent None, return the top level node corresponding to "n". If "n" is larger then available nodes, return None. N)rf)r*rVr]rrrr\s z"GenericTreeModel.on_iter_nth_childcCstdS)zjOverridable. :Returns: The parent node of child or None if child is a top level node.N)rf)r*r`rrrr_szGenericTreeModel.on_iter_parentcCsdS)Nr)r*rDrrrrbszGenericTreeModel.on_ref_nodecCsdS)Nr)r*rDrrrrdszGenericTreeModel.on_unref_node)N)FN)FN)FN)FN)1rrr__doc__rZPropertyboolr=r&r8r9r)r<r3r>r?rArBr!rFrHZ TYPE_INVALIDrKrMrOrQrTrWrYr[r^rarcrerErGrIrLrNrPrRrUrXrZr\r_rbrd __classcell__rr)r+rr"FsR            r") rr:r0r Z gi.repositoryrrZ Structurerrr!Z TreeModelr"rrrrs   __pycache__/__init__.cpython-36.pyc000064400000000624152525342270013152 0ustar003 <_#@s@ddlmZmZmZmZmZmZmZmZdddddddd gZ d S) )enable enable_gtk enable_vteenable_poppler enable_webkit enable_gudev enable_gstenable_goocanvasrrrrrrrr N) Z pygtkcompatrrrrrrrr __all__r r /usr/lib64/python3.6/__init__.pys( __init__.py000064400000001043152525342270006662 0ustar00 # pyflakes.ignore from .pygtkcompat import (enable, enable_gtk, enable_vte, enable_poppler, enable_webkit, enable_gudev, enable_gst, enable_goocanvas) __all__ = ['enable', 'enable_gtk', 'enable_vte', 'enable_poppler', 'enable_webkit', 'enable_gudev', 'enable_gst', 'enable_goocanvas'] pygtkcompat.py000064400000052351152525342270007475 0ustar00# -*- Mode: Python; py-indent-offset: 4 -*- # vim: tabstop=4 shiftwidth=4 expandtab # # Copyright (C) 2011-2012 Johan Dahlin # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 # USA """ PyGTK compatibility layer. This modules goes a little bit longer to maintain PyGTK compatibility than the normal overrides system. It is recommended to not depend on this layer, but only use it as an intermediate step when porting your application to PyGI. Compatibility might never be 100%, but the aim is to make it possible to run a well behaved PyGTK application mostly unmodified on top of PyGI. """ import sys import warnings try: # Python 3 from collections import UserList UserList # pyflakes with warnings.catch_warnings(): warnings.simplefilter('ignore') from imp import reload except ImportError: # Python 2 ships that in a different module from UserList import UserList UserList # pyflakes import gi from gi.repository import GObject _patches = [] _module_patches = [] _unset = object() _enabled_registry = {} def _patch(obj, name, new_value): old_value = getattr(obj, name, _unset) setattr(obj, name, new_value) _patches.append((obj, name, old_value)) def _patch_module(name, new_value): old_value = sys.modules.get(name, _unset) sys.modules[name] = new_value _module_patches.append((name, old_value)) def _install_enums(module, dest=None, strip=''): if dest is None: dest = module modname = dest.__name__.rsplit('.', 1)[1].upper() for attr in dir(module): try: obj = getattr(module, attr, None) except: continue try: if issubclass(obj, GObject.GEnum): for value, enum in obj.__enum_values__.items(): name = enum.value_name name = name.replace(modname + '_', '') if strip and name.startswith(strip): name = name[len(strip):] _patch(dest, name, enum) except TypeError: continue try: if issubclass(obj, GObject.GFlags): for value, flag in obj.__flags_values__.items(): try: name = flag.value_names[-1].replace(modname + '_', '') except IndexError: # FIXME: this happens for some large flags which do not # fit into a long on 32 bit systems continue _patch(dest, name, flag) except TypeError: continue def _check_enabled(name, version=None): """Returns True in case it is already enabled""" if name in _enabled_registry: enabled_version = _enabled_registry[name] if enabled_version != version: raise ValueError( "%r already enabled with different version (%r)" % ( name, enabled_version)) return True else: _enabled_registry[name] = version return False def enable(): if _check_enabled(""): return # gobject from gi.repository import GLib _patch_module('glib', GLib) # gobject from gi.repository import GObject _patch_module('gobject', GObject) from gi import _propertyhelper _patch_module('gobject.propertyhelper', _propertyhelper) # gio from gi.repository import Gio _patch_module('gio', Gio) def _disable_all(): """Reverse all effects of the enable_xxx() calls except for require_version() calls and imports. """ _enabled_registry.clear() for obj, name, old_value in reversed(_patches): if old_value is _unset: delattr(obj, name) else: # try if deleting is enough (for override proxies) delattr(obj, name) if getattr(obj, name, _unset) is not old_value: setattr(obj, name, old_value) del _patches[:] for name, old_value in reversed(_module_patches): if old_value is _unset: del sys.modules[name] else: sys.modules[name] = old_value del _module_patches[:] reload(sys) if sys.version_info < (3, 0): sys.setdefaultencoding('ascii') def enable_gtk(version='3.0'): if _check_enabled("gtk", version): return if version == "4.0": raise ValueError("version 4.0 not supported") # set the default encoding like PyGTK reload(sys) if sys.version_info < (3, 0): sys.setdefaultencoding('utf-8') # atk gi.require_version('Atk', '1.0') from gi.repository import Atk _patch_module('atk', Atk) _install_enums(Atk) # pango gi.require_version('Pango', '1.0') from gi.repository import Pango _patch_module('pango', Pango) _install_enums(Pango) # pangocairo gi.require_version('PangoCairo', '1.0') from gi.repository import PangoCairo _patch_module('pangocairo', PangoCairo) # gdk gi.require_version('Gdk', version) gi.require_version('GdkPixbuf', '2.0') from gi.repository import Gdk from gi.repository import GdkPixbuf _patch_module('gtk.gdk', Gdk) _install_enums(Gdk) _install_enums(GdkPixbuf, dest=Gdk) _patch(Gdk, "_2BUTTON_PRESS", 5) _patch(Gdk, "BUTTON_PRESS", 4) _patch(Gdk, "screen_get_default", Gdk.Screen.get_default) _patch(Gdk, "Pixbuf", GdkPixbuf.Pixbuf) _patch(Gdk, "PixbufLoader", GdkPixbuf.PixbufLoader.new_with_type) _patch(Gdk, "pixbuf_new_from_data", GdkPixbuf.Pixbuf.new_from_data) _patch(Gdk, "pixbuf_new_from_file", GdkPixbuf.Pixbuf.new_from_file) try: _patch(Gdk, "pixbuf_new_from_file_at_scale", GdkPixbuf.Pixbuf.new_from_file_at_scale) except AttributeError: pass _patch(Gdk, "pixbuf_new_from_file_at_size", GdkPixbuf.Pixbuf.new_from_file_at_size) _patch(Gdk, "pixbuf_new_from_inline", GdkPixbuf.Pixbuf.new_from_inline) _patch(Gdk, "pixbuf_new_from_stream", GdkPixbuf.Pixbuf.new_from_stream) _patch(Gdk, "pixbuf_new_from_stream_at_scale", GdkPixbuf.Pixbuf.new_from_stream_at_scale) _patch(Gdk, "pixbuf_new_from_xpm_data", GdkPixbuf.Pixbuf.new_from_xpm_data) _patch(Gdk, "pixbuf_get_file_info", GdkPixbuf.Pixbuf.get_file_info) orig_get_formats = GdkPixbuf.Pixbuf.get_formats def get_formats(): formats = orig_get_formats() result = [] def make_dict(format_): result = {} result['description'] = format_.get_description() result['name'] = format_.get_name() result['mime_types'] = format_.get_mime_types() result['extensions'] = format_.get_extensions() return result for format_ in formats: result.append(make_dict(format_)) return result _patch(Gdk, "pixbuf_get_formats", get_formats) orig_get_frame_extents = Gdk.Window.get_frame_extents def get_frame_extents(window): try: try: rect = Gdk.Rectangle(0, 0, 0, 0) except TypeError: rect = Gdk.Rectangle() orig_get_frame_extents(window, rect) except TypeError: rect = orig_get_frame_extents(window) return rect _patch(Gdk.Window, "get_frame_extents", get_frame_extents) orig_get_origin = Gdk.Window.get_origin def get_origin(self): return orig_get_origin(self)[1:] _patch(Gdk.Window, "get_origin", get_origin) _patch(Gdk, "screen_width", Gdk.Screen.width) _patch(Gdk, "screen_height", Gdk.Screen.height) orig_gdk_window_get_geometry = Gdk.Window.get_geometry def gdk_window_get_geometry(window): return orig_gdk_window_get_geometry(window) + (window.get_visual().get_best_depth(),) _patch(Gdk.Window, "get_geometry", gdk_window_get_geometry) # gtk gi.require_version('Gtk', version) from gi.repository import Gtk _patch_module('gtk', Gtk) _patch(Gtk, "gdk", Gdk) _patch(Gtk, "pygtk_version", (2, 99, 0)) _patch(Gtk, "gtk_version", (Gtk.MAJOR_VERSION, Gtk.MINOR_VERSION, Gtk.MICRO_VERSION)) _install_enums(Gtk) # Action def set_tool_item_type(menuaction, gtype): warnings.warn('set_tool_item_type() is not supported', gi.PyGIDeprecationWarning, stacklevel=2) _patch(Gtk.Action, "set_tool_item_type", classmethod(set_tool_item_type)) # Alignment orig_Alignment = Gtk.Alignment class Alignment(orig_Alignment): def __init__(self, xalign=0.0, yalign=0.0, xscale=0.0, yscale=0.0): orig_Alignment.__init__(self) self.props.xalign = xalign self.props.yalign = yalign self.props.xscale = xscale self.props.yscale = yscale _patch(Gtk, "Alignment", Alignment) # Box orig_pack_end = Gtk.Box.pack_end def pack_end(self, child, expand=True, fill=True, padding=0): orig_pack_end(self, child, expand, fill, padding) _patch(Gtk.Box, "pack_end", pack_end) orig_pack_start = Gtk.Box.pack_start def pack_start(self, child, expand=True, fill=True, padding=0): orig_pack_start(self, child, expand, fill, padding) _patch(Gtk.Box, "pack_start", pack_start) # TreeViewColumn orig_tree_view_column_pack_end = Gtk.TreeViewColumn.pack_end def tree_view_column_pack_end(self, cell, expand=True): orig_tree_view_column_pack_end(self, cell, expand) _patch(Gtk.TreeViewColumn, "pack_end", tree_view_column_pack_end) orig_tree_view_column_pack_start = Gtk.TreeViewColumn.pack_start def tree_view_column_pack_start(self, cell, expand=True): orig_tree_view_column_pack_start(self, cell, expand) _patch(Gtk.TreeViewColumn, "pack_start", tree_view_column_pack_start) # CellLayout orig_cell_pack_end = Gtk.CellLayout.pack_end def cell_pack_end(self, cell, expand=True): orig_cell_pack_end(self, cell, expand) _patch(Gtk.CellLayout, "pack_end", cell_pack_end) orig_cell_pack_start = Gtk.CellLayout.pack_start def cell_pack_start(self, cell, expand=True): orig_cell_pack_start(self, cell, expand) _patch(Gtk.CellLayout, "pack_start", cell_pack_start) orig_set_cell_data_func = Gtk.CellLayout.set_cell_data_func def set_cell_data_func(self, cell, func, user_data=_unset): def callback(*args): if args[-1] == _unset: args = args[:-1] return func(*args) orig_set_cell_data_func(self, cell, callback, user_data) _patch(Gtk.CellLayout, "set_cell_data_func", set_cell_data_func) # CellRenderer class GenericCellRenderer(Gtk.CellRenderer): pass _patch(Gtk, "GenericCellRenderer", GenericCellRenderer) # ComboBox orig_combo_row_separator_func = Gtk.ComboBox.set_row_separator_func def combo_row_separator_func(self, func, user_data=_unset): def callback(*args): if args[-1] == _unset: args = args[:-1] return func(*args) orig_combo_row_separator_func(self, callback, user_data) _patch(Gtk.ComboBox, "set_row_separator_func", combo_row_separator_func) # ComboBoxEntry class ComboBoxEntry(Gtk.ComboBox): def __init__(self, **kwds): Gtk.ComboBox.__init__(self, has_entry=True, **kwds) def set_text_column(self, text_column): self.set_entry_text_column(text_column) def get_text_column(self): return self.get_entry_text_column() _patch(Gtk, "ComboBoxEntry", ComboBoxEntry) def combo_box_entry_new(): return Gtk.ComboBoxEntry() _patch(Gtk, "combo_box_entry_new", combo_box_entry_new) def combo_box_entry_new_with_model(model): return Gtk.ComboBoxEntry(model=model) _patch(Gtk, "combo_box_entry_new_with_model", combo_box_entry_new_with_model) # Container def install_child_property(container, flag, pspec): warnings.warn('install_child_property() is not supported', gi.PyGIDeprecationWarning, stacklevel=2) _patch(Gtk.Container, "install_child_property", classmethod(install_child_property)) def new_text(): combo = Gtk.ComboBox() model = Gtk.ListStore(str) combo.set_model(model) combo.set_entry_text_column(0) return combo _patch(Gtk, "combo_box_new_text", new_text) def append_text(self, text): model = self.get_model() model.append([text]) _patch(Gtk.ComboBox, "append_text", append_text) _patch(Gtk, "expander_new_with_mnemonic", Gtk.Expander.new_with_mnemonic) _patch(Gtk, "icon_theme_get_default", Gtk.IconTheme.get_default) _patch(Gtk, "image_new_from_pixbuf", Gtk.Image.new_from_pixbuf) _patch(Gtk, "image_new_from_stock", Gtk.Image.new_from_stock) _patch(Gtk, "image_new_from_animation", Gtk.Image.new_from_animation) _patch(Gtk, "image_new_from_icon_set", Gtk.Image.new_from_icon_set) _patch(Gtk, "image_new_from_file", Gtk.Image.new_from_file) _patch(Gtk, "settings_get_default", Gtk.Settings.get_default) _patch(Gtk, "window_set_default_icon", Gtk.Window.set_default_icon) try: _patch(Gtk, "clipboard_get", Gtk.Clipboard.get) except AttributeError: pass # AccelGroup _patch(Gtk.AccelGroup, "connect_group", Gtk.AccelGroup.connect) # StatusIcon _patch(Gtk, "status_icon_position_menu", Gtk.StatusIcon.position_menu) _patch(Gtk.StatusIcon, "set_tooltip", Gtk.StatusIcon.set_tooltip_text) # Scale orig_HScale = Gtk.HScale orig_VScale = Gtk.VScale class HScale(orig_HScale): def __init__(self, adjustment=None): orig_HScale.__init__(self, adjustment=adjustment) _patch(Gtk, "HScale", HScale) class VScale(orig_VScale): def __init__(self, adjustment=None): orig_VScale.__init__(self, adjustment=adjustment) _patch(Gtk, "VScale", VScale) _patch(Gtk, "stock_add", lambda items: None) # Widget _patch(Gtk.Widget, "window", property(fget=Gtk.Widget.get_window)) _patch(Gtk, "widget_get_default_direction", Gtk.Widget.get_default_direction) orig_size_request = Gtk.Widget.size_request def size_request(widget): class SizeRequest(UserList): def __init__(self, req): self.height = req.height self.width = req.width UserList.__init__(self, [self.width, self.height]) return SizeRequest(orig_size_request(widget)) _patch(Gtk.Widget, "size_request", size_request) _patch(Gtk.Widget, "hide_all", Gtk.Widget.hide) class BaseGetter(object): def __init__(self, context): self.context = context def __getitem__(self, state): color = self.context.get_background_color(state) return Gdk.Color(red=int(color.red * 65535), green=int(color.green * 65535), blue=int(color.blue * 65535)) class Styles(object): def __init__(self, widget): context = widget.get_style_context() self.base = BaseGetter(context) self.black = Gdk.Color(red=0, green=0, blue=0) class StyleDescriptor(object): def __get__(self, instance, class_): return Styles(instance) _patch(Gtk.Widget, "style", StyleDescriptor()) # TextView orig_text_view_scroll_to_mark = Gtk.TextView.scroll_to_mark def text_view_scroll_to_mark(self, mark, within_margin, use_align=False, xalign=0.5, yalign=0.5): return orig_text_view_scroll_to_mark(self, mark, within_margin, use_align, xalign, yalign) _patch(Gtk.TextView, "scroll_to_mark", text_view_scroll_to_mark) # Window orig_set_geometry_hints = Gtk.Window.set_geometry_hints def set_geometry_hints(self, geometry_widget=None, min_width=-1, min_height=-1, max_width=-1, max_height=-1, base_width=-1, base_height=-1, width_inc=-1, height_inc=-1, min_aspect=-1.0, max_aspect=-1.0): geometry = Gdk.Geometry() geom_mask = Gdk.WindowHints(0) if min_width >= 0 or min_height >= 0: geometry.min_width = max(min_width, 0) geometry.min_height = max(min_height, 0) geom_mask |= Gdk.WindowHints.MIN_SIZE if max_width >= 0 or max_height >= 0: geometry.max_width = max(max_width, 0) geometry.max_height = max(max_height, 0) geom_mask |= Gdk.WindowHints.MAX_SIZE if base_width >= 0 or base_height >= 0: geometry.base_width = max(base_width, 0) geometry.base_height = max(base_height, 0) geom_mask |= Gdk.WindowHints.BASE_SIZE if width_inc >= 0 or height_inc >= 0: geometry.width_inc = max(width_inc, 0) geometry.height_inc = max(height_inc, 0) geom_mask |= Gdk.WindowHints.RESIZE_INC if min_aspect >= 0.0 or max_aspect >= 0.0: if min_aspect <= 0.0 or max_aspect <= 0.0: raise TypeError("aspect ratios must be positive") geometry.min_aspect = min_aspect geometry.max_aspect = max_aspect geom_mask |= Gdk.WindowHints.ASPECT return orig_set_geometry_hints(self, geometry_widget, geometry, geom_mask) _patch(Gtk.Window, "set_geometry_hints", set_geometry_hints) _patch(Gtk, "window_list_toplevels", Gtk.Window.list_toplevels) _patch(Gtk, "window_set_default_icon_name", Gtk.Window.set_default_icon_name) # gtk.unixprint class UnixPrint(object): pass unixprint = UnixPrint() _patch_module('gtkunixprint', unixprint) # gtk.keysyms with warnings.catch_warnings(): warnings.simplefilter('ignore', category=RuntimeWarning) from gi.overrides import keysyms _patch_module('gtk.keysyms', keysyms) _patch(Gtk, "keysyms", keysyms) from . import generictreemodel _patch(Gtk, "GenericTreeModel", generictreemodel.GenericTreeModel) def enable_vte(): if _check_enabled("vte"): return gi.require_version('Vte', '0.0') from gi.repository import Vte _patch_module('vte', Vte) def enable_poppler(): if _check_enabled("poppler"): return gi.require_version('Poppler', '0.18') from gi.repository import Poppler _patch_module('poppler', Poppler) _patch(Poppler, "pypoppler_version", (1, 0, 0)) def enable_webkit(version='1.0'): if _check_enabled("webkit", version): return gi.require_version('WebKit', version) from gi.repository import WebKit _patch_module('webkit', WebKit) _patch(WebKit.WebView, "get_web_inspector", WebKit.WebView.get_inspector) def enable_gudev(): if _check_enabled("gudev"): return gi.require_version('GUdev', '1.0') from gi.repository import GUdev _patch_module('gudev', GUdev) def enable_gst(): if _check_enabled("gst"): return gi.require_version('Gst', '0.10') from gi.repository import Gst _patch_module('gst', Gst) _install_enums(Gst) _patch(Gst, "registry_get_default", Gst.Registry.get_default) _patch(Gst, "element_register", Gst.Element.register) _patch(Gst, "element_factory_make", Gst.ElementFactory.make) _patch(Gst, "caps_new_any", Gst.Caps.new_any) _patch(Gst, "get_pygst_version", lambda: (0, 10, 19)) _patch(Gst, "get_gst_version", lambda: (0, 10, 40)) from gi.repository import GstInterfaces _patch_module('gst.interfaces', GstInterfaces) _install_enums(GstInterfaces) from gi.repository import GstAudio _patch_module('gst.audio', GstAudio) _install_enums(GstAudio) from gi.repository import GstVideo _patch_module('gst.video', GstVideo) _install_enums(GstVideo) from gi.repository import GstBase _patch_module('gst.base', GstBase) _install_enums(GstBase) _patch(Gst, "BaseTransform", GstBase.BaseTransform) _patch(Gst, "BaseSink", GstBase.BaseSink) from gi.repository import GstController _patch_module('gst.controller', GstController) _install_enums(GstController, dest=Gst) from gi.repository import GstPbutils _patch_module('gst.pbutils', GstPbutils) _install_enums(GstPbutils) def enable_goocanvas(): if _check_enabled("goocanvas"): return gi.require_version('GooCanvas', '2.0') from gi.repository import GooCanvas _patch_module('goocanvas', GooCanvas) _install_enums(GooCanvas, strip='GOO_CANVAS_') _patch(GooCanvas, "ItemSimple", GooCanvas.CanvasItemSimple) _patch(GooCanvas, "Item", GooCanvas.CanvasItem) _patch(GooCanvas, "Image", GooCanvas.CanvasImage) _patch(GooCanvas, "Group", GooCanvas.CanvasGroup) _patch(GooCanvas, "Rect", GooCanvas.CanvasRect) generictreemodel.py000064400000033273152525342270010452 0ustar00# -*- Mode: Python; py-indent-offset: 4 -*- # generictreemodel - GenericTreeModel implementation for pygtk compatibility. # Copyright (C) 2013 Simon Feltman # # generictreemodel.py: GenericTreeModel implementation for pygtk compatibility # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, see . # System import sys import random import collections import ctypes # GObject from gi.repository import GObject from gi.repository import Gtk class _CTreeIter(ctypes.Structure): _fields_ = [('stamp', ctypes.c_int), ('user_data', ctypes.c_void_p), ('user_data2', ctypes.c_void_p), ('user_data3', ctypes.c_void_p)] @classmethod def from_iter(cls, iter): offset = sys.getsizeof(object()) # size of PyObject_HEAD return ctypes.POINTER(cls).from_address(id(iter) + offset) def _get_user_data_as_pyobject(iter): citer = _CTreeIter.from_iter(iter) return ctypes.cast(citer.contents.user_data, ctypes.py_object).value def handle_exception(default_return): """Returns a function which can act as a decorator for wrapping exceptions and returning "default_return" upon an exception being thrown. This is used to wrap Gtk.TreeModel "do_" method implementations so we can return a proper value from the override upon an exception occurring with client code implemented by the "on_" methods. """ def decorator(func): def wrapped_func(*args, **kargs): try: return func(*args, **kargs) except: # Use excepthook directly to avoid any printing to the screen # if someone installed an except hook. sys.excepthook(*sys.exc_info()) return default_return return wrapped_func return decorator class GenericTreeModel(GObject.GObject, Gtk.TreeModel): """A base implementation of a Gtk.TreeModel for python. The GenericTreeModel eases implementing the Gtk.TreeModel interface in Python. The class can be subclassed to provide a TreeModel implementation which works directly with Python objects instead of iterators. All of the on_* methods should be overridden by subclasses to provide the underlying implementation a way to access custom model data. For the purposes of this API, all custom model data supplied or handed back through the overridable API will use the argument names: node, parent, and child in regards to user data python objects. The create_tree_iter, set_user_data, invalidate_iters, iter_is_valid methods are available to help manage Gtk.TreeIter objects and their Python object references. GenericTreeModel manages a pool of user data nodes that have been used with iters. This pool stores a references to user data nodes as a dictionary value with the key being the integer id of the data. This id is what the Gtk.TreeIter objects use to reference data in the pool. References will be removed from the pool when the model is deleted or explicitly by using the optional "node" argument to the "row_deleted" method when notifying the model of row deletion. """ leak_references = GObject.Property(default=True, type=bool, blurb="If True, strong references to user data attached to iters are " "stored in a dictionary pool (default). Otherwise the user data is " "stored as a raw pointer to a python object without a reference.") # # Methods # def __init__(self): """Initialize. Make sure to call this from derived classes if overridden.""" super(GenericTreeModel, self).__init__() self.stamp = 0 #: Dictionary of (id(user_data): user_data), used when leak-refernces=False self._held_refs = dict() # Set initial stamp self.invalidate_iters() def iter_depth_first(self): """Depth-first iteration of the entire TreeModel yielding the python nodes.""" stack = collections.deque([None]) while stack: it = stack.popleft() if it is not None: yield self.get_user_data(it) children = [self.iter_nth_child(it, i) for i in range(self.iter_n_children(it))] stack.extendleft(reversed(children)) def invalidate_iter(self, iter): """Clear user data and its reference from the iter and this model.""" iter.stamp = 0 if iter.user_data: if iter.user_data in self._held_refs: del self._held_refs[iter.user_data] iter.user_data = None def invalidate_iters(self): """ This method invalidates all TreeIter objects associated with this custom tree model and frees their locally pooled references. """ self.stamp = random.randint(-2147483648, 2147483647) self._held_refs.clear() def iter_is_valid(self, iter): """ :Returns: True if the gtk.TreeIter specified by iter is valid for the custom tree model. """ return iter.stamp == self.stamp def get_user_data(self, iter): """Get the user_data associated with the given TreeIter. GenericTreeModel stores arbitrary Python objects mapped to instances of Gtk.TreeIter. This method allows to retrieve the Python object held by the given iterator. """ if self.leak_references: return self._held_refs[iter.user_data] else: return _get_user_data_as_pyobject(iter) def set_user_data(self, iter, user_data): """Applies user_data and stamp to the given iter. If the models "leak_references" property is set, a reference to the user_data is stored with the model to ensure we don't run into bad memory problems with the TreeIter. """ iter.user_data = id(user_data) if user_data is None: self.invalidate_iter(iter) else: iter.stamp = self.stamp if self.leak_references: self._held_refs[iter.user_data] = user_data def create_tree_iter(self, user_data): """Create a Gtk.TreeIter instance with the given user_data specific for this model. Use this method to create Gtk.TreeIter instance instead of directly calling Gtk.Treeiter(), this will ensure proper reference managment of wrapped used_data. """ iter = Gtk.TreeIter() self.set_user_data(iter, user_data) return iter def _create_tree_iter(self, data): """Internal creation of a (bool, TreeIter) pair for returning directly back to the view interfacing with this model.""" if data is None: return (False, None) else: it = self.create_tree_iter(data) return (True, it) def row_deleted(self, path, node=None): """Notify the model a row has been deleted. Use the node parameter to ensure the user_data reference associated with the path is properly freed by this model. :Parameters: path : Gtk.TreePath Path to the row that has been deleted. node : object Python object used as the node returned from "on_get_iter". This is optional but ensures the model will not leak references to this object. """ super(GenericTreeModel, self).row_deleted(path) node_id = id(node) if node_id in self._held_refs: del self._held_refs[node_id] # # GtkTreeModel Interface Implementation # @handle_exception(0) def do_get_flags(self): """Internal method.""" return self.on_get_flags() @handle_exception(0) def do_get_n_columns(self): """Internal method.""" return self.on_get_n_columns() @handle_exception(GObject.TYPE_INVALID) def do_get_column_type(self, index): """Internal method.""" return self.on_get_column_type(index) @handle_exception((False, None)) def do_get_iter(self, path): """Internal method.""" return self._create_tree_iter(self.on_get_iter(path)) @handle_exception(False) def do_iter_next(self, iter): """Internal method.""" if iter is None: next_data = self.on_iter_next(None) else: next_data = self.on_iter_next(self.get_user_data(iter)) self.set_user_data(iter, next_data) return next_data is not None @handle_exception(None) def do_get_path(self, iter): """Internal method.""" path = self.on_get_path(self.get_user_data(iter)) if path is None: return None else: return Gtk.TreePath(path) @handle_exception(None) def do_get_value(self, iter, column): """Internal method.""" return self.on_get_value(self.get_user_data(iter), column) @handle_exception((False, None)) def do_iter_children(self, parent): """Internal method.""" data = self.get_user_data(parent) if parent else None return self._create_tree_iter(self.on_iter_children(data)) @handle_exception(False) def do_iter_has_child(self, parent): """Internal method.""" return self.on_iter_has_child(self.get_user_data(parent)) @handle_exception(0) def do_iter_n_children(self, iter): """Internal method.""" if iter is None: return self.on_iter_n_children(None) return self.on_iter_n_children(self.get_user_data(iter)) @handle_exception((False, None)) def do_iter_nth_child(self, parent, n): """Internal method.""" if parent is None: data = self.on_iter_nth_child(None, n) else: data = self.on_iter_nth_child(self.get_user_data(parent), n) return self._create_tree_iter(data) @handle_exception((False, None)) def do_iter_parent(self, child): """Internal method.""" return self._create_tree_iter(self.on_iter_parent(self.get_user_data(child))) @handle_exception(None) def do_ref_node(self, iter): self.on_ref_node(self.get_user_data(iter)) @handle_exception(None) def do_unref_node(self, iter): self.on_unref_node(self.get_user_data(iter)) # # Python Subclass Overridables # def on_get_flags(self): """Overridable. :Returns Gtk.TreeModelFlags: The flags for this model. See: Gtk.TreeModelFlags """ raise NotImplementedError def on_get_n_columns(self): """Overridable. :Returns: The number of columns for this model. """ raise NotImplementedError def on_get_column_type(self, index): """Overridable. :Returns: The column type for the given index. """ raise NotImplementedError def on_get_iter(self, path): """Overridable. :Returns: A python object (node) for the given TreePath. """ raise NotImplementedError def on_iter_next(self, node): """Overridable. :Parameters: node : object Node at current level. :Returns: A python object (node) following the given node at the current level. """ raise NotImplementedError def on_get_path(self, node): """Overridable. :Returns: A TreePath for the given node. """ raise NotImplementedError def on_get_value(self, node, column): """Overridable. :Parameters: node : object column : int Column index to get the value from. :Returns: The value of the column for the given node.""" raise NotImplementedError def on_iter_children(self, parent): """Overridable. :Returns: The first child of parent or None if parent has no children. If parent is None, return the first node of the model. """ raise NotImplementedError def on_iter_has_child(self, node): """Overridable. :Returns: True if the given node has children. """ raise NotImplementedError def on_iter_n_children(self, node): """Overridable. :Returns: The number of children for the given node. If node is None, return the number of top level nodes. """ raise NotImplementedError def on_iter_nth_child(self, parent, n): """Overridable. :Parameters: parent : object n : int Index of child within parent. :Returns: The child for the given parent index starting at 0. If parent None, return the top level node corresponding to "n". If "n" is larger then available nodes, return None. """ raise NotImplementedError def on_iter_parent(self, child): """Overridable. :Returns: The parent node of child or None if child is a top level node.""" raise NotImplementedError def on_ref_node(self, node): pass def on_unref_node(self, node): pass