
    BPcH                     <   d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZ e	j        ZddZd Zdd	Zd
 Z G d d          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          ZdS )zB
Wraps the gtk treeview and iconview in something a little nicer.
    N)TupleTypeOptional)GtkGdkGObject	GdkPixbufPango   )PixmapManager
SizeFilterc                 |    t          | |          r+t          | |          }t          |          r
 |            }|S |S )zCPython logic to choose an attribute, call it if required and return)hasattrgetattrcallable)itemattrdprops       4/usr/share/inkscape/extensions/inkex/gui/listview.pydefaultr      sF    tT tT""D>> 	466DH    c                     | |k    | |k     z
  S )zCompare two objects )abs     r   cmpr   )   s    Ea!er   c                       fd}|S )Nc                 &    t          |           S Nr   )r   r   names    r   insidezitem_property.<locals>.inside/   s    tT1%%%r   r   )r"   r   r#   s   `` r   item_propertyr$   .   s)    & & & & & & Mr   c                     t          | t                    rd                    d | D                       S t          | t                    st          |           } | j        S )Nz or c                 ,    g | ]}t          |          S r   )label).0os     r   
<listcomp>zlabel.<locals>.<listcomp>7   s    222E!HH222r   )
isinstancetuplejointype__name__)objs    r   r'   r'   5   sZ    #u 4{{22c222333c4   3ii<r   c                       e Zd ZU dZdZeeej                          e	d<   ddZ
d Zd Zd Zd Zd	 Zdd
ZddZddZd Zd ZddZd Zd Zd ZddZdS )BaseViewz.Controls for tree and icon views, a base classNwidget_typec                 6   t          || j                  s8t          | j                  }t          |          }t          d| d|           |                    dd           | _        g | _        || _        || _        d | _	        d | _
        d| _        |                     |p|                                          | _        | j                            | j                   |                                  | j                            | j        | j                   d S )NzWrong widget type: Expected z got selectedT)r+   r3   r'   	TypeErrorgetselected_signal_iids_listargsr5   _datano_dupescreate_model	get_model_model	set_modelsetupconnectchanged_signalitem_selected_signal)selfwidget	liststorekwargslbl1lbl2s         r   __init__zBaseView.__init__B   s   &$"233 	N)**D==DL4LLdLLMMM%zz*d;;

	
''	(GV5E5E5G5GHH
T[)))


4.0IJJJJJr   c                     | j         S )z$Returns the current data store model)r@   rF   s    r   r?   zBaseView.get_modelU   s
    {r   c                     t          |t          j        t          j        f          s!t	          |          }t          d|           |S )zSetup the model and listz Expected List or TreeStore, got )r+   r   	ListStore	TreeStorer'   r6   )rF   rH   lbls      r   r>   zBaseView.create_modelY   sH    )cmS]%CDD 	F	""CDsDDEEEr   c                 8    | j                                          dS )zAttempt to refresh the listviewN)r:   
