
    kjC'                         d dl 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e          Z G d	 d
e          ZdS )    N)Path)Any)OpenGLFrame)
BaseWindow)Keysc                   &    e Zd ZdZeZddddZdef fdZde	d	d
fdZ
de	d	d
fdZed	eeef         fd            Zej        deeef         d	d
fd            Zed	eeef         fd            Zej        deeef         d	d
fd            Zed	e	fd            Zej        de	d	d
fd            Zed	e	fd            Zej        de	d	d
fd            Zed	efd            Zej        ded	d
fd            Zd(dZded	d
fdZdej        d	d
fdZdej        d	d
fdZdej        d	d
fdZdej        d	d
fdZdej        d	d
fdZdej        d	d
fd Z dej        d!e	d	d
fd"Z!dej        d	d
fd#Z"d(d$Z#dej        d	d
fd%Z$dej        d	d
fd&Z%d(d'Z& xZ'S ))Windowtk         )r   r   r   kwargsc                     t                      j        di | t          j                    | _        t          | j        | j        | j                  | _        | j        	                    t          j
        t          j                   | j                            | j        | j                   | j        r| j                            dd           | j        | _        | j                            d| j                   | j                            d| j                   | j                            d| j                   | j                            d| j                   | j                            d	| j                   | j                            d
