ó
dòôdc           @` 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
 d d l m Z d d l m Z d e j j j f d „  ƒ  YZ d	 e j j f d
 „  ƒ  YZ d e j j f d „  ƒ  YZ d e j j f d „  ƒ  YZ d S(   u/   Custom setting classes specific to the plug-in.i    (   t   absolute_importt   divisiont   print_functiont   unicode_literals(   t   *N(   t	   pygimplib(   t   renamert   FilenamePatternEntryPresenterc           B` s   e  Z d  Z d „  Z RS(   u}   `pygimplib.setting.Presenter` subclass for
  `pygimplib.gui.FilenamePatternEntry` elements.
  
  Value: Text in the entry.
  c         C` s   t  j j t j t j ƒ ƒ S(   N(   t   pgt   guit   FilenamePatternEntryt   renamer_t   get_field_descriptionst   FIELDS(   t   selft   setting(    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   _create_gui_element   s    (   t   __name__t
   __module__t   __doc__R   (    (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyR      s   t   FilenamePatternSettingc           B` s,   e  Z e e j j e j j g Z d  „  Z RS(   c         C` s"   | s |  j  |  _ n	 | |  _ d  S(   N(   t   _default_valuet   _value(   R   t   value(    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   _assign_value&   s    (	   R   R   R   R   t   SettingGuiTypest   extended_entryt   entryt   _ALLOWED_GUI_TYPESR   (    (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyR      s   	t   ImagesAndGimpItemsSettingc           B` sG   e  Z d  Z g  Z g  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   u™  Class for settings representing a mapping of (GIMP image ID, GIMP item IDs)
  pairs.
  
  The mapping is implemented as `collections.defaultdict(set)`.
  
  A GIMP item ID can be represented as an integer or an (ID, FOLDER_KEY) tuple,
  where `FOLDER_KEY` is a string literal defined in `pygimplib.itemtree`.
  
  When storing this setting to a persistent source, images are stored as file
  paths and items are stored as (item class name, item path) or (item class
  name, item path, FOLDER_KEY) tuples. Item class name and item path are
  described in `pygimplib.pdbutils.get_item_from_image_and_item_path()`.
  
  Default value: `collections.defaultdict(set)`
  c         C` s   t  j t ƒ S(   N(   t   collectionst   defaultdictt   set(   R   (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   <lambda>@   t    c         C` sO  t  | t ƒ rEt j t ƒ } x*| j ƒ  D]\ } } t  | t j ƒ r^ t j	 j
 | ƒ } n t j	 j | ƒ } | d  k r‚ q+ n  | j } t  | t j ƒ s° t  | t j ƒ rÈ t d j | ƒ ƒ ‚ n  t ƒ  } x`| D]X} t  | t t f ƒ rt | ƒ d k r#t d j t | ƒ ƒ ƒ ‚ n  t  | d t ƒ rqt j j | d ƒ }	 |	 d  k	 rÿ| j t | ƒ ƒ qÿq0t | ƒ d k rš| d }
 | d  } n d  }
 | } t j	 j | | Œ }	 |	 d  k	 r0|
 d  k ræ| j |	 j ƒ qÿ| j |	 j |
 f ƒ q0qØ t j j | ƒ }	 |	 d  k	 rØ | j | ƒ qØ qØ W| | | <q+ Wn | } | S(   Nu   expected a list-like, found {}i   i   uK   list-likes representing items must contain exactly 2 or 3 elements (has {})i    (   i   i   (   t
   isinstancet   dictR   R   R    t   itemst   typest   StringTypesR   t   pdbutilst   find_image_by_filepatht   find_image_by_idt   Nonet   IDt   Iterablet	   TypeErrort   formatt   listt   tuplet   lent
   ValueErrort   intt   gimpt   Itemt   from_idt   addt!   get_item_from_image_and_item_path(   R   t	   raw_valueR   t   keyR%   t   imaget   image_idt   processed_itemst   itemt   item_objectt	   item_typet   item_class_name_and_path(    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   _raw_to_valueB   sN    	%	
	c         C` sÁ  i  } | d k rL x¨| j  ƒ  D]& \ } } t d „  | Dƒ ƒ | | <q Wnqxn| j  ƒ  D]`\ } } t j j | ƒ } | d  k sY | j d  k r˜ qY n  t j j | j ƒ } g  | | <xÿ | D]÷ } t	 | t t
 f ƒ r,t | ƒ d k r	t d j t | ƒ ƒ ƒ ‚ n  t j j | d ƒ }	 | d }
 n t j j | ƒ }	 d  }
 |	 d  k rVq¾ n  t j j |	 d t ƒ} | d  k	 r¾ |
 d  k rš| | j | ƒ qµ| | j | |
 g ƒ q¾ q¾ WqY W| S(   Nu   sessionc         s` s0   |  ]& } t  | t ƒ r | n	 t | ƒ Vq d  S(   N(   R#   R4   R0   (   t   .0t   item_id(    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pys	   <genexpr>‚   s    i   uF   list-likes representing items must contain exactly 2 elements (has {})i    i   t   include_image(   R%   R0   R   R(   R*   R+   t   filenamet   utilst   safe_decode_gimpR#   R1   R2   R3   R/   R5   R6   R7   t   get_item_as_patht   Falset   append(   R   R   t   source_typeR:   R=   t   item_idsR<   t   image_filepathRE   R?   RA   t   item_as_path(    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   _value_to_raw|   s:    
#c         C` s   t  d ƒ |  j d <d  S(   Nu   Value must be a dictionary.u   value_must_be_dict(   t   _t   error_messages(   R   (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   _init_error_messages¨   s    c         C` s?   t  | t ƒ s; t j j t j j | ƒ |  j d ƒ ‚ n  d  S(   Nu   value_must_be_dict(   R#   R$   R   R   t   SettingValueErrort   value_to_str_prefixRS   (   R   R   (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt	   _validate«   s    	(
   R   R   R   t   _ALLOWED_PDB_TYPESR   t   _DEFAULT_DEFAULT_VALUERC   RQ   RT   RW   (    (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyR   -   s   		:	,	t   ImageIdsAndDirectoriesSettingc           B` sY   e  Z d  Z i  Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z RS(   uh  Class for settings the list of currently opened images and their import
  directory paths.
  
  The setting value is a dictionary of (image ID, import directory path) pairs.
  The import directory path is `None` if the image does not have any.
  
  This setting cannot be registered to the PDB as no corresponding PDB type
  exists.
  
  Default value: `{}`
  c         C` s   t  |  j ƒ S(   N(   R$   R   (   R   (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyR   À   s    c         C` s0   |  j  ƒ  \ } } |  j | ƒ |  j | ƒ d S(   u±   Removes all (image ID, import directory path) pairs for images no longer
    opened in GIMP. Adds (image ID, import directory path) pairs for new images
    opened in GIMP.
    N(   t   _get_currently_opened_imagest   _filter_images_no_longer_openedt   _add_new_opened_images(   R   t   current_imagest   current_image_ids(    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   update_image_ids_and_dirpathsÆ   s    c         C` s/   | |  j  k r t | ƒ ‚ n  | |  j  | <d S(   uŠ   Assigns a new directory path to the specified image ID.
    
    If the image ID does not exist in the setting, `KeyError` is raised.
    N(   R   t   KeyError(   R   R=   t   dirpath(    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   update_dirpathÏ   s    c         C` s8   t  j ƒ  } t g  | D] } | j ^ q ƒ } | | f S(   N(   R5   t
   image_listR    R,   (   R   R^   R<   R_   (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyR[   Ù   s    "c         ` s#   ‡  ‡ f d †  ˆ j  Dƒ ˆ _  d  S(   Nc         ` s,   i  |  ]" } | ˆ  k r ˆ j  | | “ q S(    (   R   (   RD   R=   (   R_   R   (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pys
   <dictcomp>á   s   	 (   R   (   R   R_   (    (   R_   R   sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyR\   ß   s    c         C` sC   x< | D]4 } | j  |  j k r |  j | ƒ |  j | j  <q q Wd  S(   N(   R,   R   t   _get_image_import_dirpath(   R   R^   R<   (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyR]   ä   s    c         C` s6   | j  d  k	 r. t j j t j j | j  ƒ ƒ Sd  Sd  S(   N(   RG   R+   t   ost   patht   dirnameR   RH   RI   (   R   R<   (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyRe   é   s    (   R   R   R   RY   t   propertyR   R`   Rc   R[   R\   R]   Re   (    (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyRZ   ±   s   			
			(   R   t
   __future__R    R   R   R   t   future.builtinsR   Rf   R&   R5   t   export_layersR   R   R   R   R   t   presenters_gtkt   ExtendedEntryPresenterR   t   StringSettingR   t   SettingR   RZ   (    (    (    sG   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/settings_custom.pyt   <module>   s   "
„                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                # -*- coding: utf-8 -*-

"""Plug-in settings."""

from __future__ import absolute_import, division, print_function, unicode_literals
from future.builtins import *

import collections

import gimp
import gimpenums

from export_layers import pygimplib as pg

from export_layers import actions
from export_layers import builtin_constraints
from export_layers import builtin_procedures
from export_layers import export as export_
# Despite being unused, `settings_custom` must be imported so that the custom
# setting and GUI classes defined there are properly registered (via metaclasses
# in `pg.setting.meta`).
from export_layers import settings_custom  # @UnusedImport
from export_layers.gui import settings_gui


def create_settings():
  settings = pg.setting.create_groups({
    'name': 'all_settings',
    'groups': [
      {
        # These settings require special handling in the code, hence their separation
        # from the other settings.
        'name': 'special',
        'tags': ['ignore_reset', 'ignore_load', 'ignore_save'],
        'setting_attributes': {'gui_type': None},
      },
      {
        'name': 'main',
        'setting_attributes': {'setting_sources': ['session', 'persistent']},
      }
    ]
  })
  
  settings['special'].add([
    {
      'type': 'options',
      'name': 'run_mode',
      'default_value': 'non_interactive',
      'items': [
        ('interactive', 'RUN-INTERACTIVE', gimpenums.RUN_INTERACTIVE),
        ('non_interactive', 'RUN-NONINTERACTIVE', gimpenums.RUN_NONINTERACTIVE),
        ('run_with_last_vals', 'RUN-WITH-LAST-VALS', gimpenums.RUN_WITH_LAST_VALS)],
      'display_name': _('The run mode'),
    },
    {
      'type': 'image',
      'name': 'image',
      'default_value': None,
      'display_name': _('Image'),
    },
    {
      'type': 'boolean',
      'name': 'first_plugin_run',
      'default_value': True,
      'pdb_type': None,
      'setting_sources': ['session'],
    },
  ])
  
  settings['main'].add([
    {
      'type': 'file_extension',
      'name': 'file_extension',
      'default_value': 'png',
      'display_name': _('File extension'),
      'adjust_value': True,
    },
    {
      'type': 'string',
      'name': 'output_directory',
      'default_value': gimp.user_directory(1),  # `Documents` directory
      'display_name': _('Output directory'),
      'gui_type': None,
      'tags': ['ignore_reset'],
    },
    {
      'type': 'filename_pattern',
      'name': 'layer_filename_pattern',
      'default_value': '[layer name]',
      'display_name': _('Layer filename pattern'),
      'description': _('Layer filename pattern (empty string = layer name)'),
      'gui_type': None,
    },
    {
      'type': 'images_and_gimp_items',
      'name': 'selected_layers',
      'default_value': collections.defaultdict(set),
      'display_name': _('Selected layers'),
      'pdb_type': None,
    },
    {
      'type': 'options',
      'name': 'overwrite_mode',
      'default_value': 'rename_new',
      'items': [
        ('replace', _('_Replace'), pg.overwrite.OverwriteModes.REPLACE),
        ('skip', _('_Skip'), pg.overwrite.OverwriteModes.SKIP),
        ('rename_new', _('Rename _new file'), pg.overwrite.OverwriteModes.RENAME_NEW),
        ('rename_existing', _('Rename _existing file'),
         pg.overwrite.OverwriteModes.RENAME_EXISTING)],
      'display_name': _('Overwrite mode (non-interactive run mode only)'),
    },
    {
      'type': 'dict',
      'name': 'available_tags',
      'default_value': actions.BUILTIN_TAGS,
      'pdb_type': None,
      'gui_type': None,
    },
    {
      'type': 'boolean',
      'name': 'edit_mode',
      'default_value': False,
      'pdb_type': None,
      'gui_type': None,
    },
    {
      'type': 'string',
      'name': 'plugin_version',
      'default_value': pg.config.PLUGIN_VERSION,
      'pdb_type': None,
      'gui_type': None,
    },
  ])
  
  settings.add([settings_gui.create_gui_settings()])
  
  settings['main'].add([actions.create(
    name='procedures',
    initial_actions=[builtin_procedures.BUILTIN_PROCEDURES['use_layer_size']]),
  ])
  
  visible_constraint_dict = dict(builtin_constraints.BUILTIN_CONSTRAINTS['visible'])
  visible_constraint_dict['enabled'] = False
  visible_constraint_dict['also_apply_to_parent_folders'] = True
  
  settings['main'].add([actions.create(
    name='constraints',
    initial_actions=[
      builtin_constraints.BUILTIN_CONSTRAINTS['layers'],
      visible_constraint_dict]),
  ])
  
  settings['main/procedures'].connect_event(
    'after-add-action', _on_after_add_procedure, settings['main'])
  
  settings['main/constraints'].connect_event(
    'after-add-action',
    _on_after_add_constraint,
    settings['main/selected_layers'],
    settings['special/image'])
  
  return settings


def _on_after_add_procedure(procedures, procedure, orig_procedure_dict, main_settings):
  if procedure['orig_name'].value == 'export':
    _set_initial_output_directory_in_export(
      procedure['arguments/output_directory'],
      main_settings['output_directory'])
    
    _set_sensitive_for_image_filename_pattern_in_export(
      procedure['arguments/export_mode'],
      procedure['arguments/single_image_filename_pattern'])
    
    procedure['arguments/export_mode'].connect_event(
      'value-changed',
      _set_sensitive_for_image_filename_pattern_in_export,
      procedure['arguments/single_image_filename_pattern'])


def _set_initial_output_directory_in_export(
      export_output_directory_setting, output_directory_setting):
  # The check avoids plug-in failing to display the GUI due to an invalid
  # directory.
  if output_directory_setting.value:
    export_output_directory_setting.set_value(output_directory_setting.value)


def _set_sensitive_for_image_filename_pattern_in_export(
      export_mode_setting, single_image_filename_pattern_setting):
  if export_mode_setting.value == export_.ExportModes.ENTIRE_IMAGE_AT_ONCE:
    single_image_filename_pattern_setting.gui.set_sensitive(True)
  else:
    single_image_filename_pattern_setting.gui.set_sensitive(False)


def _on_after_add_constraint(
      constraints,
      constraint,
      orig_constraint_dict,
      selected_items_setting,
      image_setting):
  if constraint['orig_name'].value == 'selected_in_preview':
    constraint['arguments/selected_layers'].gui.set_visible(False)
    _sync_selected_items_with_constraint(selected_items_setting, constraint, image_setting)


def _sync_selected_items_with_constraint(selected_items_setting, constraint, image_setting):
  
  def _on_selected_items_changed(selected_items_setting, selected_items_constraint, image_setting):
    if image_setting.value is not None:
      selected_items_constraint['arguments/selected_layers'].set_value(
        selected_items_setting.value[image_setting.value.ID])
  
  _on_selected_items_changed(selected_items_setting, constraint, image_setting)
  
  selected_items_setting.connect_event(
    'value-changed', _on_selected_items_changed, constraint, image_setting)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               