queue_drawrN   s    r   refreshzBaseView.refresh`   s    
r   c                     dS )z!Setup columns, views, sorting etcNr   rN   s    r   rB   zBaseView.setupd   s    r   c                 N    t          |d          r|                                S dS )zw
        Return an id set against this item.

        If item.get_id() is set then duplicates will be ignored.
        get_idN)r   rX   rF   r   s     r   get_item_idzBaseView.get_item_idh   s)     4"" 	!;;== tr   c                     |r,|                      |           |                     |           dS |                                  || _        |                     |           dS )z/Replace all items, or a single item with objectN)remove_itemadd_itemclearr<   )rF   new_item	item_iters      r   replacezBaseView.replacer   sb     	$Y'''MM(#####JJLLL!DJMM(#####r   c                 r    | j         |k    r'|| _         | j        r|r|                     |           dS dS dS dS )z1Base method result, called as an item is selectedN)r5   r8   )rF   r   otherss      r   item_selectedzBaseView.item_selected|   s^    =D   DM# + +$$T***** ! + + + +r   c                 \    | j                             |                     |                    S )zRemove an item from this view)r@   removeget_iterrY   s     r   r\   zBaseView.remove_item   s$    {!!$--"5"5666r   c                     |                      |          }|| j        v r| j        rt          d|           |r| j                            |           dS dS )z/Item id is recorded to guard against duplicateszWill not add duplicate row N)rZ   r9   r=   
ValueErrorappend)rF   r   iids      r   check_item_idzBaseView.check_item_id   sn    t$$$*@3@@AAA 	#Jc"""""	# 	#r   c                 r     g  fd} j                             |                                           S )Nc                 ^                                             |          ||f           d S r    )rj   get_item)storetreepathtreeiterretrF   s      r   collect_allz&BaseView.__iter__.<locals>.collect_all   s.    JJh//8DEEEEEr   )r@   foreach__iter__)rF   rt   rs   s   ` @r   rv   zBaseView.__iter__   sS    	F 	F 	F 	F 	F 	F 	K(((||~~r   Tc                 :    | j                             |           dS )z&Proxy the GTK property for sensitivityN)r:   set_sensitive)rF   sens     r   rx   zBaseView.set_sensitive   s    
  %%%%%r   c                 F    g | _         | j                                         dS )z"Clear all items from this treeviewN)r9   r@   r^   rN   s    r   r^   zBaseView.clear   s#    
r   c                     |S )z*What happens when you double click an itemr   )rF   itemss     r   item_double_clickedzBaseView.item_double_clicked   s    r   c                 N    | j         |                     |                   d         S )z+Return the object of attention from an iterr   )r@   rg   )rF   r`   s     r   ro   zBaseView.get_item   s     {4==334Q77r   Fc                    t          |t          j                  r|r|n| j                            |          S t          |t          j                  r|r| j                            |          n|S | D ]\  }}}||k    r|r|n|c S dS )zReturn the iter given the itemN)r+   r   TreePathr@   rg   TreeIterget_path)rF   r   pathsrc_itemsrc_pathsrc_iters         r   rg   zBaseView.get_iter   s    dCL)) 	@?44T[%9%9$%?%??dCL)) 	@15?4;''---4?,0 	6 	6(Hhx#'5xxX555  tr   r    TF)r/   
__module____qualname____doc__r3   r   r   r   Widget__annotations__rL   r?   r>   rU   rB   rZ   ra   rd   r\   rl   rv   rx   r^   r}   ro   rg   r   r   r   r2   r2   =   sJ        88.2K$sz*+222K K K K&             $ $ $ $+ + + +7 7 7 7# # #  & & & &  
  8 8 8	 	 	 	 	 	r   r2   c                        e Zd ZdZdZej        ZdZ fdZ	e
d             Zd Zd Zd Zdd
ZddZd Zd Zd ZddZd fd	ZddZd Z xZS )TreeViewz"Controls and operates a tree view.   cursor_changedc                 `   | j                                         | _        | j                            t          j        j                   | j                             d| j                   | j         	                    t          j        d           t                                                       dS )zSetup the treeviewzbutton-press-eventN)r:   get_selection_selset_moder   SelectionModeMULTIPLErC   rE   set_row_separator_funcr   is_separatorsuperrB   rF   	__class__s    r   rB   zTreeView.setup   s    J,,..		3,5666
/1JKKK
))(*?FFFr   c                 T    t          |                     |d          t                    S )z(Internal function for seperator checkingr   )r+   	get_value	Separator)modelr`   datas      r   r   zTreeView.is_separator   s"     %//)Q77CCCr   c                 Z      fd j                                         d         D             S )z&Return a list of selected item objectsc                 :    g | ]}                     |          S r   ro   )r(   rowrF   s     r   r*   z/TreeView.get_selected_items.<locals>.<listcomp>   s%    OOOsc""OOOr   r   )r   get_selected_rowsrN   s   `r   get_selected_itemszTreeView.get_selected_items   s0    OOOOdi.I.I.K.KA.NOOOOr   c                     | j                                          |D ]5}|                     |d          }|| j                             |           6dS )zSelect the given itemsTr   N)r   unselect_allrg   select_path)rF   r|   r   	path_items       r   set_selected_itemszTreeView.set_selected_items   sa    	    	1 	1Dd66I$	%%i000	1 	1r   c                 \    | j                             |                     |                    S )z#Return true if the item is selected)r   iter_is_selectedrg   rY   s     r   is_selectedzTreeView.is_selected   s$    y))$--*=*=>>>r   Nc                 >    |D ]}|                      ||           dS )z-Add all items from the target to the treeview)parentNr]   )rF   targetr   r   s       r   addzTreeView.add   s4     	/ 	/DMM$vM....	/ 	/r   c                     |?|                      |           |                     |g|                     |                    S t          d          )z<Add a single item image to the control, returns the TreePathNItem can not be None.)rl   	_add_itemrg   ri   rF   r   r   s      r   r]   zTreeView.add_item   sM    t$$$>>4&$--*?*?@@@0111r   c                 b    |                      | j                            ||          d          S )NTr   )rg   r@   rj   r   s      r   r   zTreeView._add_item   s*    }}T[//==D}IIIr   c                 :     | j         |                                  S )zSignal for selecting an itemrd   r   rF   r;   rI   s      r   rE   zTreeView.item_selected_signal       !t!4#:#:#<#<==r   c                 z    ||j         t          j        j        k    r | j        |                                   dS dS )zSignal for mouse button clickN)r.   r   	EventType_2BUTTON_PRESSr}   r   )rF   _events      r   item_button_clickedzTreeView.item_button_clicked   sC    =EJ#-*FFF$D$d&=&=&?&?@@@@ GFr   Tc                 f    | j                             |                     |d          |           dS )zExpand one of our nodesTr   N)r:   
expand_rowrg   )rF   r   expands      r   expand_itemzTreeView.expand_item   s0    
dmmDtm<<fEEEEEr   c                 |    |t          j        t                    }t                                          |          S )z.Set up an icon view for showing gallery images)r   rQ   GOBJr   r>   rF   rH   r   s     r   r>   zTreeView.create_model   s0    d++Iww##I...r   c                 0    t          | j        ||          S )z
        Create and pack a new column to this list.

         name - Label in the column header
         expand - Should the column expand
        r   )