| j                   | j                            d| j                   | j                            d| j                   | j                            d| j                   | j                            d| j                   | j        | _        | j                                          | j        !                                 | "                                 | #                                 d S )N)widthheight)fillexpand-fullscreenTz<Configure>z
<KeyPress>z<KeyRelease>z<Motion>z<Button>z<ButtonRelease>z<MouseWheel>z<Map>z<Unmap>WM_DELETE_WINDOW )$super__init__tkinterTk_tkModernglTkWindowr   r   
_gl_widgetpackBOTHYES	resizable
_resizable_fullscreen
attributes_cursorcursorbind	tk_resizetk_key_presstk_key_releasetk_mouse_motiontk_mouse_button_presstk_mouse_button_releasetk_mouse_wheeltk_maptk_unmapprotocoltk_close_window_titletitleupdatetkMakeCurrentinit_mgl_contextset_default_viewport)selfr   	__class__s     \/home/agentuser/manim-venv/lib/python3.11/site-packages/moderngl_window/context/tk/window.pyr   zWindow.__init__   s
   ""6""":<<*484:dkZZZ',w{CCC4?DO<<< 	5Ht444l 	]DN;;;lD$5666nd&9:::j$"6777j$"<===')EFFFnd&9:::gt{+++i///,d.BCCC[
 	%%'''!!#####    valuereturnNc                 <    | j                             d|           d S )Nr   )r   r$   r9   r=   s     r;   _set_fullscreenzWindow._set_fullscreen:   s     M511111r<   c                     d S Nr   r@   s     r;   
_set_vsynczWindow._set_vsync=       r<   c                     | j         | j        fS )ztuple[int, int]: current window size.

        This property also support assignment::

            # Resize the window to 1000 x 1000
            window.size = 1000, 1000
        )_width_heightr9   s    r;   sizezWindow.sizeA   s     {DL((r<   c                 z    | j                             d                    |d         |d                              d S )Nz{}x{}r   r   r   geometryformatr@   s     r;   rJ   zWindow.sizeL   s4    '..q58<<=====r<   c                     | j                                                             d          \  }}}t          |          t          |          fS )ztuple[int, int]: The current window position.

        This property can also be set to move the window::

            # Move window to 100, 100
            window.position = 100, 100
        +)r   rM   splitint)r9   _xys       r;   positionzWindow.positionP   sA     (##%%++C001a1vvs1vv~r<   c                 z    | j                             d                    |d         |d                              d S )Nz+{}+{}r   r   rL   r@   s     r;   rV   zWindow.position\   s4    (//%(E!H==>>>>>r<   c                     | j         S )zbool: Is the window visible?

        This property can also be set::

            # Hide or show the window
            window.visible = False
        )_visiblerI   s    r;   visiblezWindow.visible`   s     }r<   c                     || _         |r| j                                         d S | j                                         d S rC   )rY   r   	deiconifywithdrawr@   s     r;   rZ   zWindow.visiblek   sE     	 H     Hr<   c                     | j         S )zbool: Should the mouse cursor be visible inside the window?

        This property can also be assigned to::

            # Disable cursor
            window.cursor = False
        )r%   rI   s    r;   r&   zWindow.cursors   s     |r<   c                     |du r| j                             d           n| j                             d           || _        d S )NTarrow)r&   none)r   configr%   r@   s     r;   r&   zWindow.cursor~   sE    D==HOO7O++++HOO6O***r<   c                     | j         S )zlstr: Window title.

        This property can also be set::

            window.title = "New Title"
        )r3   rI   s    r;   r4   zWindow.title   s     {r<   c                 H    | j                             |           || _        d S rC   )r   r4   r3   r@   s     r;   r4   zWindow.title   s!    ur<   c                     | j         j        }|dk    rt          |           | j                                         | j                                         | j                                         | xj        dz  c_        dS )zFSwap buffers, set viewport, trigger events and increment frame counterGL_NO_ERRORr   N)	_ctxerrorprintr   update_idletasksr5   r   tkSwapBuffers_frames)r9   errs     r;   swap_bufferszWindow.swap_buffers   sq    io-#JJJ 	!!###%%'''r<   	icon_pathc                 b    | j                             dt          j        |                     d S )NF)file)r   	iconphotor   
PhotoImage)r9   ro   s     r;   	_set_iconzWindow._set_icon   s.    5'"4)"D"D"DEEEEEr<   eventc                 p   |                      |j        | j        j        | j                   |                     |d           |j        r|                     |j                   | j        $|j        | j        k    r| 	                                 | j
        |j        | j
        k    r| j         | _        dS dS dS )zTHandle all queued key press events in tkinter dispatching events to standard methodsTN)_key_event_funckeysymkeysACTION_PRESS
_modifiers_handle_modifierschar_unicode_char_entered_func	_exit_keyclose_fs_key
fullscreenr9   ru   s     r;   r)   zWindow.tk_key_press   s    U\49+A4?SSSud+++: 	8++EJ777>%%,$.*H*HJJLLL<#(D(D"&/1DOOO $#(D(Dr<   c                     |                      |d           |                     |j        | j        j        | j                   dS )zHandle all queued key release events in tkinter dispatching events to standard methods

        Args:
            event (tkinter.Event): The key release event
        FN)r|   rw   rx   ry   ACTION_RELEASEr{   r   s     r;   r*   zWindow.tk_key_release   sA     	ue,,,U\49+CT_UUUUUr<   c                     |j         |j        }}|                     ||          \  }}| j        j        r|                     ||||           dS |                     ||||           dS )zHandle and translate tkinter mouse position events

        Args:
            event (tkinter.Event): The mouse motion event
        N)rT   rU   _calc_mouse_delta_mouse_buttonsany_mouse_drag_event_func_mouse_position_event_func)r9   ru   rT   rU   dxdys         r;   r+   zWindow.tk_mouse_motion   sx     w1''1--B" 	:''1b"55555++Aq"b99999r<   c                     |                      |d           | j                            |j                  }|sdS |                     |d           |                     |j        |j        |           dS )zzHandle tkinter mouse press events.

        Args:
            event (tkinter.Event): The mouse button press event
        TN)r|   _mouse_button_mapgetnum!_handle_mouse_button_state_change_mouse_press_event_funcrT   rU   r9   ru   buttons      r;   r,   zWindow.tk_mouse_button_press   sw     	ud+++'++EI66 	F..vt<<<$$UWegv>>>>>r<   c                     |                      |d           | j                            |j                  }|sdS |                     |d           |                     |j        |j        |           dS )z|Handle tkinter mouse press events.

        Args:
            event (tkinter.Event): The mouse button release event
        TNF)r|   r   r   r   r   _mouse_release_event_funcrT   rU   r   s      r;   r-   zWindow.tk_mouse_button_release   sw     	ud+++'++EI66 	F..vu===&&uw@@@@@r<   c                 n    |                      |d           |                     d|j        dz             dS )zjHandle mouse wheel event.

        Args:
            event (tkinter.Event): The mouse wheel event
        Tr   g      ^@N)r|   _mouse_scroll_event_funcdeltar   s     r;   r.   zWindow.tk_mouse_wheel   s=     	ud+++%%au)<=====r<   pressc                     |j         dv r|| j        _        dS |j         dv r|| j        _        dS |j         dv r|| j        _        dS dS )zUpdate internal key modifiers

        Args:
            event (tkinter.Event): The key event
            press (bool): Press or release event
        )Shift_LShift_R)	Control_L	Control_R)Alt_LAlt_RN)rx   r{   shiftctrlalt)r9   ru   r   s      r;   r|   zWindow._handle_modifiers   sf     <111$)DO!!!\777#(DO   \///"'DO 0/r<   c                     |j         |j        c| _        | _        |j         |j        c| _        | _        | j        sdS |                                  |                     |j         |j                   dS )ztkinter specific window resize event.
        Forwards resize events to the configured resize function.

        Args:
            event (tkinter.Event): The resize event
        N)	r   r   rG   rH   _buffer_width_buffer_heightrg   r8   _resize_funcr   s     r;   r(   zWindow.tk_resize   sq     %*K!T\27+u|/D/ y 	F!!###%+u|44444r<   c                 <    |                                   d| _        dS )ztkinter close window callbackTN)_close_func_closerI   s    r;   r2   zWindow.tk_close_window  s    r<   c                 >    d| _         |                     d           d S )NTFrY   _iconify_funcr   s     r;   r/   zWindow.tk_map  s#    5!!!!!r<   c                 >    d| _         |                     d           d S )NFTr   r   s     r;   r0   zWindow.tk_unmap  s#    4     r<   c                 8    | j                                          dS )z!Destroy logic for tkinter window.N)r   destroyrI   s    r;   r   zWindow.destroy  s    r<   r>   N)(__name__
__module____qualname__namer   ry   r   r   r   boolrA   rD   propertytuplerR   rJ   setterrV   rZ   r&   strr4   rn   r   rt   r   Eventr)   r*   r+   r,   r-   r.   r|   r(   r2   r/   r0   r   __classcell__r:   s   @r;   r	   r	      s]       DD  !$ !$ !$ !$ !$ !$ !$F2T 2d 2 2 2 2      )eCHo ) ) ) X) 
[>%S/ >d > > > [> 	%S/ 	 	 	 X	 _?eCHo ?$ ? ? ? _?     X ^ T  d       ^      X ]D T    ] s    X \3 4    \   F4 FD F F F F2'- 2D 2 2 2 2VGM Vd V V V V:W] :t : : : :?7= ?T ? ? ? ?AW] At A A A A>GM >d > > > >(w} (T (d ( ( ( (5w} 5 5 5 5 5&   
"GM "d " " " "!gm ! ! ! ! !       r<   r	   c                   p     e Zd Zdedef fdZddZddZdej        ddfd	Z	dej        ddf fd
Z
 xZS )r   argsr   c                 :     t                      j        |i | d S rC   )r   r   )r9   r   r   r:   s      r;   r   zModernglTkWindow.__init__$  s%    $)&)))))r<   r>   Nc                     dS )zpyopengltk's own render method.Nr   rI   s    r;   redrawzModernglTkWindow.redraw'  rE   r<   c                     dS )z*pyopengltk's user code for initialization.Nr   rI   s    r;   initglzModernglTkWindow.initgl+  rE   r<   ru   c                      t          d          )z)Should never be called. Event overridden.z9tkResize should never be called. The event is overridden.)
ValueErrorr   s     r;   tkResizezModernglTkWindow.tkResize/  s    TUUUr<   c                 p    t          | dd          s#t                                          |           dS dS )z&Called when frame goes onto the screen_widN)getattrr   tkMap)r9   ru   r:   s     r;   r   zModernglTkWindow.tkMap3  s?    
 tVT** 	!GGMM%     	! 	!r<   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r;   r   r   #  s        *c *S * * * * * *      Vgm V V V V V!7= !T ! ! ! ! ! ! ! ! ! !r<   r   )r   pathlibr   typingr   
pyopengltkr   moderngl_window.context.baser   moderngl_window.context.tk.keysr   r	   r   r   r<   r;   <module>r      s                 " " " " " " 3 3 3 3 3 3 0 0 0 0 0 0U U U U UZ U U Up! ! ! ! !{ ! ! ! ! !r<   