a
    V$c~U                     @   s  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlZd dlZd dlZi Zd7ddZd8ddZd9d	d
ZG dd deZdadae a e a!da"da#da$da%da&da'da(dd Z)dd Z*dd Z+d:ddZ,dd Z-dd Z.g a/dd Z0dd Z1i Z2d a3d Z4dd  Z5d!d" Z6d;d#d$Z7d%d& Z8d<d'd(Z9d)d* Z:d+d, Z;d-d. Z<d/d0 Z=d1d2 Z>d3d4 Z?d5d6 Z@dS )=    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicodeNdefaultc                 C   s8   t  }|d du rd}|dur(|t| < nt| d dS )a  
    :doc: other

    If a displayable is currently focused, captured the rectangular bounding
    box of that displayable, and stores it with `name`. If not, removes any
    focus stored with `name`.

    Captured focuses are not saved when the game is saveed.

    `name`
        Should be a string. The name "tooltip" is special, as it's
        automatically captured when a displayable with a tooltip gains focus.
    r   N)focus_coordinatesfocus_storagepop)namerect r   renpy/display\focus.pycapture_focus%   s    
r   c                 C   s   t | d dS )z@
    :doc: other

    Clear the captured focus with `name`.
    N)r   r   r   r   r   r   clear_capture_focus?   s    r   c                 C   s   t | dS )zb
    :undocumented:

    Returns the captured focus. Used in the implementation of FocusRect.
    N)r   getr   r   r   r   get_focus_rectI   s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Focusc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S Nwidgetargxywhscreen)selfr#   r$   r%   r&   r'   r(   r)   r   r   r   __init__U   s    zFocus.__init__c                 C   s"   t | j| j| j| j| j| j| jS r!   )r    r#   r$   r%   r&   r'   r(   r)   r*   r   r   r   copy_   s    z
Focus.copyc                 C   s$   d| j | j| j| j| j| j| jf S )Nz"<Focus: %r %r (%r, %r, %r, %r) %r>r"   r,   r   r   r   __repr__i   s    zFocus.__repr__c                 C   s   |\}}}}|| }|| }| j du r*dS || j   kr@|k rn n^|| j  krZ|k rn nD|| j | j   krz|k rn n$|| j| j   kr|k rn ndS dS )zf
        Returns true if this focus is entirely contained inside the given
        rectangle.
        NFT)r%   r&   r'   r(   )r*   r   minxminyr'   r(   maxxmaxyr   r   r   insides   s    
tzFocus.insideN)__name__
__module____qualname__r+   r-   r.   r3   r   r   r   r   r    S   s   


r    mousec                 C   s   |a |a|d ur"|jd |jhant a| tj j	_
tjj|  | d u rRd }n|  }t|kr|atd tj  td urtatad S )Nr   tooltip)argumentscreen_of_focusedscreen_nametagscreen_of_focused_namessetrenpygamecontextscene_listsfocuseddisplayttsdisplayable_get_tooltipr8   r   exportsrestart_interactionlast_tooltipscreen_of_last_focused_names)r#   r$   r)   new_tooltipr   r   r   set_focused   s"    
rM   c                   C   s   t j jjS )z1
    Gets the currently focused displayable.
    )r?   r@   rA   rB   rC   r   r   r   r   get_focused   s    rN   c                  C   s   t  } | du rdS | jjS dS )zK
    Gets the mouse associated with the currently focused displayable.
    N)rN   styler7   )rC   r   r   r   	get_mouse   s    rP   Fc                 C   s6   | du r|rt S tS |r&| tv r2t S n| tv r2tS dS )z'
    Gets the tooltip information.
    N)rJ   r8   rK   r=   )r)   lastr   r   r   get_tooltip   s    rR   c                 C   s   | a tj  d S r!   )grabr?   rH   cancel_gesture)r#   r   r   r   set_grab   s    rU   c                   C   s   t S r!   )rS   r   r   r   r   get_grab  s    rV   c                  C   sh   g a tjjt  d ad} t D ] }|jd u r0|a|jtu rd} q| sHd atd urdt	 d u rdt