ViewColumnr:   )rF   r"   r   s      r   create_columnzTreeView.create_column   s     $*d6::::r   c                 ,    t          | j        g|R i |S )zm
        Create and attach a sorting view to this list.

        see ViewSort arguments for details.
        )ViewSortr:   r   s      r   create_sortzTreeView.create_sort  s$     
4T444V444r   r    r   )r/   r   r   r   column_sizer   r   r3   rD   rB   staticmethodr   r   r   r   r   r]   r   rE   r   r   r>   r   r   __classcell__r   s   @r   r   r      sQ       ,,K,K%N     D D \DP P P1 1 1? ? ?/ / / /
2 2 2 2J J J> > >A A A
F F F F/ / / / / /; ; ; ;5 5 5 5 5 5 5r   r   c                   B    e Zd ZdZej        ZdZd Zd Z	d Z
d Zd ZdS )	ComboBoxz'Controls and operates a combo box list.changedc                     d S r    r   rN   s    r   rB   zComboBox.setup  s    r   c                 Z    |                      | j                                                  S )z*Return the selected item of this combo box)ro   r:   get_active_iterrN   s    r   get_selected_itemzComboBox.get_selected_item  s"    }}TZ7799:::r   c                 `    | j                             |                     |                     dS )z'Set the given item as the selected itemN)r:   set_active_iterrg   rY   s     r   set_selected_itemzComboBox.set_selected_item  s*    
""4==#6#677777r   c                 2    |                                  |k    S )z.Returns true if this item is the selected itemr   rY   s     r   r   zComboBox.is_selected  s    %%''4//r   c                 ,    |                                  gS )z%Return a list of selected items (one)r   rN   s    r   r   zComboBox.get_selected_items#  s    &&(())r   N)r/   r   r   r   r   r   r3   rD   rB   r   r   r   r   r   r   r   r   r     sq        11,KN  ; ; ;8 8 80 0 0* * * * *r   r   c                   ~     e Zd ZdZej        ZdZ fdZd Z	d Z
 fdZ fdZd Zd	 Zd
 Zd Zd Zd Zd Z xZS )IconViewz/Allows a simpler IconView for DBus List Objectszselection-changedc                 P     t                      j        |g|R i | || _        d S r    )r   rL   pixmaps)rF   rG   r   r;   rI   r   s        r   rL   zIconView.__init__.  s5    1$111&111r   c                 t    |                      |d          }|r| j                            |dd           dS dS )z#Sets the selected item to this itemTr   NF)rg   r:   
