a
    Ad!                     @   sJ   d dl Z d dlZd dlZd dlmZ d dlmZ dd ZG dd dZ	dS )    N)errors)
ToolButtonc                 C   s   dd t | dg D S )Nc                 S   s"   g | ]}t |tr|d  n|qS )r   )
isinstancetuple).0x r   ;/var/www/html/stable-diffusion-webui/modules/ui_loadsave.py
<listcomp>       z!radio_choices.<locals>.<listcomp>choices)getattr)compr   r   r	   radio_choices
   s    r   c                   @   sj   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )
UiLoadsavez@allows saving and restoring default values for gradio componentsc              
   C   s   || _ i | _i | _d| _d| _d | _d | _d | _ztj	
| j rJ|  | _W n6 ty } zd| _t|d W Y d }~n
d }~0 0 d S )NFTzloading settings)filenameui_settingscomponent_mappingerror_loadingfinalized_uiui_defaults_viewui_defaults_applyui_defaults_reviewospathexistsread_from_file	Exceptionr   display)selfr   er   r   r	   __init__   s    zUiLoadsave.__init__c              	      sT  j r
J d fdd	}ttjtjtjtjtjtjt	tj
fv rVjrV|d ttjkr|d |d |d |d ttjkr|dfd	d
 ttjkr|d ttjkr|d ttjkr|d ttjkr(fdd}|d|tdd fdd}ttjkrP|d| dS )z4adds component to the registry of tracked componentsNc                    s
    d| }t | dd d ur0d| j d| }t | ddr@d S j|d }|d u rht | |j|< n~|rv||svnpttjr|dkrt|}n6ttjr|dkrzt	|}W n t
y   Y d S 0 t| || |d ur|| |dkr|jvrj|< d S )N/custom_script_sourcezcustomscript/Zdo_not_save_to_configFvalue)r   r#   r   getr   grTextboxstrNumberfloat
ValueErrorsetattrr   )objfield	condition
init_fieldkeyZsaved_valuer   r   r   r   r	   apply_field*   s,    
z-UiLoadsave.add_component.<locals>.apply_fieldvisibler$   minimummaximumstepc                    s   | t  v S N)r   valr   r   r	   <lambda>R   r   z*UiLoadsave.add_component.<locals>.<lambda>c                    s6   t  tddr*t fdd| D S |  v S d S )NmultiselectFc                 3   s   | ]}| v V  qd S r8   r   )r   r$   r   r   r	   	<genexpr>a   r   zCUiLoadsave.add_component.<locals>.check_dropdown.<locals>.<genexpr>)r   r   allr9   r;   r>   r	   check_dropdown^   s    z0UiLoadsave.add_component.<locals>.check_dropdownr0   c                    sf   t tdd  j}t| tkr6dd |D }| |v S t| tkr^d|   koXt|k S   S dS d S )Nc                 S   s   t | tjS r8   )r   r&   TabItem)r    r   r   r	   r<   h   r   z@UiLoadsave.add_component.<locals>.check_tab_id.<locals>.<lambda>c                 S   s   g | ]
}|j qS r   )id)r   tr   r   r	   r
   j   r   zBUiLoadsave.add_component.<locals>.check_tab_id.<locals>.<listcomp>r   F)listfilterchildrentyper(   intlen)Ztab_idZ	tab_itemsZtab_idsr;   r   r	   check_tab_idg   s    z.UiLoadsave.add_component.<locals>.check_tab_idselected)NN)r   rH   r&   SliderRadioCheckboxr'   r)   Dropdownr   Buttonr4   r   Tabs)r   r   r   r3   rA   rK   r   r2   r	   add_component%   s.    
0








zUiLoadsave.add_component c                 C   s   t |drRt|tjr8|jdur8| | d|j | |jD ]}| || q>nR|jdurv| | d|j | n.t|tj	r|j
dur| | d|j
 | dS )zQadds all components inside a gradio block x to the registry of tracked componentsrG   Nz/Tabs@r"   )hasattrr   r&   rR   elem_idrS   rG   	add_blocklabelrQ   r$   )r   r   r   cr   r   r	   rW   t   s    


zUiLoadsave.add_blockc                 C   s>   t | jddd}t|W  d    S 1 s00    Y  d S )Nrutf8encoding)openr   jsonload)r   filer   r   r	   r      s    zUiLoadsave.read_from_filec                 C   sD   t | jddd }tj||dd W d    n1 s60    Y  d S )Nwr[   r\      )indent)r^   r   r_   dump)r   current_ui_settingsra   r   r   r	   write_to_file   s    zUiLoadsave.write_to_filec                 C   s(   | j rtj| jrdS | | j dS )zqsaves default values to a file unless tjhe file is present and there was an error loading default values at startN)r   r   r   r   r   rg   r   r   r   r   r	   dump_defaults   s    zUiLoadsave.dump_defaultsc                 c   s   t | j |D ]\\}}}||}t|}t|trd|rd|t|krJq|| }t|trd|d }||krnq|du r~|dks|g krq|||fV  qdS )a  
        given a dictionary with defaults from a file and current values from gradio elements, returns
        an iterator over tuples of values that are not the same between the file and the current;
        tuple contents are: path, old value, new value
        r   NrT   )	zipr   itemsr%   r   r   rI   rJ   r   )r   rf   valuesr   	component	new_value	old_valuer   r   r   r	   iter_changes   s    

zUiLoadsave.iter_changesc              
   G   sv   dg}|  |  |D ]4\}}}|d u r,d}|d| d| d| d qt|dkrb|d |d d	|S )
NzR<table><thead><tr><th>Path</th><th>Old value</th><th>New value</th></thead><tbody>z*<span class='ui-defaults-none'>None</span>z<tr><td>z	</td><td>z
</td></tr>   z&<tr><td colspan=3>No changes</td></tr>z</tbody>rT   )rp   r   appendrJ   join)r   rl   textr   ro   rn   r   r   r	   ui_view   s     

zUiLoadsave.ui_viewc                 G   sZ   d}|   }| | |D ]\}}}|d7 }|||< q|dkrDdS | | d| dS )Nr   rq   zNo changes.zWrote z	 changes.)r   rp   copyrg   )r   rl   Znum_changedrf   r   _rn   r   r   r	   ui_apply   s    

zUiLoadsave.ui_applyc                 C   sp   t d| j d t  4 t jdddd| _t jddd	d| _W d
   n1 sV0    Y  t d| _d
S )zMcreates ui elements for editing defaults UI, without adding any logic to themzThis page allows you to change default values in UI elements on other tabs.<br />Make your changes, press 'View changes' to review the changed default values,<br />then press 'Apply' to write them to z>.<br />New defaults will apply after you restart the UI.<br />zView changesr   	secondary)r$   rV   variantApplyr   primaryNrT   )r&   HTMLr   RowrQ   r   r   r   rh   r   r   r	   	create_ui   s    
0zUiLoadsave.create_uic                 C   sX   | j r
J d| _ | jj| jt| j | jgd | jj| j	t| j | jgd dS )z[adds logic to elements created with create_ui; all add_block class must be made before thisT)fninputsoutputsN)
r   r   clickru   rE   r   rl   r   r   rx   rh   r   r   r	   setup_ui   s    
"zUiLoadsave.setup_uiN)rT   )__name__
__module____qualname____doc__r!   rS   rW   r   rg   ri   rp   ru   rx   r   r   r   r   r   r	   r      s   O
r   )
r_   r   gradior&   modulesr   modules.ui_componentsr   r   r   r   r   r   r	   <module>   s   