U
    l±Ëh3l  ã                   @   sˆ   d dl Z d dlZd dlmZmZmZmZ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d	lmZ G d
d„ deƒZdS )é    N)ÚUnionÚTupleÚCallableÚOptionalÚAnyé   )Ú	CTkCanvas)ÚThemeManager)Ú
DrawEngine)ÚCTkBaseClass)ÚCTkFont)ÚCTkImagec                       s>  e Zd ZU dZdZeed< dCeeeee ee ee	e
ee
e
f f ee	e
ee
e
f f  ee	e
ee
e
f f  ee	e
ee
e
f f  ee	e
ee
e
f f  ee	e
ee
e
f f  e	ee	e
ee
e
f f  df eee
ee	eef  e	ejdf e	eddf e
ee	eg ef df e
e
dœ‡ fdd„ZdDee
 dœdd„Z‡ fdd„Z‡ fdd„ZdEeedœ‡ fdd„Zdd„ Zdd„ Z‡ fdd „ZdF‡ fd"d#„	Zd$d%„ ZdG‡ fd&d'„	Ze
ed(œ‡ fd)d*„Zd+d,„ Z dHd-d.„Z!dId/d0„Z"d1d2„ Z#dJd3d4„Z$d5d6„ Z%dKe
ee	e
ef d7œd8d9„Z&dLe
e
d:œd;d<„Z'd=d>„ Z(d?d@„ Z)dAdB„ Z*‡  Z+S )MÚ	CTkButtonz¥
    Button with rounded corners, border, hover effect, image support, click command and textvariable.
    For detailed information check out the documentation.
    é   Ú_image_label_spacingéŒ   é   Né   ÚtransparentTÚnormalÚleftÚcenterzImageTk.PhotoImage)ÚmasterÚwidthÚheightÚcorner_radiusÚborder_widthÚborder_spacingÚbg_colorÚfg_colorÚhover_colorÚborder_colorÚ
text_colorÚtext_color_disabledÚbackground_corner_colorsÚround_width_to_even_numbersÚround_height_to_even_numbersÚtextÚfontÚtextvariableÚimageÚstateÚhoverÚcommandÚcompoundÚanchorc                    sB  t ƒ jf ||||dœ|—Ž |d kr2tjd d n|| _t| jt| jd ƒƒ| _|d krftjd d n|| _|| _	|d krˆtjd d n| j
|dd| _|	d kr®tjd d	 n|  
|	¡| _|
d krÐtjd d
 n|  