set_cursor)rF   r   r   s      r   r   zIconView.set_selected_item2  sI    }}T}-- 	5J!!$e44444	5 	5r   c                 N      fd j                                         D             S )zReturn the seleced itemc                 :    g | ]}                     |          S r   r   )r(   r   rF   s     r   r*   z/IconView.get_selected_items.<locals>.<listcomp>:  s%    PPPd##PPPr   )r:   r   rN   s   `r   r   zIconView.get_selected_items8  s+    PPPP
0M0M0O0OPPPPr   c                     |s*t          j        t          t          t          j                  }t                                          |          S )z%Setup the icon view control and model)r   rP   r   strr	   Pixbufr   r>   r   s     r   r>   zIconView.create_model<  s:     	CdC1ABBIww##I...r   c                     | j                             d           | j                             d           t                                                       dS )z"Setup the columns for the iconviewr      N)r:   set_markup_columnset_pixbuf_columnr   rB   r   s    r   rB   zIconView.setupB  sD    
$$Q'''
$$Q'''r   c                 :    |D ]}|                      |           dS )z-Add all items from the target to the iconviewNr   )rF   r   r   s      r   r   zIconView.addH  s0     	  	 DMM$	  	 r   c                 x    |*|                      |           |                     |          S t          d          )z&Add a single item image to the controlNr   )rl   r   ri   rY   s     r   r]   zIconView.add_itemM  s=    t$$$>>$'''0111r   c                 >    t          |dt          |                    S zDefault text return for markup.r"   r   r   rY   s     r   
get_markupzIconView.get_markupT      tVSYY///r   c                 $    t          |dd          S z/Default icon return, pixbuf or gnome theme nameiconNr!   rY   s     r   get_iconzIconView.get_iconX      tVT***r   c                 `    | j                             |                     |          |          S )N)r   )r   r7   r   rY   s     r   	_get_iconzIconView._get_icon\  s)    |d 3 3$???r   c                     t          |t          t          f          s+||                     |          |                     |          g}| j                            |          S )z
        Each item's properties must be stuffed into the ListStore directly
        or the IconView won't see them, but only if on auto.
        )r+   r,   listr   r   r@   rj   rY   s     r   r   zIconView._add_item_  sU    
 $.. 	G$//$//1E1EFD{!!$'''r   c                 :     | j         |                                  S )zItem has been selectedr   r   s      r   rE   zIconView.item_selected_signalh  r   r   )r/   r   r   r   r   r   r3   rD   rL   r   r   r>   rB   r   r]   r   r   r   r   rE   r   r   s   @r   r   r   (  s	       99,K(N    5 5 5Q Q Q/ / / / /         
2 2 20 0 0+ + +@ @ @( ( (> > > > > > >r   r   c                   ,    e Zd ZdZddZd Zd Zd ZdS )	r   z
    A sorting function for use is ListViews

     ascending - Boolean which direction to sort
     contains - Contains this string
     data - A string or function to get data from each item.
     exact - Compare to this exact string instead.
    NFc                     d | _         || _        || _        |r|                                nd | _        || _        || _         |                                  d S r    )treer   asclowercompcontresort)rF   rG   r   	ascendingexactcontainss         r   rL   zViewSort.__init__w  sN    		%*4EKKMMM			r   c                     |                     |d          }t          | j        t                    rt	          || j                  }n)t          | j                  r|                     |          }|S )z$Generate sortable data from the itemr   )r   r+   r   r   r   r   )rF   r   	list_iterr   values        r   get_datazViewSort.get_data  sb    y!,,di%% 	$D$),,EEdi   	$IIdOOEr   c                    |                      ||          }|                      ||          }|dk    s|dk    rdS | j        r\t          | j        |                                          dk    rdS t          | j        |                                          dk    rdS dS | j        r<| j        |                                v rdS | j        |                                v rdS dS ||k     rdS ||k     rdS dS )zCalled by Gtk to sort itemsNr   r   )r  r	  r   r  r
  )rF   r   iter1iter2r   value1value2s          r   	sort_funczViewSort.sort_func  s    ue,,ue,,T>>Vt^^19 	49fllnn--22qTY//144r1Y 	yFLLNN**qfllnn,,r1F??1F??2qr   c                    | j                                         }|                    d| j        d            | j        r'|                    dt          j        j                   d S |                    dt          j        j	                   d S )Nr   )