td d S )NFT)
focus_listr?   rD   rendertake_focusesglobal_focusr%   r#   rS   rN   change_focus)
grab_foundfr   r   r   rY     s    

rY   c                  C   s@   t  } tD ]0}|j| kr
|jtkr
|j|j|j|jf  S q
dS )z
    :doc: other

    This attempts to find the coordinates of the currently-focused
    displayable. If it can, it will return them as a (x, y, w, h)
    tuple. If not, it will return a (None, None, None, None) tuple.
    )NNNN)	rN   rW   r#   r$   r9   r%   r&   r'   r(   )currentir   r   r   r   (  s
    	r   c                   C   s   t d7 a d S )N   )modal_generationr   r   r   r   
mark_modalE  s    rb   c              	      st  da g   fdd}| D ].}z||d W q tjjjyD   Y q0 qi }g } D ]R}|\}}}}	||d}
|
d ||< |du rqT||
f|_|tt	|< |
| qT| g } D ].\}}}}	|	t krq|jr|
|j||f q|rt|dkr
|jtdd |d \}}}nd}d}d}tjjjdu pPtjjjjtjtjtjfv}d}tdd t }tt	||}|}tt	tdatdurtjjtd	d
i}|dur||urts|}d
}da|r|tkr|}t|d| |durF|j} D ]>\}}}}	|	t krq|j|kr|}t|t|  qFqd}tdurTt}|r|dkr|du rtjjj s|tkr|}t|d| |du rtddd  D ]v\}}}}||urtjj!"| z@||u rtj#j$r|j%dd n|j%| d W tjj!&  ntjj!&  0 q|rhtjj!"t' z|j(| d W tjj!&  ntjj!&  0 t)  dS )z\
    Called before each interaction to choose the focused and grabbed
    displayables.
    r   c                    s     | |tjjjtf d S r!   )appendr?   rD   r)   _current_screenra   )r]   nfwnr   r   callbackX  s    z!before_interact.<locals>.callbackNr`   )keyFbaseTr   )*ra   find_focusabler?   rD   layoutIgnoreLayersr   full_focus_namereplaced_byidrc   r   lensortoperator
itemgetter	interface
last_eventtypepygameMOUSEBUTTONDOWNMOUSEBUTTONUPMOUSEMOTIONr   rN   rS   overriderH   get_displayableold_max_defaultrM   r9   start_interactr)   push_current_screenconfigalways_unfocusunfocuspop_current_screenr:   focusclear)rootsrh   root	namecountfwn2	fwn_tupler]   re   r)   genserialdefaultsmax_defaultmax_default_focusmax_default_screenshould_max_defaultexplicitr^   old_currentdcurrent_namemodalr   rf   r   before_interactI  s    

,






 r   c                 C   s   d}t rdS | du rd}n| j}t }||u rD| du s@| jtkrD|S ta|durz*tjj	
t |j|d W tjj	  ntjj	  0 |}| durt|| j| j	 ntddd |durz*tjj	
t |j|d}W tjj	  ntjj	  0 |S )z>
    Change the focus to the displayable in ``newfocus``.
    Nrl   )rS   r#   rN   r$   r9   pending_focus_type
focus_typer?   rD   r)   r   r:   r   r   rM   r   )newfocusr   rvr#   r^   r   r   r   r[     s2    r[   c                   C   s   t d dS )z=
    Clears the focus when the window loses mouse focus.
    N)r[   r   r   r   r   clear_focus  s    r   c                 C   sx   t rdS | dur.| jtjtjtjfvr*dS daztjj	
||}W n tjjjy^   d}Y n0 |du rlt}t||dS )z
    Handle mouse events, to see if they change the focus.

    `ev`
        If ev is not None, this function checks to see if it is a mouse event.
    Nr7   rl   )rS   ry   rz   r}   r|   r{   r   r?   rD   rX   focus_at_pointrn   ro   rZ   r[   )evr%   r&   r   	new_focusr   r   r   mouse_handler!  s    

r   c                 C   sr   d }d}t D ]T}|jjjsq|jd u r(q|j|  |j|  |j|  |j|  }||kr|}|}q|rnt|S d S )Nl     )	rW   r#   rO   keyboard_focusr%   r&   r'   r(   r[   )xmulymulwmulhmul	max_focus	max_scorer]   scorer   r   r   focus_extremeC  s&    

r   c                 C   s    | | | d || | d  S )N   r   )x0y0x1y1xfudgeyfudger   r   r   points_dist_  s    r   c                 C   s   ||   kr|  kr|ksn | |  kr>|  kr>|ksn | |  kr^|  kr^|ksn ||   kr~|  kr~|krn n|| d S | |  kr|  kr|krn nt ||||tjjdS t | |||tjjdS d S Nr   g      ?r   r?   r   focus_crossrange_penaltyax0ay0ax1ay1bx0by0bx1by1r   r   r   horiz_line_disth  s.     
"r   c                 C   s   ||  kr|  kr|ksn ||  kr>|  kr>|ksn ||  kr^|  kr^|ksn ||  kr~|  kr~|krn n| | d S ||  kr|  kr|krn nt ||||dtjjS t | |||dtjjS d S r   r   r   r   r   r   verti_line_dist|  s.     
"r   c              
   C   s  da tsd S t }|s<tD ]}|jjjs*qt|  d S d S tD ] }|j|u r@|jtkr@|} qrq@ttd  d S |j	d u rt
|
||| d S |j	|j|   }|j|j|  }|j	|j|  }|j|j|  }d }d }dtjj d }tD ]}||u rq|jjjsq|j	d u r|}q|	||s&q|j	|j|  }|j|j|  }|j	|j|  }|j|j|  }|||||||||}||k r|}|}q|p|}|rt|S d S )Nkeyboardr   g      @r   )r   rW   rN   r#   rO   r   r[   r$   r9   r%   r   r'   r&   r(   r?   r   r   )from_x0from_y0from_x1from_y1to_x0to_y0to_x1to_y1	line_dist	conditionr   r   r   r   r^   r]   
from_focusfx0fy0fx1fy1	placelessr   new_focus_disttx0ty0tx1ty1distr   r   r   focus_nearest  sd    



r   c           	      C   s   da d }g }d}t }d }tD ]L}|jd u r2|}q|jd ur>q|jjjsJq|j|u rX|}|| |d7 }qd }|d u r|r| dkr|| d  }q||  }n,||  }d|  krt	|k rn n|| }|p|}t
|S )Nr   r   r`   )r   rN   rW   r%   r$   r#   rO   r   rc   rs   r[   )	deltar   
candidatesindexr^   current_indexr]   r   	new_indexr   r   r   focus_ordered  s:    






