
ddc           @` s  d  Z  d d l m Z m Z m Z m Z d d l Td d l Z d d l Z d d l	 Z	 d d l
 Z
 e
 j d  d d l Z d d l Z d d l m Z d d l m Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z d e j f d     YZ e j e  d S(   uC   Preview widget displaying the names of items to be batch-processed.i    (   t   absolute_importt   divisiont   print_functiont   unicode_literals(   t   *Nu   2.0(   t   pdb(   t	   pygimplib(   t
   exceptions(   t   utils(   t   preview_base(   t   messagest   NamePreviewc           B` s  e  Z d  Z i e j d: d; f d 6e j d: e j f f d 6e j d: d< f d 6Z d Z d Z	 d e
 j j g d e j g d e j g d e j g d	 e j g d e j g f Z \ Z Z Z Z Z Z d: d: d: d
 d: d  Z e d    Z e d    Z e d    Z e d    Z e e d  Z d   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d   Z% d   Z& d   Z' d   Z( d   Z) d   Z* d   Z+ d   Z, d   Z- d    Z. d!   Z/ d"   Z0 d#   Z1 d$   Z2 d%   Z3 d&   Z4 d'   Z5 e d(  Z6 d)   Z7 d*   Z8 d+   Z9 d,   Z: d-   Z; d.   Z< d/   Z= d0   Z> d1   Z? d2   Z@ d3   ZA d4   ZB d: d5  ZC d6   ZD d7   ZE d: d8  ZF d9   ZG RS(=   ud  A widget displaying a preview of batch-processed items - names and their
  folder structure.
  
  Additional features:
  * toggling "filter mode" - unselected items are not sensitive.
  * assigning tags to items.
  
  Attributes:
  
  * `is_filtering` - If enabled, unselected items are not sensitive.
  
  Signals:
  
  * `'preview-selection-changed'` - The selection in the preview was modified
    by the user or by calling `set_selected_items()`.
  * `'preview-updated'` - The preview was updated by calling `update()`. This
    signal is not emitted if the update is locked.
    
    Arguments:
    
    * `error` - If `None`, the preview was updated successfully. Otherwise,
      this is an `Exception` object describing the error that occurred during
      the update.
  * `'preview-tags-changed'` - An existing tag was added to or removed from an
    item.
  s   preview-selection-changeds   preview-updateds   preview-tags-changedi   i    i   i   i   i   u   selected_in_previewc         C` s  t    j   | |  _ | |  _ | |  _ | d  k	 r: | n t   |  _ | d  k	 rX | n g  |  _ | |  _	 | |  _
 t |  _ t j t j j  |  _ t |  _ t |  _ t |  _ t |  _ t |  _ t j j t j j d d  |  _ t j j t j j d d  |  _ |  j    d  S(   Nu   imagesu   icon_image.pngu   icon_tag.png(!   t   supert   __init__t   _batchert	   _settingst   _initial_item_treet   Nonet   sett   _collapsed_itemst   _selected_itemst   _selected_items_filter_namet   _available_tags_settingt   Falset   is_filteringt   collectionst   defaultdictt   pgR   t   return_none_funct   _tree_iterst   Truet    _row_expand_collapse_interactivet   _toggle_tag_interactivet   _clearing_previewt   _row_select_interactivet   _initial_scroll_to_selectiont   ost   patht   joint   configt   PLUGIN_SUBDIRPATHt   _icon_image_filepatht   _icon_tag_filepatht	   _init_gui(   t   selft   batchert   settingst   initial_item_treet   collapsed_itemst   selected_itemst   selected_items_filter_namet   available_tags_setting(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR   O   s(    														c         C` s   |  j  S(   N(   R   (   R,   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR-   u   s    c         C` s   |  j  S(   N(   t
   _tree_view(   R,   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt	   tree_viewy   s    c         C` s   |  j  S(   N(   R   (   R,   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR0   }   s    c         C` s   |  j  S(   N(   R   (   R,   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR1      s    c         C` s   t    j   } | r d S| s, |  j   n  |  j d |  } | rX |  j d |  d S|  j   } | s |  j |  |  j   n |  j |  |  j	   |  j
 |  |  j   |  j j   |  j d d  d S(   u  Updates the preview (add/remove item, move item to a different parent
    item group, etc.).
    
    If `reset_items` is `True`, perform full update - add new items, remove
    non-existent items, etc. Note that setting this to `True` may introduce a
    performance penalty for hundreds of items.
    
    If `update_existing_contents_only` is `True`, only update the contents of
    the existing items. Note that the items will not be reparented,
    expanded/collapsed or added/removed even if they need to be. This option is
    useful if you know the item structure will be preserved.
    
    If an exception was captured during the update, the method is terminated
    prematurely. It is the responsibility of the caller to handle the error
    (e.g. lock or clear the preview).
    Nt   reset_itemsu   preview-updated(   R   t   updatet   cleart   _process_itemst   emitt   _get_items_to_processt   _insert_itemst   _set_expanded_itemst   _update_itemst   _set_selectiont%   _set_item_tree_sensitive_for_selectedt   _update_available_tagsR4   t   columns_autosizeR   (   R,   R6   t   update_existing_contents_onlyt   update_lockedt   errort   items(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR7      s&    

c         C` s0   t  |  _ |  j j   |  j j   t |  _ d S(   u#   
    Clear the entire preview.
    N(   R   R!   t   _tree_modelR8   R   R   (   R,   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR8      s    	c         C` s   | |  _  |  j   d S(   u:   
    Set the collapsed state of items in the preview.
    N(   R   R=   (   R,   R0   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   set_collapsed_items   s    	c         C` s$   | |  _  |  j   |  j d  d S(   u4   
    Set the selection of items in the preview.
    u   preview-selection-changedN(   R   R?   R:   (   R,   R1   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   set_selected_items   s    	
c         C` s'   g  |  j    D] } |  j j | ^ q S(   N(   t    _get_keys_from_current_selectionR   t	   item_tree(   R,   t   item_key(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   get_items_from_selected_rows   s    c         C` sR   |  j  j   \ } } | d  k	 rJ |  j |  j j |   } |  j j | Sd  Sd  S(   N(   R4   t
   get_cursorR   t   _get_key_from_tree_iterRG   t   get_iterR   RK   (   R,   t	   tree_patht   unused_RL   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   get_item_from_cursor   s
    c         C` s,  t  j g  |  j D] } | d ^ q   |  _ t  j d |  j  |  _ |  j j t  |  j j t  |  j j	   j
 t  j  |  j   |  j   t  j d  } t  j   } | j | d t | j | d |  j d t  j   } | j d |  j d  | j | d t | j | d	 |  j d t  j   } | j | d t | j | d
 |  j d d |  j d |  j j |  t  j   |  _ |  j j t  j t  j  |  j j |  j  |  j |  j  |  j j d |  j   |  j j d |  j!  |  j j	   j d |  j"  |  j j d |  j#  d  S(   Ni   t   modelt    t   expandt   pixbufi    u   pixbufu   tagt   visiblet   textt	   sensitiveu   row-collapsedu   row-expandedu   changedu   event($   t   gtkt	   TreeStoret   _COLUMNSRG   t   TreeViewR4   t   set_headers_visibleR   t   set_enable_searcht   get_selectiont   set_modet   SELECTION_MULTIPLEt   _init_iconst   _init_tags_menut   TreeViewColumnt   CellRendererPixbuft
   pack_startt   set_attributest   _COLUMN_ICON_ITEMt   set_propertyt   _iconst   _COLUMN_ICON_TAG_VISIBLEt   CellRendererTextt   _COLUMN_ITEM_NAMEt   _COLUMN_ITEM_NAME_SENSITIVEt   append_columnt   ScrolledWindowt   _scrolled_windowt
   set_policyt   POLICY_AUTOMATICt   addt   connectt   _on_tree_view_row_collapsedt   _on_tree_view_row_expandedt   _on_tree_selection_changedt&   _on_tree_view_right_button_press_event(   R,   t   columnt   cell_renderer_icon_itemt   cell_renderer_icon_tagt   cell_renderer_item_name(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR+      s@    ,

c   
      C` s  i  |  _  |  j j t j t j  |  j  d <t j j |  j d |  j  d j	 j
  |  j  d <t j j |  j d |  j  d j	 j
  |  j  d <|  j  d j   |  j  d <d } |  j  d j	 j } t | |  } |  j  d j	 j
 } t | |  } |  j  d j	 j |  j  d j	 j } | | | } |  j  d j	 j
 |  j  d j	 j
 } | | | }	 |  j  d j |  j  d | |	 | | | |	 | | t j j d  d  S(   Nu   folderiu   itemu   tagu   groupg?i   (   Rl   R4   t   render_iconR[   t   STOCK_DIRECTORYt   ICON_SIZE_MENUt   gdkt   pixbuf_new_from_file_at_sizeR)   t   propst   heightR*   t   copyt   widtht   intt	   compositet   INTERP_BILINEAR(
   R,   t   scaling_factort   width_unscaledR   t   height_unscaledR   t   x_offset_unscaledt   x_offsett   y_offset_unscaledt   y_offset(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRd     s*    			&	&$$
c         C` s  i  |  _  i  |  _ d  |  _ t j   |  _ t j   |  _ |  j j t j	    t j
 t d   |  _ |  j j d |  j  |  j j |  j  t j
 t d   |  _ |  j j |  j  |  j j |  j  x0 |  j j j   D] \ } } |  j | |  q W|  j j   d  S(   Nu   Add New Tag...u   activateu
   Remove Tag(   t   _tags_menu_itemst   _tags_remove_submenu_itemsR   t   _tags_menu_relative_positionR[   t   Menut
   _tags_menut   _tags_remove_submenut   appendt   SeparatorMenuItemt   MenuItemt   _t   _menu_item_add_tagRw   t   _on_menu_item_add_tag_activatet   _menu_item_remove_tagt   set_submenuR   t   default_valueRF   t   _add_tag_menu_itemt   show_all(   R,   t   tagt   tag_display_name(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRe     s    			c         C` sn  t    } xs |  j j j d t  D]Y } xP | j D]E } | j |  | |  j k r2 |  j | |  |  j	 | |  q2 q2 Wq" Wx0 |  j
 j   D] \ } } | j | | k  q WxF |  j j D]8 } | |  j k r |  j | |  |  j	 | |  q q W|  j j t |  j j     |  j   x6 |  j D]+ } | |  j j k r.| |  j j | <q.q.W|  j j   d  S(   Nt   filtered(   R   R   RK   t   iterR   t   tagsRv   R   R   t   _add_remove_tag_menu_itemR   RF   t   set_sensitiveR   t   valueR   t   boolR   t   get_childrent   _sort_tags_menu_itemst   save(   R,   t	   used_tagst   itemR   t	   menu_item(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRA   7  s(    		
c         C` sy   xr t  t |  j d d    D]R \ } } |  j j |  j | |  | |  j k r |  j j |  j | |  q q Wd  S(   Nt   keyc         S` s
   |  j    S(   N(   t   lower(   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   <lambda>U  RU   (   t	   enumeratet   sortedR   R   t   reorder_childR   R   (   R,   t   new_tag_positionR   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR   S  s    (	c         C` sf   t  j |  |  j | <|  j | j d |  j |  |  j | j   |  j j |  j |  |  j | S(   Nu   toggled(   R[   t   CheckMenuItemR   Rw   t   _on_tags_menu_item_toggledt   showR   t   prepend(   R,   R   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR   [  s
    c         C` s_   t  j |  |  j | <|  j | j d |  j |  |  j | j   |  j j |  j |  d  S(   Nu   activate(   R[   R   R   Rw   t%   _on_tags_remove_submenu_item_activateR   R   R   (   R,   R   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR   c  s
    c         ` s  | j  t j j k r| j d k rg  } t } |  j j t | j	  t | j
   } | d  k	 r |  j j   j   d k r |  j   } t } n7 | d  k	 r |  j j | d  } |  j |  g } n  t |  _ g  | D] } |  j j | ^ q } x@ |  j j   D]/ \   }	 |	 j t   f d   | D   qWt |  _ t |  d k r|  j j d  d  d  | j | j  t j j  |   }
 |
 d  k	 r|
 j!   j"   |  _# qn  | Sd  S(   Ni   i   i    c         3` s   |  ] }   | j  k Vq d  S(   N(   R   (   t   .0R   (   R   (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pys	   <genexpr>  s    ($   t   typeR[   R   t   BUTTON_PRESSt   buttonR   R4   t   get_path_at_posR   t   xt   yR   Ra   t   count_selected_rowsRJ   R   RG   RP   RO   R    R   RK   R   RF   t
   set_activet   allt   lenR   t   popupt   timeR   t   guit   get_toplevel_windowt
   get_windowt   get_pointerR   (   R,   R5   t   eventt	   item_keyst   stop_event_propagationt   selection_at_post	   tree_iterRL   RF   t   tags_menu_itemt   toplevel_window(    (   R   sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR{   j  s,    $'		#'	"c         C` s   |  j  r t j |  j j  xM |  j   D]? } |  j j | } | j   r[ | j |  q) | j	 |  q) Wt j
 |  j j  |  j d t  |  j d  n  d  S(   NRC   u   preview-tags-changed(   R    R   t   gimp_image_undo_group_startR   t   input_imageRJ   RK   t
   get_activet   add_tagt
   remove_tagt   gimp_image_undo_group_endR7   R   R:   (   R,   R   R   RL   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR     s    	c   
      ` sj  d   }    f d   }  f d   } t  j t  j  } | j t  | j t  j j  t j	 j
   } | d  k	 r | j |  n  | | |  t  j t d   } t  j     t  j   } | j  j  | j | d t d t | j   d t d t | j  j  t  j   }	 |	 j |  | j |	  | j d |  | j d |  | j   d  S(	   Nc         S` s   |  j    d  S(   N(   t   destroy(   R   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   _on_popup_focus_out_event  s    c         ` s   t  j j | j  } | d k r   j   } | rt |  j k rt  j | |  } | j t   j	 | |  n  |  j
   t S| d k r |  j
   t Sd  S(   Nu   Returnu   KP_Enteru   Escape(   u   Returnu   KP_Enter(   R[   R   t   keyval_namet   keyvalt   get_textR   R   R   R   R   R   (   R   R   t   key_namet
   entry_textR   (   t   entry_add_tagR,   (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   _on_popup_key_press_event  s    

c         ` s_     j  d  k	 r[ | j   j   } |  j | d   j  d | d   j  d  d    _  n  d  S(   Ni    i   (   R   R   R   t
   get_origint   move(   R   t   windowt   window_absolute_position(   R,   (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   _set_popup_position  s    u	   Tag Name:RV   t   fillu   focus-out-eventu   key-press-event(   R[   t   Windowt   WINDOW_TOPLEVELt   set_decoratedR   t   set_type_hintR   t   WINDOW_TYPE_HINT_POPUP_MENUR   R   R   R   t   set_transient_fort   LabelR   t   Entryt   HBoxt   set_spacingt   _ADD_TAG_POPUP_HBOX_SPACINGRh   t   set_border_widtht   _ADD_TAG_POPUP_BORDER_WIDTHt   FrameRv   Rw   R   (
   R,   t   menu_item_add_tagR   R   R   t   popup_add_tagt   toplevelt   label_tag_namet   hboxt   frame(    (   R   R,   sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR     s.    		c         C` sx   |  j  j |  |  j j |  j |  |  j | =|  j | =|  j j | =|  j j t	 |  j  j
     |  j j   d  S(   N(   R   t   removeR   R   R   R   R   R   R   R   R   R   (   R,   t   tags_remove_submenu_itemR   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR     s    

	c         C` s6   |  j  r2 |  j j |  j |   |  j j   n  d  S(   N(   R   R   Rv   RO   R4   RB   (   R,   R5   R   RQ   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRx     s    	c         C` s[   |  j  rW |  j |  } | |  j k r: |  j j |  n  |  j |  |  j j   n  d  S(   N(   R   RO   R   R   R=   R4   RB   (   R,   R5   R   RQ   RL   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRy     s    	c         C` sd   |  j  r` |  j r` |  j } |  j   |  _ |  j d  |  j r` |  j | k r` |  j   q` n  d  S(   Nu   preview-selection-changed(   R!   R"   R   RJ   R:   R   R7   (   R,   t   tree_selectiont   previous_selected_items(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRz     s    	c         C` sG   |  j  j   j   \ } } g  | D]! } |  j |  j j |   ^ q" S(   N(   R4   Ra   t   get_selected_rowsRO   RG   RP   (   R,   RR   t
   tree_pathsRQ   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRJ     s    c         C` s9   | j  t j j k r | j j S| j j t j j f Sd  S(   N(   R   R   t   itemtreet   TYPE_FOLDERt   rawt   IDt
   FOLDER_KEY(   R,   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   _get_key  s    
c         C` sh   |  j  j | d |  j d } |  j  j | d |  j d } | t j j k rT | S| t j j f Sd  S(   NR|   i    (   RG   t	   get_valuet   _COLUMN_ITEM_IDt   _COLUMN_ITEM_TYPER   R  R  R
  (   R,   R   t   item_idt	   item_type(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRO     s
    c         C` sU   |  j  rA |  j j j j d |  j   t |  j j  SWd  QXn t |  j j  Sd  S(   Nt   name(   R   R   RK   t   filtert   remove_tempR   t   list(   R,   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR;     s    	c         C` s  | s9 |  j  d  k	 r* |  j  } d  |  _  q? |  j j } n d  } | d  k	 ro x! | j   D] } | j   qX Wn  d  } yB |  j j d | d t d t d t d t t	 j
 |  j d   Wn t j k
 r } n t j k
 r*} t j t j |  d t |  d t j   d	 t j j |   | } nV t k
 r} t j t d
  d t |  d t j   d	 t j j |   | } n X| S(   NRK   t
   is_previewt   process_contentst   process_namest   process_exportu   maint   failure_messaget   detailst   parentu3   There was a problem with updating the name preview:(   R   R   R   RK   t   iter_allt   resett   runR   R   t   utils_t   get_settings_for_batcherR   R   t   BatcherCancelErrort   ActionErrort	   messages_t   display_failure_messaget   get_failing_action_messaget   strt	   tracebackt
   format_excR   R   R   t	   ExceptionR   (   R,   R6   RK   R   RE   t   e(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR9     sF    		
c         C` s;   t    } x+ | D]# } |  j | |  |  j |  q Wd  S(   N(   R   t   _update_parent_itemst   _update_item(   R,   RF   t   updated_parentsR   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR>   L  s    	c         C` s;   t    } x+ | D]# } |  j | |  |  j |  q Wd  S(   N(   R   t   _insert_parent_itemst   _insert_item(   R,   RF   t   inserted_parentsR   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR<   R  s    	c         C` s   | j  r% |  j |  j | j   } n d  } |  j j | |  j |  t | j  t	 t
 j j | j  | j j | j g  } | |  j |  j |  <| S(   N(   R  R   R  R   RG   R   t   _get_icon_from_itemR   R   R   R   R   t   safe_encode_gtkR  R  R	  R   (   R,   R   t   parent_tree_iterR   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR/  X  s    			c      	   C` sc   |  j  j |  j |  j |  |  j d t | j  |  j d t |  j	 d t
 j j | j   d  S(   Ni    (   RG   R   R   R  Rm   R   R   Rp   R   Ro   R   R   R2  R  (   R,   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR,  k  s    	


c         C` sA   x: | j  D]/ } | | k r
 |  j |  | j |  q
 q
 Wd  S(   N(   t   parentsR/  Rv   (   R,   R   R0  R  (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR.  u  s    c         C` sA   x: | j  D]/ } | | k r
 |  j |  | j |  q
 q
 Wd  S(   N(   R4  R,  Rv   (   R,   R   R-  R  (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR+  {  s    c         C` sP   |  j  rL |  j | t  |  j g  |  j D] } |  j j | ^ q) t  n  d  S(   N(   R   t   _set_items_sensitiveR   R   R   RK   R   (   R,   RF   RL   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR@     s    	c         C` s*   |  j  j |  j |  j |  |  j d  S(   Ni    (   RG   R  R   R  Rp   (   R,   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   _get_item_sensitive  s    	c         C` s>   t    } x. | D]& } |  j | |  |  j | |  q Wd  S(   N(   R   t   _set_item_sensitivet   _set_parent_items_sensitive(   R,   RF   RZ   t   processed_parentsR   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR5    s    	c         C` sL   |  j  |  |  j k rH |  j j |  j |  j  |  |  j d |  n  d  S(   Ni    (   R  R   RG   t	   set_valueRp   (   R,   R   RZ   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR7    s
    	
c         ` so   xh t  t | j   D]Q } | | k r t   f d   | j D  }   j | |  | j |  q q Wd  S(   Nc         3` s6   |  ], }   j  |    j k r   j |  Vq d  S(   N(   R  R   R6  (   R   t   child(   R,   (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pys	   <genexpr>  s    (   t   reversedR  R4  t   anyt   childrenR7  Rv   (   R,   R   R9  R  t   parent_sensitive(    (   R,   sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR8    s    c         C` sh   | j  t j j k r  |  j d S| j  t j j k r@ |  j d S| j  t j j k r` |  j d Sd  Sd  S(   Nu   itemu   groupu   folder(   R   R   R  t	   TYPE_ITEMRl   t
   TYPE_GROUPR  R   (   R,   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR1    s    c         C` s   t  |  _ | d k r% |  j j   n |  j j | t  |  j   x |  j D]z } | |  j	 k rL |  j	 | } | d k r qL n  |  j
 j |  } | d k s |  j j |  r |  j j |  q qL qL Wt |  _ d S(   u   
    Set the expanded state of items in the tree view.
    
    If `tree_path` is specified, set the states only for the child elements in
    the tree path, otherwise set the states in the whole tree view.
    N(   R   R   R   R4   t
   expand_allt
   expand_rowR   t'   _remove_no_longer_valid_collapsed_itemsR   R   RG   t   get_patht   row_expandedt   collapse_row(   R,   RQ   RL   t   item_tree_itert   item_tree_path(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR=     s    	
c         C` sQ   |  j  j d  k r d  St g  |  j D] } | |  j  j k r# | ^ q#  |  _ d  S(   N(   R   RK   R   R   R   (   R,   RL   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRD    s    c         C` s   t  |  _ g  |  j D] } | |  j k r | ^ q |  _ xC |  j D]8 } |  j | } | d  k	 rA |  j j   j |  qA qA W|  j r |  j r |  j	   t  |  _ n  t
 |  _ d  S(   N(   R   R"   R   R   R   R4   Ra   t   select_iterR#   t    _set_initial_scroll_to_selectionR   (   R,   RL   R   (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR?     s    	.
c         C` sM   t  |  _ | d  k	 r@ |  j j |  d  k	 r@ |  j j |  n  t |  _ d  S(   N(   R   R"   R   RG   RP   R4   t
   set_cursorR   (   R,   t   previous_cursor(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   _set_cursor  s    	$c         C` s~   |  j  rz |  j |  j  d } | d  k	 rz |  j j |  j |  j  d  } | d  k	 rw |  j j | d  t d d  qw qz n  d  S(   Ni    g      ?g        (   R   R   R   RG   RE  R4   t   scroll_to_cellR   (   R,   R   t   first_selected_item_path(    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyRK    s    	 N(    (    (H   t   __name__t
   __module__t   __doc__t   gobjectt   SIGNAL_RUN_FIRSTR   t   TYPE_PYOBJECTt   __gsignals__R   R   R[   R   t   Pixbuft   TYPE_BOOLEANt   TYPE_STRINGt   TYPE_INTR]   Rj   Rm   Rp   Ro   R  R  R   t   propertyR-   R5   R0   R1   R   R7   R8   RH   RI   RM   RS   R+   Rd   Re   RA   R   R   R   R{   R   R   R   Rx   Ry   Rz   RJ   R  RO   R;   R9   R>   R<   R/  R,  R.  R+  R@   R6  R5  R7  R8  R1  R=   RD  R?   RN  RK  (    (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyR      s   	(/							-							#		:			
	
					/				
							
	
		(   RS  t
   __future__R    R   R   R   t   future.builtinsR   R$   R'  t   pygtkt   requireR[   RT  t   gimpR   t   export_layersR   R   R   R   R  t   export_layers.guiR	   t   preview_base_R
   R#  t   PreviewR   t   type_register(    (    (    sH   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/gui/preview_name.pyt   <module>   s&   "
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       # -*- coding: utf-8 -*-

"""Class interconnecting preview widgets for item names and images."""

from __future__ import absolute_import, division, print_function, unicode_literals
from future.builtins import *

from export_layers import pygimplib as pg

from export_layers import builtin_constraints
from export_layers import builtin_procedures
from export_layers import exceptions


class PreviewsController(object):
  
  _DELAY_PREVIEWS_SETTING_UPDATE_MILLISECONDS = 50
  _DELAY_PREVIEWS_PANE_DRAG_UPDATE_MILLISECONDS = 500
  
  _ACTION_ERROR_KEY = 'action_error'
  
  def __init__(self, name_preview, image_preview, settings, image):
    self._name_preview = name_preview
    self._image_preview = image_preview
    self._settings = settings
    self._image = image
    
    self._selected_in_preview_constraints = {}
    self._custom_actions = {}
    self._is_initial_selection_set = False
    
    self._last_name_preview_update_successful = True
    
    self._paned_outside_previews_previous_position = (
      self._settings['gui/size/paned_outside_previews_position'].value)
    self._paned_between_previews_previous_position = (
      self._settings['gui/size/paned_between_previews_position'].value)
  
  def connect_setting_changes_to_previews(self):
    self._connect_actions_changed(self._settings['main/procedures'])
    self._connect_actions_changed(self._settings['main/constraints'])
    
    self._connect_setting_after_reset_collapsed_items_in_name_preview()
    self._connect_setting_after_reset_selected_items_in_name_preview()
    self._connect_setting_after_reset_displayed_items_in_image_preview()
    
    self._connect_toggle_name_preview_filtering()
    self._connect_update_rendering_of_image_preview()
    self._connect_image_preview_menu_setting_changes()
    
    self._connect_toplevel_notify_is_active()
  
  def connect_name_preview_events(self):
    self._name_preview.connect(
      'preview-selection-changed', self._on_name_preview_selection_changed)
    self._name_preview.connect(
      'preview-updated', self._on_name_preview_updated)
    self._name_preview.connect(
      'preview-tags-changed', self._on_name_preview_tags_changed)
  
  def on_paned_outside_previews_notify_position(self, paned, property_spec):
    current_position = paned.get_position()
    max_position = paned.get_property('max-position')
    
    if (current_position == max_position
        and self._paned_outside_previews_previous_position != max_position):
      self._disable_preview_on_paned_drag(
        self._name_preview,
        self._settings['gui/name_preview_sensitive'],
        'previews_sensitive')
      self._disable_preview_on_paned_drag(
        self._image_preview,
        self._settings['gui/image_preview_sensitive'],
        'previews_sensitive')
    elif (current_position != max_position
          and self._paned_outside_previews_previous_position == max_position):
      self._enable_preview_on_paned_drag(
        self._name_preview,
        self._settings['gui/name_preview_sensitive'],
        'previews_sensitive')
      self._enable_preview_on_paned_drag(
        self._image_preview,
        self._settings['gui/image_preview_sensitive'],
        'previews_sensitive')
    elif current_position != self._paned_outside_previews_previous_position:
      if self._image_preview.is_larger_than_image():
        pg.invocation.timeout_add_strict(
          self._DELAY_PREVIEWS_PANE_DRAG_UPDATE_MILLISECONDS,
          self._image_preview.update)
      else:
        pg.invocation.timeout_remove_strict(self._image_preview.update)
        self._image_preview.resize()
    
    self._paned_outside_previews_previous_position = current_position
  
  def on_paned_between_previews_notify_position(self, paned, property_spec):
    current_position = paned.get_position()
    max_position = paned.get_property('max-position')
    min_position = paned.get_property('min-position')
    
    if (current_position == max_position
        and self._paned_between_previews_previous_position != max_position):
      self._disable_preview_on_paned_drag(
        self._image_preview,
        self._settings['gui/image_preview_sensitive'],
        'vpaned_preview_sensitive')
    elif (current_position != max_position
          and self._paned_between_previews_previous_position == max_position):
      self._enable_preview_on_paned_drag(
        self._image_preview,
        self._settings['gui/image_preview_sensitive'],
        'vpaned_preview_sensitive')
    elif (current_position == min_position
          and self._paned_between_previews_previous_position != min_position):
      self._disable_preview_on_paned_drag(
        self._name_preview,
        self._settings['gui/name_preview_sensitive'],
        'vpaned_preview_sensitive')
    elif (current_position != min_position
          and self._paned_between_previews_previous_position == min_position):
      self._enable_preview_on_paned_drag(
        self._name_preview,
        self._settings['gui/name_preview_sensitive'],
        'vpaned_preview_sensitive')
    elif current_position != self._paned_between_previews_previous_position:
      if self._image_preview.is_larger_than_image():
        pg.invocation.timeout_add_strict(
          self._DELAY_PREVIEWS_PANE_DRAG_UPDATE_MILLISECONDS,
          self._image_preview.update)
      else:
        pg.invocation.timeout_remove_strict(self._image_preview.update)
        self._image_preview.resize()
    
    self._paned_between_previews_previous_position = current_position
  
  def _connect_actions_changed(self, actions_):
    def _on_after_add_action(actions_, action, *args, **kwargs):
      if action['enabled'].value:
        self._update_previews_on_setting_change(action['enabled'])
      action['enabled'].connect_event(
        'value-changed', self._update_previews_on_setting_change)
    
    def _on_after_reorder_action(actions_, action, *args, **kwargs):
      if action['enabled'].value:
        self._update_previews_on_setting_change(action['enabled'])
    
    def _on_before_remove_action(actions_, action, *args, **kwargs):
      if action['enabled'].value:
        # Changing the enabled state triggers the 'value-changed' event and thus
        # properly keeps the previews in sync after action removal.
        action['enabled'].set_value(False)
    
    actions_.connect_event('after-add-action', _on_after_add_action)
    actions_.connect_event('after-reorder-action', _on_after_reorder_action)
    actions_.connect_event('before-remove-action', _on_before_remove_action)
  
  def _update_previews_on_setting_change(self, setting):
    self._name_preview.lock_update(False, self._ACTION_ERROR_KEY)
    pg.invocation.timeout_add_strict(
      self._DELAY_PREVIEWS_SETTING_UPDATE_MILLISECONDS, self._name_preview.update)
    
    self._image_preview.lock_update(False, self._ACTION_ERROR_KEY)
    pg.invocation.timeout_add_strict(
      self._DELAY_PREVIEWS_SETTING_UPDATE_MILLISECONDS, self._image_preview.update)
  
  def _connect_setting_after_reset_collapsed_items_in_name_preview(self):
    self._settings['gui/name_preview_layers_collapsed_state'].connect_event(
      'after-reset',
      lambda setting: self._name_preview.set_collapsed_items(setting.value[self._image.ID]))
  
  def _connect_setting_after_reset_selected_items_in_name_preview(self):
    self._settings['main/selected_layers'].connect_event(
      'after-reset',
      lambda setting: self._name_preview.set_selected_items(setting.value[self._image.ID]))
  
  def _connect_setting_after_reset_displayed_items_in_image_preview(self):
    def _clear_image_preview(setting):
      self._image_preview.clear()
    
    self._settings['gui/image_preview_displayed_layers'].connect_event(
      'after-reset', _clear_image_preview)
  
  def _connect_toggle_name_preview_filtering(self):
    def _after_add_selected_in_preview(constraints, constraint, orig_constraint_dict):
      if constraint['orig_name'].value == 'selected_in_preview':
        self._selected_in_preview_constraints[constraint.name] = constraint
        
        _on_enabled_changed(constraint['enabled'])
        constraint['enabled'].connect_event('value-changed', _on_enabled_changed)
    
    def _before_remove_selected_in_preview(constraints, constraint):
      if constraint.name in self._selected_in_preview_constraints:
        del self._selected_in_preview_constraints[constraint.name]
    
    def _before_clear_constraints(constraints):
      self._selected_in_preview_constraints = {}
      self._name_preview.is_filtering = False
    
    def _on_enabled_changed(constraint_enabled):
      self._name_preview.is_filtering = (
        any(constraint['enabled'].value
            for constraint in self._selected_in_preview_constraints.values()))
    
    self._settings['main/constraints'].connect_event(
      'after-add-action', _after_add_selected_in_preview)
    
    self._settings['main/constraints'].connect_event(
      'before-remove-action', _before_remove_selected_in_preview)
    
    self._settings['main/constraints'].connect_event(
      'before-clear-actions', _before_clear_constraints)
  
  def _connect_update_rendering_of_image_preview(self):
    def _after_add_action(actions, action, orig_action_dict, builtin_actions):
      if action['orig_name'].value not in builtin_actions:
        self._custom_actions[action.get_path()] = action
        
        _update_rendering_of_image_preview(action['enabled'])
        action['enabled'].connect_event('value-changed', _update_rendering_of_image_preview)
    
    def _before_remove_action(actions, action):
      if action.get_path() in self._custom_actions:
        del self._custom_actions[action.get_path()]
    
    def _before_clear_actions(actions):
      for action in actions:
        if action.get_path() in self._custom_actions:
          del self._custom_actions[action.get_path()]
      
      if not self._custom_actions:
        self._image_preview.prepare_image_for_rendering()
    
    def _update_rendering_of_image_preview(action_enabled):
      if not any(action['enabled'].value for action in self._custom_actions.values()):
        self._image_preview.prepare_image_for_rendering()
      else:
        self._image_preview.prepare_image_for_rendering(
          ['after_process_item_contents'], ['after_process_item_contents'])
    
    self._settings['main/procedures'].connect_event(
      'after-add-action',
      _after_add_action,
      builtin_procedures.BUILTIN_PROCEDURES)
    
    self._settings['main/procedures'].connect_event(
      'before-remove-action', _before_remove_action)
    
    self._settings['main/procedures'].connect_event(
      'before-clear-actions', _before_clear_actions)
    
    self._settings['main/constraints'].connect_event(
      'after-add-action',
      _after_add_action,
      builtin_constraints.BUILTIN_CONSTRAINTS)
    
    self._settings['main/constraints'].connect_event(
      'before-remove-action', _before_remove_action)
    
    self._settings['main/constraints'].connect_event(
      'before-clear-actions', _before_clear_actions)
  
  def _connect_image_preview_menu_setting_changes(self):
    self._settings['gui/image_preview_automatic_update'].connect_event(
      'value-changed',
      lambda setting, update_if_below_setting: update_if_below_setting.set_value(False),
      self._settings['gui/image_preview_automatic_update_if_below_maximum_duration'])
  
  def _connect_toplevel_notify_is_active(self):
    toplevel = (
      pg.gui.get_toplevel_window(self._name_preview)
      or pg.gui.get_toplevel_window(self._image_preview))
    if toplevel is not None:
      toplevel.connect('notify::is-active', self._on_toplevel_notify_is_active)
   
  def _on_name_preview_selection_changed(self, preview):
    self._update_selected_items()
    self._update_image_preview()
  
  def _on_name_preview_updated(self, preview, error):
    if isinstance(error, exceptions.ActionError):
      self._name_preview.lock_update(True, self._ACTION_ERROR_KEY)
      self._image_preview.lock_update(True, self._ACTION_ERROR_KEY)
    
    self._image_preview.update_item()
  
  def _on_name_preview_tags_changed(self, preview):
    self._update_image_preview()
  
  def _on_toplevel_notify_is_active(self, toplevel, property_spec):
    if toplevel.is_active():
      pg.invocation.timeout_remove_strict(self._name_preview.update)
      pg.invocation.timeout_remove_strict(self._image_preview.update)
      
      self._name_preview.update(reset_items=True)
      
      if not self._is_initial_selection_set:
        self._set_initial_selection_and_update_image_preview()
      else:
        self._image_preview.update()
  
  def _enable_preview_on_paned_drag(
        self, preview, preview_sensitive_setting, update_lock_key):
    preview.lock_update(False, update_lock_key)
    preview.add_function_at_update(preview.set_sensitive, True)
    # In case the image preview gets resized, the update would be canceled,
    # hence update always.
    pg.invocation.timeout_add(
      self._DELAY_PREVIEWS_PANE_DRAG_UPDATE_MILLISECONDS, preview.update)
    preview_sensitive_setting.set_value(True)
  
  def _disable_preview_on_paned_drag(
        self, preview, preview_sensitive_setting, update_lock_key):
    preview.lock_update(True, update_lock_key)
    preview.set_sensitive(False)
    preview_sensitive_setting.set_value(False)
  
  def _set_initial_selection_and_update_image_preview(self):
    setting_value = self._settings['gui/image_preview_displayed_layers'].value[self._image.ID]
    
    if not setting_value:
      raw_item_id_to_display = None
    else:
      raw_item_id_to_display = list(setting_value)[0]
    
    if (raw_item_id_to_display is None
        and not self._settings['main/selected_layers'].value[self._image.ID]
        and self._image.active_layer is not None):
      raw_item_id_to_display = self._image.active_layer.ID
      # This triggers an event that updates the image preview as well.
      self._name_preview.set_selected_items([raw_item_id_to_display])
    else:
      self._image_preview.update_item(raw_item_id_to_display)
      self._image_preview.update()
    
    self._is_initial_selection_set = True
  
  def _update_selected_items(self):
    selected_items_dict = self._settings['main/selected_layers'].value
    selected_items_dict[self._image.ID] = self._name_preview.selected_items
    self._settings['main/selected_layers'].set_value(selected_items_dict)
  
  def _update_image_preview(self):
    item_from_cursor = self._name_preview.get_item_from_cursor()
    if item_from_cursor is not None:
      if (self._image_preview.item is None
          or item_from_cursor.raw.ID != self._image_preview.item.raw.ID
          or item_from_cursor.type != self._image_preview.item.type):
        self._image_preview.item = item_from_cursor
        self._image_preview.update()
    else:
      items_from_selected_rows = self._name_preview.get_items_from_selected_rows()
      if items_from_selected_rows:
        self._image_preview.item = items_from_selected_rows[0]
        self._image_preview.update()
      else:
        self._image_preview.clear()
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          