r  r?   set_sort_funcr  r  set_sort_column_idr   SortType	ASCENDING
DESCENDING)rF   r   s     r   r  zViewSort.resort  s|    	##%%At~t4448 	A$$Q(>?????$$Q(?@@@@@r   )NFNN)r/   r   r   r   rL   r  r  r  r   r   r   r   r   m  sd                0A A A A Ar   r   c                   n    e Zd ZdZddZddZddZdd	Zedd
            Z	ddZ
ddZddZd Zd ZdS )r   z{
    Add a column to a gtk treeview.

     name - The column name used as a label.
     expand - Set column expansion.
    Fc                 (   t          |t          j                  rpt          j        |          }|                    t          j        j                   |                    |           || _        |	                    | j                   d S || _        d S r    )
r+   r   r   TreeViewColumn
set_sizingTreeViewColumnSizingAUTOSIZE
set_expand_columnappend_column)rF   rG   r"   r   columns        r   rL   zViewColumn.__init__  s    fcl++ 	"'//Fc6?@@@f%%%!DL  ..... "DLLLr   Tc                 t    | j                             ||           | j                             ||d           |S )zSet a custom rendererN)r'  
pack_startset_cell_data_func)rF   rendererfuncr   s       r   add_rendererzViewColumn.add_renderer  s9    &111''$===r   r   Nc                 ,   |rt           gng }|pt          dd||          }t          j                    }|                    d|           |                    d|           |                     |p| j        |          }|                     ||d          S )a  
        Set the image renderer

         icon - The function that returns the image to be dsplayed.
         pad - The amount of padding around the image.
         pixmaps - The pixmap manager to use to get images.
         size - Restrict the images to this size.
         z./)
pixmap_dirfilterssizeypadxpadFr   )r   r   r   CellRendererPixbufset_property
image_funcdefault_iconr/  )rF   r   padr   r4  r3  r-  r.  s           r   add_image_rendererzViewColumn.add_image_renderer  s     #'.:,,B 
]4t
 
 
 )++fc***fc***t8t'8'BB  4 >>>r   c                    t          j                    }|'||j        _        t          j        j        |j        _        d|j        _        d|j        _	        | 
                    |p| j        |          }|                     ||d          S )z
        Set the text renderer.

         text - the function that returns the text to be displayed.
         wrap - The wrapping setting for this renderer.
         template - A standard template used for this text markup.
        NTr   )r   CellRendererTextprops
