U
    l±Ëh)"  ã                   @   s.   d dl Z d dlZd dlmZ G dd„ dƒZdS )é    N)ÚCallablec                   @   sø   e Zd ZdZi Zi ZdZdZdZdZ	dZ
eedœdd„ƒZeedœdd	„ƒZeed
œdd„ƒZeedœdd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZeedœdd„ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZeedœd!d"„ƒZed#d$„ ƒZd%S )&ÚScalingTrackerFé   éd   iÜ  )Úreturnc                 C   s   |   |¡}| j| | j S ©N)Úget_window_root_of_widgetÚwindow_dpi_scaling_dictÚwidget_scaling)ÚclsÚwidgetÚwindow_root© r   úY/tmp/pip-unpacked-wheel-ckatmccg/customtkinter/windows/widgets/scaling/scaling_tracker.pyÚget_widget_scaling   s    
z!ScalingTracker.get_widget_scalingc                 C   s   |   |¡}| j| | j S r   )r   r	   Úwindow_scaling)r   Úwindowr   r   r   r   Úget_window_scaling   s    
z!ScalingTracker.get_window_scaling)Úwidget_scaling_factorc                 C   s   t |dƒ| _|  ¡  d S ©Ngš™™™™™Ù?)Úmaxr
   Úupdate_scaling_callbacks_all)r   r   r   r   r   Úset_widget_scaling   s    z!ScalingTracker.set_widget_scaling)Úwindow_scaling_factorc                 C   s   t |dƒ| _|  ¡  d S r   )r   r   r   )r   r   r   r   r   Úset_window_scaling"   s    z!ScalingTracker.set_window_scalingc                 C   s0   |}t |tjƒdkr,t |tjƒdkr,|j}q|S )NF)Ú
isinstanceÚtkinterZTkZToplevelZmaster)r   r   Zcurrent_widgetr   r   r   r   '   s    ÿz(ScalingTracker.get_window_root_of_widgetc                 C   sZ   | j  ¡ D ]J\}}|D ]<}| jsD|| j| | j | j| | j ƒ q|| j| jƒ qq
d S r   )Úwindow_widgets_dictÚitemsÚ"deactivate_automatic_dpi_awarenessr	   r
   r   )r   r   Zcallback_listÚset_scaling_callbackr   r   r   r   1   s    ÿÿz+ScalingTracker.update_scaling_callbacks_allc                 C   sL   | j | D ]<}| js8|| j| | j | j| | j ƒ q
|| j| jƒ q
d S r   )r   r   r	   r
   r   )r   r   r    r   r   r   Ú#update_scaling_callbacks_for_window<   s    ÿÿz2ScalingTracker.update_scaling_callbacks_for_window)Úwidget_callbackc                 C   sj   |   |¡}|| jkr"|g| j|< n| j|  |¡ || jkrL|  |¡| j|< | jsf| d| j¡ d| _d S )Nr   T)r   r   Úappendr	   Úget_window_dpi_scalingÚupdate_loop_runningÚafterÚcheck_dpi_scaling©r   r"   r   r   r   r   r   Ú
add_widgetF   s    


zScalingTracker.add_widgetc                 C   s0   |   |¡}z| j|  |¡ W n   Y nX d S r   )r   r   Úremover(   r   r   r   Úremove_widgetV   s
    
zScalingTracker.remove_widgetc                 C   s   z| j |= W n   Y nX d S r   )r   ©r   Zwindow_callbackr   r   r   r   Úremove_window^   s    zScalingTracker.remove_windowc                 C   sF   || j kr|g| j |< n| j |  |¡ || jkrB|  |¡| j|< d S r   )r   r#   r	   r$   r,   r   r   r   Ú
add_windowe   s
    

zScalingTracker.add_windowc                 C   s:   | j s6tjdkrn$tj d¡r6ddl}|jj d¡ n dS )zŠ make process DPI aware, customtkinter elements will get scaled automatically,
            only gets activated when CTk object is created ÚdarwinÚwinr   Né   )r   ÚsysÚplatformÚ
startswithÚctypesÚwindllÚshcoreZSetProcessDpiAwareness)r   r5   r   r   r   Úactivate_high_dpi_awarenesso   s    
z*ScalingTracker.activate_high_dpi_awarenessc                 C   s¬   | j s¤tjdkrdS tj d¡ržddlm}m}m} d}d}| | 	¡ ¡}|j
 || d¡¡}| ¡ | ¡  }	}
|j ||||	ƒ||
ƒ¡ |	j|
j d|  S dS ndS d S )Nr/   r   r0   r   )r6   ÚpointerÚwintypesé`   r1   )r   r2   r3   r4   r5   r6   r9   r:   ZHWNDZwinfo_idZuser32ZMonitorFromWindowZDWORDZUINTr7   ZGetDpiForMonitorÚvalue)r   r   r6   r9   r:   ZDPI100pcZDPI_typeZwindow_hwndZmonitor_handleZx_dpiZy_dpir   r   r   r$   –   s    
z%ScalingTracker.get_window_dpi_scalingc              	   C   sö   d}| j D ]ˆ}| ¡ r
| ¡ dks
|  |¡}|| j| kr
|| j|< tj d¡r\| dd¡ | 	¡  |  
|¡ | ¡  tj d¡rŽ| dd¡ d}q
| j  ¡ D ]L}z.|rº| | j| j¡ n| | j| j¡ W  d S  tk
rè   Y qžY qžX qžd| _d S )NFZiconicr0   z-alphag333333Ã?r   T)r   Zwinfo_existsÚstater$   r	   r2   r3   r4   Ú
attributesZblock_update_dimensions_eventr!   Zunblock_update_dimensions_eventÚkeysr&   Úloop_pause_after_new_scalingr'   Úupdate_loop_intervalÚ	Exceptionr%   )r   Znew_scaling_detectedr   Zcurrent_dpi_scaling_valueZappr   r   r   r'   ¬   s.    



z ScalingTracker.check_dpi_scalingN)Ú__name__Ú
__module__Ú__qualname__r   r   r	   r
   r   r%   rA   r@   ÚclassmethodÚfloatr   r   r   r   r   r   r!   r   r)   r+   r-   r.   r8   r$   r'   r   r   r   r   r      sH   
	


	


	
&r   )r   r2   Útypingr   r   r   r   r   r   Ú<module>   s   