r   c                 C   s  t jjj}t jjjrN|| ds(|| dr0tdS || dsD|| drLtdS n|| dr~tddddddddt	d	d
 ddddS || drtddddddddt	dd
 ddddS || drtddddddddt
dd
 ddddS || drtddddddddt
dd
 ddddS d S )Nfocus_right
focus_downr`   
focus_leftfocus_uprj   g?g?c                 S   s   | j | j |j kS r!   r%   r'   oldnewr   r   r   <lambda>7      zkey_handler.<locals>.<lambda>r   c                 S   s   |j |j | j kS r!   r   r   r   r   r   r   >  r   c                 S   s   |j |j | j kS r!   r&   r(   r   r   r   r   r   E  r   c                 S   s   | j | j |j kS r!   r   r   r   r   r   r   L  r   )r?   rD   behavior	map_eventr@   preferencesself_voicingr   r   r   r   )r   r   r   r   r   key_handler&  sD    









r   )r   )r   )r   )NF)F)F)A
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   ru   pygame_sdl2rz   r?   r   r   r   r   objectr    r9   r:   r>   r=   rK   rS   rZ   r   r   r8   rJ   r~   rM   rN   rP   rR   rU   rV   rW   rY   r   rq   ra   r   rb   r   r[   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sZ   8




5%
 
0

"	Z2