wrap_widthr
   WrapModeWORD	wrap_modebackground_setforeground_set	text_funcdefault_textr/  )rF   textwraptemplater-  r.  s         r   add_text_rendererzViewColumn.add_text_renderer  s{     '))(,HN%',~':HN$(,%(,%~~d7d&7BB  4 ===r   c                 R    |d}t          |t          t          t          f          r\|r7t          |                              dd                              dd          }t          |                              dd          S t          |t
                    r-t           fd	|                                D                       S t          |t          t          f          rt           fd
|D                       S t          dt          t          |                    z            )z.Clean text of any pango markup confusing charsNr1  <z&lt;>z&gt;&z&amp;c                 D    g | ]\  }}|                     |          fS r   clean)r(   kvclss      r   r*   z$ViewColumn.clean.<locals>.<listcomp>  s,    DDDtq!!SYYq\\*DDDr   c                 :    g | ]}                     |          S r   rQ  )r(   r  rU  s     r   r*   z$ViewColumn.clean.<locals>.<listcomp>  s%    ===u#))E**===r   zUnknown value type for text: %s)r+   r   intfloatra   dictr|   r  r,   r6   r.   )rU  rH  markups   `  r   rR  zViewColumn.clean  s    <DdS#u-.. 	? K4yy((f55==c6JJt99$$S'222d## 	?DDDDtzz||DDDEEEtUm,, 	?=======>>>9CT

OOKLLLr   c                 P    t          |t                    rt          ||          }|S )z Returns the right kind of method)r+   r   r$   )rF   callr   s      r   get_calloutzViewColumn.get_callout  s(    dC   	0 w//Dr   c                 D                           |           fd}|S )zWrap up our text functionalityc                 ~   t                               |||          rd S |                    |d          }
d u} |          }t          
t                    r+
                    	                    |d                    }n	                    |          }|                    dt	          |                     d S )Nr   T)rZ  rZ  )r   r   r   r+   r   formatrR  r8  )r)  cellr   r`   r   r   rZ  rH  calloutrF   rJ  s           r   internalz&ViewColumn.text_func.<locals>.internal  s    $$UIt<< ??9a00DT)F74==D(C(( (tzz$tz'D'DEEzz$''hD		22222r   r]  )rF   r\  rJ  rc  rb  s   ` ` @r   rF  zViewColumn.text_func  sB    ""4((
	3 
	3 
	3 
	3 
	3 
	3 
	3 r   c                 @    |                      |          fd}|S )zWrap, wrap wrap the funcc                 j   t                               |||          rd S |                    |d          } |          }t          |pdt                    rr                    |          }n|r                    |          }|                    d|           |                    dd           d S )Nr   r1  pixbufvisibleT)r   r   r   r+   r   r7   apply_filtersr8  )	r)  ra  r   r`   r   r   r   rb  r   s	          r   rc  z'ViewColumn.image_func.<locals>.internal  s    $$UIt<< ??9a00D74==D$*"c** 3w 3{{4(( 3,,T22h---i.....r   rd  )rF   r\  r   rc  rb  s     ` @r   r9  zViewColumn.image_func  s<    ""4((	/ 	/ 	/ 	/ 	/ 	/ r   c                 >    t          |dt          |                    S r   r   rY   s     r   rG  zViewColumn.default_text(  r   r   c                 $    t          |dd          S r   r!   rY   s     r   r:  zViewColumn.default_icon,  r   r   r   r   )r   NN)NNr    )r/   r   r   r   rL   r/  r<  rK  classmethodrR  r]  rF  r9  rG  r:  r   r   r   r   r     s         	" 	" 	" 	"   ? ? ? ?*> > > >( M M M [M      $   *0 0 0+ + + + +r   r   c                       e Zd ZdZdS )r   z'Reprisentation of a separator in a listN)r/   r   r   r   r   r   r   r   r   1  s        1111r   r   r    )r   loggingtypingr   r   r   gi.repositoryr   r   r   r	   r
   pixmapr   r   TYPE_PYOBJECTr   r   r   r$   r'   r2   r   r   r   objectr   r   r   r   r   r   <module>rt     s!  "   ( ( ( ( ( ( ( ( ( ( = = = = = = = = = = = = = = - - - - - - - -     
     u u u u u u u upV5 V5 V5 V5 V5x V5 V5 V5r* * * * *x * * *4B> B> B> B> B>x B> B> B>J:A :A :A :A :Av :A :A :AzD+ D+ D+ D+ D+ D+ D+ D+N2 2 2 2 2 2 2 2 2 2r   