|
¡| _|d kròtjd d n|  
|¡| _|d krtjd d n|  
|¡| _|| _|| _|| _|| _d | _|| _|d krVtƒ n|  |¡| _t| jtƒr~| j | j¡ |  |¡| _d | _t| jtƒr¬| j  | j!¡ || _"|| _#|| _$|| _%|| _&d| _'t(| d|  )| j*¡|  )| j+¡d| _,| j,j-dddddd t.| j,ƒ| _/| j/ 0| j| j¡ |  1¡  |  2¡  |  3¡  d S )N)r   r   r   r   r   r   r   r   r   T©Ztransparencyr    r!   r"   r#   Fr   )r   Zhighlightthicknessr   r   é   Únsew©ÚrowÚcolumnZrowspanZ
columnspanÚsticky)4ÚsuperÚ__init__r	   ÚthemeÚ_corner_radiusÚminÚroundÚ_current_heightÚ_border_widthÚ_border_spacingÚ_check_color_typeÚ	_fg_colorÚ_hover_colorÚ_border_colorÚ_text_colorÚ_text_color_disabledÚ_background_corner_colorsZ_round_width_to_even_numbersZ_round_height_to_even_numbersÚ_textÚ_text_labelÚ_textvariabler   Ú_check_font_typeÚ_fontÚ
isinstanceÚadd_size_configure_callbackÚ_update_fontÚ_check_image_typeÚ_imageÚ_image_labelr   Úadd_configure_callbackÚ_update_imageÚ_stateÚ_hoverÚ_commandÚ	_compoundÚ_anchorÚ_click_animation_runningr   Ú_apply_widget_scalingÚ_desired_widthÚ_desired_heightÚ_canvasÚgridr
   Ú_draw_engineZset_round_to_even_numbersÚ_create_bindingsÚ_set_cursorÚ_draw)Úselfr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   Úkwargs©Ú	__class__© úL/tmp/pip-unpacked-wheel-ckatmccg/customtkinter/windows/widgets/ctk_button.pyr8      sP    &"""$

ýzCTkButton.__init__©Úsequencec                 C   s   |dks|dkrT| j  d| j¡ | jdk	r:| j d| j¡ | jdk	rT| j d| j¡ |dksd|dkr¨| j  d| j¡ | jdk	rŽ| j d| j¡ | jdk	r¨| j d| j¡ |dks¸|dkrü| j  d| j¡ | jdk	râ| j d| j¡ | jdk	rü| j d| j¡ dS )zS set necessary bindings for functionality of widget, will overwrite other bindings Nú<Enter>ú<Leave>ú
<Button-1>)r]   ÚbindÚ	_on_enterrH   rQ   Ú	_on_leaveÚ_clicked)rc   rj   rg   rg   rh   r`   l   s$    





zCTkButton._create_bindingsc                    sn   t ƒ j||Ž |  ¡  | jd k	r6| jj|  | j¡d |  ¡  | jj|  	| j
¡|  	| j¡d | jdd d S )N©r(   ©r   r   T)Úno_color_updates)r7   Ú_set_scalingÚ_create_gridrH   Ú	configureÚ_apply_font_scalingrK   rS   r]   rZ   r[   r\   rb   )rc   Úargsrd   re   rg   rh   ru   ‡   s    

ÿzCTkButton._set_scalingc                    s   t ƒ  |¡ |  ¡  d S ©N)r7   Ú_set_appearance_moderS   )rc   Zmode_stringre   rg   rh   r{   •   s    zCTkButton._set_appearance_moders   c                    s:   t ƒ  ||¡ | jj|  | j¡|  | j¡d |  ¡  d S )Nrs   )r7   Ú_set_dimensionsr]   rw   rZ   r[   r\   rb   )rc   r   r   re   rg   rh   r|   ™   s
    
ÿzCTkButton._set_dimensionsc                 C   sD   | j dk	r@| j j|  | j¡d | j ¡  | jjdddddd dS )zX pass font to tkinter widgets with applied font scaling and update grid with workaround Nrr   r   r1   r2   r3   )rH   rw   rx   rK   r]   Zgrid_forgetr^   ©rc   rg   rg   rh   rN       s    

zCTkButton._update_fontc                 C   sV   | j d k	rRt| jtƒr8| j j| j |  ¡ |  ¡ ¡d n| jd k	rR| j j| jd d S )N)r*   )rQ   rL   rP   r   rw   Zcreate_scaled_photo_imageZ_get_widget_scalingZ_get_appearance_moder}   rg   rg   rh   rS   ª   s    
ÿ

zCTkButton._update_imagec                    s(   t | jtƒr| j | j¡ tƒ  ¡  d S rz   )rL   rK   r   Úremove_size_configure_callbackrN   r7   Údestroyr}   re   rg   rh   r   ²   s    zCTkButton.destroyFc              	      sº  t ƒ  |¡ | jd k	r¦| j |  | j¡|  | j¡¡ | jj	d|  
| jd ¡d | jj	d|  
| jd ¡d | jj	d|  
| jd ¡d | jj	d|  
| jd	 ¡d n| j d
¡ | j |  | j¡|  | j¡|  | j¡|  | j¡¡}|dksò|r|| jj|  
| j¡d | jj	d|  
| j¡|  
| j¡d | jdkrZ| jj	d|  
| j¡|  
| j¡d n"| jj	d|  
| j¡|  
| j¡d | jd k	r¬| jdkr¬| jd krtj| |  | j¡| jddd| jd| _|  ¡  | j d| j¡ | j d| j¡ | j d| j¡ | j d| j¡ |dkrÐ| jj|  
| j¡d | j tj!krT| jj|  
| j"¡d n| jj|  
| j¡d |  
| j¡dkr”| jj|  
| j¡d n| jj|  
| j¡d n$| jd k	rÐ| j #¡  d | _|  ¡  | j$d k	r’| j%d krFtj| d| _%|  &¡  |  ¡  | j% d| j¡ | j% d| j¡ | j% d| j¡ | j% d| j¡ |dkr¶|  
| j¡dkrz| j%j|  
| j¡d n| j%j|  
| j¡d n$| j%d k	r¶| j% #¡  d | _%|  ¡  d S )NZbackground_corner_top_leftr   )ÚfillZbackground_corner_top_rightr   Zbackground_corner_bottom_rightr   Zbackground_corner_bottom_lefté   Zbackground_partsF©ÚbgZborder_parts©Úoutliner€   r   Úinner_partsÚ )r   r(   r'   ZpadxZpadyZborderwidthr)   rk   rl   rm   )Zfg)r   )'r7   rb   rF   r_   Zdraw_background_cornersrZ   Z_current_widthr=   r]   Ú
itemconfigÚ_apply_appearance_modeÚdeleteZdraw_rounded_rect_with_borderr:   r>   rw   Ú	_bg_colorrC   rA   rG   rH   ÚtkinterZLabelrx   rK   rI   rv   rn   ro   rp   rq   rD   rT   ÚDISABLEDrE   r   rP   rQ   rS   )rc   rt   Zrequires_recoloringre   rg   rh   rb   ·   s”    

ÿ


ý

þ

þ

þ
ú



zCTkButton._drawc                 C   sÞ  d\}}}}| j dkr^d| j kr(d\}}d| j kr:d\}}d| j krLd\}}d| j kr^d\}}|  t| jd	 | jƒ¡}|  t| j| jd	 | jƒ¡}| jd
||d | jd||d | jd
||d | jd||d | jdkrJ| jdd	d | j	dk	r| j
dk	r| jdd
|  | j¡d n| jdd
d | jdd
d | jdd	d nj| jdd	d | j	dk	rŠ| j
dk	rŠ| jdd
|  | j¡d n| jdd
d | jdd
d | jdd	d | jdkrþ| j	dk	rÞ| j	jdddd | j
dk	rÚ| j
jdd	dd nÜ| jdkrH| j	dk	r(| j	jdd	dd | j
dk	rÚ| j
jdddd n’| jdkr’| j	dk	rr| j	jd	ddd | j
dk	rÚ| j
jdddd nH| jdkrÚ| j	dk	r¼| j	jdddd | j
dk	rÚ| j
jd	ddd dS )z configure grid system (5x5) )éè  rŽ   rŽ   rŽ   r   Ún)r   rŽ   Ús)rŽ   r   ÚeÚwr   r   )ÚweightZminsizeé   )Úrightr   r   )r“   N)r   r   r•   r   )r4   r5   r6   r   ÚtopZbottom)rX   rZ   Úmaxr>   r?   r:   Zgrid_rowconfigureZgrid_columnconfigurerW   rQ   rH   r   r^   )rc   Zn_padding_weightZs_padding_weightZe_padding_weightZw_padding_weightZscaled_minsize_rowsZscaled_minsize_columnsrg   rg   rh   rv     sb    




zCTkButton._create_gridc                    sâ  d|kr |  d¡| _|  ¡  d}d|kr@|  d¡| _|  ¡  d}d|kr`|  d¡| _|  ¡  d}d|kr‚| j|  d¡dd| _d}d|kr |  |  d¡¡| _d}d|kr¾|  |  d¡¡| _d}d	|krÜ|  |  d	¡¡| _	d}d
|krú|  |  d
¡¡| _
d}d|kr|  d¡| _d}d|krL|  d¡| _| jd kr<d}n| jj| jd d|kr¨t| jtƒrr| j | j¡ |  |  d¡¡| _t| jtƒr | j | j¡ |  ¡  d|krÚ|  d¡| _| jd k	rÚ| jj| jd d|kr6t| jtƒr | j | j¡ |  |  d¡¡| _t| jtƒr.| j | j¡ |  ¡  d|krX|  d¡| _|  ¡  d}d|krn|  d¡| _d|krŒ|  d¡| _ |  ¡  d|kr¦|  d¡| _!d}d|krÈ|  d¡| _"|  ¡  d}t#ƒ jf d|i|—Ž d S )Nr   Tr   r   r   r0   r    r!   r"   r#   r$   r'   )r'   r(   r)   )r)   r*   r+   r,   r-   r.   r/   Úrequire_redraw)$Úpopr:   rv   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rw   rL   rK   r   r~   rN   rJ   rM   rI   rP   r   Zremove_configure_callbackrS   rO   rR   rT   ra   rU   rV   rW   rX   r7   )rc   r˜   rd   re   rg   rh   rw   `  sŒ    









zCTkButton.configure)Úattribute_nameÚreturnc                    s  |dkr| j S |dkr| jS |dkr*| jS |dkr8| jS |dkrF| jS |dkrT| jS |dkrb| jS |dkrp| jS |d	kr~| jS |d
krŒ| j	S |dkrš| j
S |dkr¨| jS |dkr¶| jS |dkrÄ| jS |dkrÒ| jS |dk râ| jS |dk rò| jS |dkr| jS tƒ  |¡S d S )Nr   r   r   r   r    r!   r"   r#   r$   r'   r(   r)   r*   r+   r,   r-   r.   r/   )r:   r>   r?   rA   rB   rC   rD   rE   rF   rG   rK   rI   rP   rT   rU   rV   rW   rX   r7   Úcget)rc   rš   re   rg   rh   rœ   ¼  sJ    


zCTkButton.cgetc                 C   s¬   | j r¨| jtjkrXtjdkr4| jd k	r4| jdd q¨tj d¡r¨| jd k	r¨| jdd nP| jtj	kr¨tjdkr†| jd k	r†| jdd n"tj d¡r¨| jd k	r¨| jdd d S )NÚdarwinZarrow)ÚcursorÚwinZpointinghandZhand2)
Z_cursor_manipulation_enabledrT   rŒ   r   ÚsysÚplatformrV   rw   Ú
startswithÚNORMALr}   rg   rg   rh   ra   æ  s    zCTkButton._set_cursorc                 C   sŠ   | j dkr†| jdkr†| jd kr&| j}n| j}| jjd|  |¡|  |¡d | jd k	rh| jj|  |¡d | j	d k	r†| j	j|  |¡d d S )NTr   r†   r„   r‚   )
rU   rT   rB   rA   r]   rˆ   r‰   rH   rw   rQ   ©rc   ÚeventZinner_parts_colorrg   rg   rh   ro   ô  s    
þ

zCTkButton._on_enterc                 C   s|   d| _ | jdkr| j}n| j}| jjd|  |¡|  |¡d | jd k	rZ| jj|  |¡d | jd k	rx| jj|  |¡d d S )NFr   r†   r„   r‚   )	rY   rA   r‹   r]   rˆ   r‰   rH   rw   rQ   r¤   rg   rg   rh   rp     s    
þ

zCTkButton._on_leavec                 C   s   | j r|  ¡  d S rz   )rY   ro   r}   rg   rg   rh   Ú_click_animation  s    zCTkButton._click_animationc                 C   s>   | j tjkr:|  ¡  d| _|  d| j¡ | jd k	r:|  ¡  d S )NTéd   )rT   rŒ   r   rp   rY   Úafterr¦   rV   )rc   r¥   rg   rg   rh   rq   !  s    
zCTkButton._clickedc                 C   s"   | j tjkr| jdk	r|  ¡ S dS )z2 calls command function if button is not disabled N)rT   rŒ   r   rV   r}   rg   rg   rh   Úinvoke,  s    
zCTkButton.invoke)rj   r-   Úaddc                 C   sf   |dks|dkst dƒ‚| jj||dd | jdk	rF| jj||dd | jdk	rb| jj||dd dS )z called on the tkinter.Canvas ú+TzE'add' argument can only be '+' or True to preserve internal callbacks)rª   N)Ú
ValueErrorr]   rn   rH   rQ   )rc   rj   r-   rª   rg   rg   rh   rn   2  s    

zCTkButton.bind)rj   Úfuncidc                 C   s^   |dk	rt dƒ‚| j |d¡ | jdk	r6| j |d¡ | jdk	rN| j |d¡ | j|d dS )z0 called on the tkinter.Label and tkinter.Canvas NzŽ'funcid' argument can only be None, because there is a bug in tkinter and its not clear whether the internal callbacks will be unbinded or notri   )r¬   r]   ÚunbindrH   rQ   r`   )rc   rj   r­   rg   rg   rh   r®   =  s    

zCTkButton.unbindc                 C   s
   | j  ¡ S rz   )rH   Úfocusr}   rg   rg   rh   r¯   K  s    zCTkButton.focusc                 C   s
   | j  ¡ S rz   )rH   Ú	focus_setr}   rg   rg   rh   r°   N  s    zCTkButton.focus_setc                 C   s
   | j  ¡ S rz   )rH   Úfocus_forcer}   rg   rg   rh   r±   Q  s    zCTkButton.focus_force)r   r   NNr   r   NNNNNNTTr   NNNr   TNr   r   )N)NN)F)F)N)N)N)NNT)NN),Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚintÚ__annotations__r   r   r   Ústrr   ÚboolÚtupler   rŒ   ÚVariabler   r   r8   r`   ru   r{   r|   rN   rS   r   rb   rv   rw   Úanyrœ   ra   ro   rp   r¦   rq   r©   rn   r®   r¯   r°   r±   Ú__classcell__rg   rg   re   rh   r      s’   
                       ååW
gB\*


r   )rŒ   r    Útypingr   r   r   r   r   Zcore_renderingr   r9   r	   r
   Zcore_widget_classesr   r(   r   r*   r   r   rg   rg   rg   rh   Ú<module>   s   