U
    lh                     @   s|   d dl mZmZ d dlZd dlZzd dl mZ W n  ek
rP   d dlmZ Y nX ddlm	Z	 ddl
mZ G dd	 d	ZdS )
    )UnionTupleN)Literal   )ScalingTracker   )CTkFontc                   @   s  e Zd ZdZd)ed dddZdd Zd	d
 ZedddZ	edddZ
eeef ee dddZeeef ee dddZeeef edddZeeef edddZeeef edddZeedddZeeed d!d"Zeed d#d$Zeed%d&d'Zd(S )*CTkScalingBaseClassaa  
    Super-class that manages the scaling values and callbacks.
    Works for widgets and windows, type must be set in init method with
    scaling_type attribute. Methods:

    - _set_scaling() abstractmethod, gets called when scaling changes, must be overridden
    - destroy() must be called when sub-class is destroyed
    - _apply_widget_scaling()
    - _reverse_widget_scaling()
    - _apply_window_scaling()
    - _reverse_window_scaling()
    - _apply_font_scaling()
    - _apply_argument_scaling()
    - _apply_geometry_scaling()
    - _reverse_geometry_scaling()
    - _parse_geometry_string()

    widget)r
   window)scaling_typec                 C   s\   || _ | j dkr,t| j|  t| | _n,| j dkrXt  t| j|  t| | _	d S Nr
   r   )
"_CTkScalingBaseClass__scaling_typer   Z
add_widget_set_scalingZget_widget_scaling$_CTkScalingBaseClass__widget_scalingZactivate_high_dpi_awarenessZ
add_windowZget_window_scaling$_CTkScalingBaseClass__window_scaling)selfr    r   \/tmp/pip-unpacked-wheel-ckatmccg/customtkinter/windows/widgets/scaling/scaling_base_class.py__init__    s    

zCTkScalingBaseClass.__init__c                 C   s6   | j dkrt| j|  n| j dkr2t| j|  d S r   )r   r   Zremove_widgetr   Zremove_windowr   r   r   r   destroy+   s    

zCTkScalingBaseClass.destroyc                 C   s   || _ || _dS )zE can be overridden, but super method must be called at the beginning N)r   r   )r   Znew_widget_scalingZnew_window_scalingr   r   r   r   1   s    z CTkScalingBaseClass._set_scaling)returnc                 C   s   | j S N)r   r   r   r   r   _get_widget_scaling6   s    z'CTkScalingBaseClass._get_widget_scalingc                 C   s   | j S r   )r   r   r   r   r   _get_window_scaling9   s    z'CTkScalingBaseClass._get_window_scaling)valuer   c                 C   s   | j dkst|| j S Nr
   r   AssertionErrorr   r   r   r   r   r   _apply_widget_scaling<   s    z)CTkScalingBaseClass._apply_widget_scalingc                 C   s   | j dkst|| j S r   r   r    r   r   r   _reverse_widget_scaling@   s    z+CTkScalingBaseClass._reverse_widget_scalingc                 C   s   | j dkstt|| j S Nr   r   r   intr   r    r   r   r   _apply_window_scalingD   s    z)CTkScalingBaseClass._apply_window_scaling)scaled_valuer   c                 C   s   | j dkstt|| j S r#   r$   )r   r'   r   r   r   _reverse_window_scalingH   s    z+CTkScalingBaseClass._reverse_window_scaling)fontr   c                 C   s   | j dkstt|tkrt|dkr*|S t|dkrV|d tt|d | j  fS dt|  krndkrn n*|d tt|d | j  |dd fS td| d	n0t	|t
r|| jS td
| dt| ddS )zv Takes CTkFont object and returns tuple font with scaled size, has to be called again for every change of font object r
   r   r   r         NzCan not scale font z). font needs to be tuple of len 1, 2 or 3zCan not scale font 'z
' of type z/. font needs to be tuple or instance of CTkFont)r   r   typetuplelenabsroundr   
ValueError
isinstancer   Zcreate_scaled_tuple)r   r)   r   r   r   _apply_font_scalingL   s     *
z'CTkScalingBaseClass._apply_font_scaling)kwargsr   c                    s   j dkstt|}d|krrt|d ttfrF |d |d< n,t|d trrt fdd|d D |d< d|krt|d ttfr |d |d< n,t|d trt fdd|d D |d< d|kr |d |d< d|kr |d |d< |S )	Nr
   Zpadyc                    s   g | ]}  |qS r   r!   .0vr   r   r   
<listcomp>i   s     z?CTkScalingBaseClass._apply_argument_scaling.<locals>.<listcomp>Zpadxc                    s   g | ]}  |qS r   r5   r6   r   r   r   r9   n   s     xy)r   r   copyr2   r%   floatr!   r-   )r   r4   Zscaled_kwargsr   r   r   _apply_argument_scaling_   s"    

z+CTkScalingBaseClass._apply_argument_scaling)geometry_stringr   c                 C   s   t d| }|dd k	r(t|dnd }|dd k	rHt|dnd }|dd k	rht|dnd }|dd k	rt|dnd }||||fS )NzC((\d+)x(\d+)){0,1}(\+{0,1}([+-]{0,1}\d+)\+{0,1}([+-]{0,1}\d+)){0,1}r   r*      r+   )researchgroupr%   )r?   resultwidthheightr:   r;   r   r   r   _parse_geometry_stringx   s        z*CTkScalingBaseClass._parse_geometry_stringc                 C   s   | j dkst| |\}}}}|d krR|d krRt|| j  dt|| j  S |d krr|d krrd| d| S t|| j  dt|| j  d| d| S d S Nr   r:   +r   r   rG   r0   r   )r   r?   rE   rF   r:   r;   r   r   r   _apply_geometry_scaling   s    "z+CTkScalingBaseClass._apply_geometry_scaling)scaled_geometry_stringr   c                 C   s   | j dkst| |\}}}}|d krR|d krRt|| j  dt|| j  S |d krr|d krrd| d| S t|| j  dt|| j  d| d| S d S rH   rJ   )r   rL   rE   rF   r:   r;   r   r   r   _reverse_geometry_scaling   s    "z-CTkScalingBaseClass._reverse_geometry_scalingN)r
   )__name__
__module____qualname____doc__r   r   r   r   r=   r   r   r   r%   r!   r"   r&   r(   r   r   r-   r3   dictr>   staticmethodstrrG   rK   rM   r   r   r   r   r	      s    r	   )typingr   r   r<   rA   r   ImportErrorZtyping_extensionsZscaling_trackerr   r)   r   r	   r   r   r   r   <module>   s   