B
    2Nb2                 @   s   d Z ddlmZ ddlmZmZmZmZ G dd de	Z
G dd de
ZG dd	 d	e
Zd
Zdd Zd#ddZddddgfddZddddgdfddZddddgdfddZd$dd Zd%d!d"ZdS )&u   Programmes pour créer des widgets
Une class Widget (et FloatSlider, IntSlider) qui permet
d'enregistrer des paramètres avant de créer le widget. La 
syntaxe est la même que les ipywidgets. Ceci permet entre
autre de mettre de séparer le fond (les parmètres) de la forme
(l'axe), ce que matplotlib ne permet pas.
Des fonctions : 
    make_param_widgets, 
    make_choose_plot, 
    make_reset_button, 
    make_log_button,
    make_start_stop_animation
    N)SliderButtonRadioButtonsCheckButtonsc               @   s   e Zd ZdZdZdd ZdS )WidgetN c             K   sB   x<|  D ]0\}}tt| |s.td|t| || q
W d S )NzAttribut "{}" non valide)itemshasattrtype	Exceptionformatsetattr)selfZkwdkeyval r   D   g:\mon drive\cours\m2 agreg\leçons\lp mouvement brownien\widgets.py__init__   s    zWidget.__init__)__name__
__module____qualname__valuedescriptionr   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdZdd ZdS )FloatSliderr      c             C   s(   t || j| j| j| jd}|| |S )N)valinit)r   r   minmaxr   
on_changed)r   axupdatewr   r   r   make_mpl_widget   s    
zFloatSlider.make_mpl_widgetN)r   r   r   r   r   r"   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdZdd ZdS )	IntSliderr   
   c             C   s*   t || j| j| j| jdd}|| |S )Nr   )r   valstep)r   r   r   r   r   r   )r   r   r    r!   r   r   r   r"   (   s    
zIntSlider.make_mpl_widgetN)r   r   r   r   r   r"   r   r   r   r   r#   $   s   r#   lightgoldenrodyellowc                s   t  }t| }|\}}}}|| }	d fdd	}
i  xJt|  D ]:\}\}}|j|||	|  ||	gtd}|||
 |< qFW |
   S )u    Crée automatiquement les widget matplotlib
    parameters : dictionnaire contenant les parameters
    plot_data : callback fonction
    slider_box : boite dans laquelle mettre les sliders
    Nc                s:   i }x   D ]\}}|j||< qW f | t  d S )N)r   r   pltdraw)r   valuesr   r!   )mpl_widgets	plot_datar   r   r    F   s
    
z"make_param_widgets.<locals>.update)	facecolor)N)r'   gcflen	enumerater   add_axesslider_colorr"   )
parametersr+   
slider_boxfnx0y0WHheightr    ir   elmr   r   )r*   r+   r   make_param_widgets;   s    	r=   c       	         s   t  j|td}dkr& g }g }x>D ]6}t|trJ|d }| }|| ||  q4W t	|||  fdd} 
|  S )a  Create check button for the lines
    lines : all the lines
    box : the box where the check button will be placed
    which : by default (None) : all the plots
        otherwise : key of the lines 
            or tuple of keys (one button for many lines)
    )r,   Nr   c                sj      }xRtD ]F\}}|| }t|trJx*|D ]}| | q2W q| | qW j  d S )N)
get_statusr/   
isinstancetupleset_visiblecanvas	draw_idle)labelZstatesr;   r   statek)choose_widgetr4   lineswhichr   r   
chooseploto   s    

z$make_choose_plot.<locals>.chooseplot)r'   r-   r0   r1   keysr?   r@   appendget_visibler   
on_clicked)	rH   boxrI   r   labelsZ	is_activer   r<   rJ   r   )rG   r4   rH   rI   r   make_choose_plotX   s     



rQ   g?g{Gzt?g?g{Gz?c                s@   t  }|j|td}t|dtdd} fdd}|| |S )N)r,   Resetz0.975)color
hovercolorc                s   x   D ]}|  q
W d S )N)r)   reset)eventwidget)r*   r   r   rU      s    z make_reset_button.<locals>.reset)r'   r-   r0   r1   r   rN   )r*   rO   r4   r   buttonrU   r   )r*   r   make_reset_button~   s    
rY   gQ?g?gQ?g333333?c                s^   t  j|td}ddg}t||  dk  dkg fdd}| S )zt Make a log button
    ax : the axis
    ylims : None or dictionary with the ylim for 'linear' and 'log' scales
    )r,   zlog xzlog ylogc                sn   | dkrd}d}| dkr d}d}  | r0dnd}t || d k	r`| dkr` |  j  d S )	Nzlog x
set_xscaler   zlog y
set_yscaler   rZ   linear)r>   getattrset_ylimrB   rC   )rD   methodindexrE   )r   r4   rW   ylimsr   r   set_log   s    z make_log_button.<locals>.set_log)r'   r-   r0   r1   r   
get_xscale
get_yscalerN   )r   rO   rb   ax_btnrP   rc   r   )r   r4   rW   rb   r   make_log_button   s     
rg   Tc                sF   t  }|j|td}dg}t|||g fdd}| S )N)r,   animc                s6     d r td  j  ntd  j  d S )Nr   onoff)r>   printZevent_sourcestartstop)rD   )rh   rW   r   r   set_anim   s
    z+make_start_stop_animation.<locals>.set_anim)r'   r-   r0   r1   r   rN   )rh   rO   Zstart_animationr4   rf   rP   rn   r   )rh   rW   r   make_start_stop_animation   s    
ro   (   c             C   s   dg}d}xl|  dD ]^}|dr(d}|sRt|d t| d |krR|d |d  d| 7  < |drd}qW dd	 |D }d
|S )Nr   F $Tr   c             S   s   g | ]}|  r|qS r   )strip).0r<   r   r   r   
<listcomp>   s    z%justify_paragraph.<locals>.<listcomp>
)split
startswithr.   rL   endswithjoin)stringwidthoutZin_equationwordr   r   r   justify_paragraph   s    


r   c                sf   dg}xB|  dD ]4}| dkr.|d q|d  | d 7  < qW  fdd|D }d|S )Nr   rw   rs   rq   c                s   g | ]}t | d qS ))r}   )r   )ru   	paragraph)r}   r   r   rv      s    zjustify.<locals>.<listcomp>z

)rx   rt   rL   r{   )r|   r}   Z
paragraphsrH   r~   r   )r}   r   justify   s    r   )N)rp   )rp   )__doc__matplotlib.pyplotpyplotr'   Zmatplotlib.widgetsr   r   r   r   objectr   r   r#   r1   r=   rQ   rY   rg   ro   r   r   r   r   r   r   <module>   s   		
&
