a
    V$cW                     @   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dd ZG dd dejjjZeejj_G dd	 d	eZdS )
    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicodeNc                 C   s   | S )zj
    An edgescroll function that causes the move speed to be proportional
    from the edge distance.
     )nr   r   renpy/display\viewport.pyedgescroll_proportional#   s    r   c                       sp   e Zd ZdZdZdZdd Zd fd	d
	Zdd Zdd Z	dd Z
dddZ fddZdd Zdd Z  ZS )Viewport   Fc                 C   s   |dk rJt jjdd| _t jjdd| _d| _d| _d| _d| _	d| _
|dk rXd | _|dk rd| _d| _d | _d| _d| _d | _|dk r| j| _d S )N   r   F      r   )renpydisplaybehavior
Adjustmentxadjustmentyadjustmentset_adjustments
mousewheel	draggablewidthheightdrag_position	edge_size
edge_speededge_functionedge_xspeededge_yspeededge_last_st	focusable)selfversionr   r   r   after_upgrade2   s&    zViewport.after_upgradeNNNTviewportc                    s  t t| jf d|
i| |d ur,| | |d u rHtjjdd| _n|| _|d u rjtjjdd| _	n|| _	| jj
d u rd| j_
| j	j
d u rd| j	_
|| _|d d ur|d n|| _|d d ur|d n|| _t|tr0|jr0|jj| j_|jj| j_|j	j| j	_|j	j| j	_|j| _|j| _|j| _nd | _|\| _| _|| _|| _|| _|| _|pb|| _d| _d| _d| _d| _d | _|	d ur|	d | _|	d | _ t!|	dkr|	d | _"nt#| _"nd| _d| _ t#| _"d S )Nstyler   r   Tr   r   )$superr   __init__addr   r   r   r   r    r!   
adjustabler"   xoffsetyoffset
isinstanceoffsetsr   valuer'   child_widthchild_heightr#   r$   	arrowkeyspagekeysr.   r%   r&   r+   r,   r-   r(   r)   lenr*   r   )r/   child
child_sizer<   r    r!   r"   r#   r$   
edgescrollr4   xinitialyinitialreplacesr@   rA   
properties	__class__r   r   r6   J   sZ    




zViewport.__init__c                 C   s   | j |  | j|  d S )N)r    registerr!   )r/   r   r   r   per_interact   s    zViewport.per_interactc                 C   s0  t t|}t t|}| j}| j}tjj| j	||\}}| j	j
sRt||}| j	jsdt||}t||}t||}tjjjs| jrt|| d}| jj|ks| jj|kr|| j_|| j_| j  t|| d}	| jj|	ks| jj|kr|	| j_|| j_| j  | jdurLt| jt r0| j}
nt|| d| j }
|
| j_| jdurt| jt rn| j}
nt|| d| j }
|
| j_| jr| jdur| js| jrt|| j d}| j| jj|| j   | j| jj|| j   | | t | jj }t | jj }|| _|| _||||fS )a>  
        This is called by render once we know the width (`cw`) and height (`ch`)
        of all the children. It returns a pair of offsets that should be applied
        to all children.

        It also requires `st`, since hit handles edge scrolling.

        The returned offsets will be negative or zero.
        r   N) intmathceilr%   r&   r   r   layout
xyminimumsr4   xfillminyfillmaxrendersizingr"   r    r   pageupdater!   r9   r;   r=   r:   r(   r-   r+   r,   changecheck_edge_redraw)r/   cwchstr%   r&   xminimumyminimumxarangeyaranger=   durationcxocyor   r   r   update_offsets   sT    





$
zViewport.update_offsetsc                 C   s   || _ || _| jp|}| jp|}tjj| j||||}| \}}	| 	||	|\}
}}}|
|fg| _
tjj||}|||
|f |jdd||fdd}| js| jr|| d dd|| |S )Nr   Tfocus)r%   r&   r>   r?   r   r   rW   rC   get_sizerg   r<   Renderblit
subsurfacer$   r@   	add_focus)r/   r%   r&   r_   atr>   r?   surfr]   r^   re   rf   rvr   r   r   rW      s    

zViewport.renderc                 C   s   d}| j dkr"| jj| jjk r"d}| j dk r<| jjdkr<d}| jdkrZ| jj| jjk rZd}| jdk rt| jjdkrtd}|rtjj	| d |s| j
d u r|| _
nd | _
d S )NFr   T)r+   r    r=   r   r,   r!   r   r   rW   redrawr-   )r/   r_   reset_strr   r   r   r   r\     s    zViewport.check_edge_redrawc                    s  d | _ d | _tt| ||||}|d ur.|S | jrDtjj	 | krD| j
j}| jj}tjj|drtjjd  | j
j|dd}| j
| | jj|dd}	| j|	 tjj | j\}
}||
 }|| }| j
j|| dd}||kr|
}n| j
| |}| jj|| dd}||kr*|}n| j| |}||f| _d|  kr^| jk r~n nd|  kr|| jksn d| _d| _d | _d}nd}|r| jr| jdkr| j
}d}n:| jdkr| j}d}n"| jdkr| j
}d}n
| j}d}tjj|d	rN|r"|jdkr"d S ||j|j }|d urB|S tjj tjj|d
r|rx|j|jkrxd S ||j|j }|d ur|S tjj | jrtjj|dr| j
jdkrd S | j
| j
j| j
j }|d ur|S tjj tjj|dr\| j
j| j
jkr*d S | j
| j
j| j
j }|d urP|S tjj tjj|dr| jjdkrd S | j| jj| jj }|d ur|S tjj tjj|dr| jj| jjkrd S | j| jj| jj }|d ur |S tjj | jrtjj|drX| j| jj| jj }|d urL|S tjj tjj|dr| j| jj| jj }|d ur|S tjj |r | jr tjj|dr tjj  }|d u s|| u r ||f| _tjj|  tjj |r| j!r|j"t#j$t#j%t#j&fv rdd }||| j| j! | j}|||| j!d8 }| j'| (| | _||| j| j! | j}|||| j!d8 }| j'| (| | _|s|r| j)|dd nd | _d S )Nviewport_drag_endT)releaseFr   zhorizontal-changer[   
horizontalviewport_wheelupviewport_wheeldownviewport_leftarrowviewport_rightarrowviewport_uparrowviewport_downarrowviewport_pageupviewport_pagedownviewport_drag_startc                 S   s0   d| |  ||  } | dk r dS | dkr,dS | S )a  
                Given a position `n`, computes the speed. The speed is 0.0
                when `n` == `zero`, 1.0 when `n` == `one`, and linearly
                interpolated when between.

                Returns 0.0 when outside the bounds - in either direction.
                g      ?g        r   )r   zerooner   r   r   speed  s    	zViewport.event.<locals>.speed)rs   )*r9   r:   r5   r   eventr$   r   r   ri   get_grabr    r=   r!   r   	map_eventset_grabround_valuer[   coreIgnoreEventr'   r%   r&   r+   r,   r-   r#   stepr   r@   rA   rY   get_focusedr(   typepygameMOUSEMOTIONMOUSEBUTTONDOWNMOUSEBUTTONUPr)   r*   r\   )r/   evxyr_   rq   
old_xvalue
old_yvaluexvalueyvalueoldxoldydxdy
new_xvaluenewx
new_yvaluenewyinside
adjustmentr[   focusedr   xspeedyspeedrJ   r   r   r   %  s    


:








&zViewport.eventc                 C   s   || _ tjj| d d S Nr   )r9   r   r   rW   rr   r/   offsetr   r   r   set_xoffset  s    zViewport.set_xoffsetc                 C   s   || _ tjj| d d S r   )r:   r   r   rW   rr   r   r   r   r   set_yoffset  s    zViewport.set_yoffset)Nr2   r2   NNTFFNr3   NNNFF)T)__name__
__module____qualname____version__r@   rA   r1   r6   rM   rg   rW   r\   r   r   r   __classcell__r   r   rJ   r   r   +   s8                  ^L
 Mr   c                       sH   e Zd ZejZdZd fdd	Zdd Z fddZ fd	d
Z	  Z
S )VPGridNvpgridc                    sj   t t| jf d|i| |d u r2|d u r2td|d urN|d u rN|d u rNd}|| _|| _|| _|| _d S )Nr4   z1A VPGrid must be given the rows or cols property.T)r5   r   r6   	Exception	grid_cols	grid_rowsgrid_transposeallow_underfull)r/   colsrows	transposer4   r   rI   rJ   r   r   r6     s    zVPGrid.__init__c              	   C   sX  || _ || _| jp|}| jp|}| js<g | _tjj	ddS t
| j}| j}| j}	|d u rv||	 }|	| |k rv|d7 }|	d u r|| }	|	| |k r|	d7 }	| jj}
| jj}|
d u r| jj}
|d u r| jj}tjj| jj|}tjj| jj|}tjj| jj|}tjj| jj|}tjj| jd ||||}| \}}||
 | |
 | | }|| |	 | | | }| jjr|}||d |
  | | | }| jjr|}||	d |  | | |	 }| |||\}}}}||7 }||7 }g | _tjj	||}t| jD ]
\}}| jr0||	 }||	 }n|| }|| }|||
  | }|||  | }|| dk r| j||f q|| dk r| j||f q||kr| j||f q||kr| j||f qtjj|||||}|||||||}| j| q|jdd||fdd}| j s@| j!rT|"| d dd|| |S )Nr   r   Trh   )#r%   r&   r>   r?   childrenr<   r   r   rW   rk   rB   r   r   r4   xspacingyspacingspacingrQ   scaleleft_marginright_margin
top_marginbottom_marginrj   rS   rU   rg   	enumerater   appendplacerm   r$   r@   rn   )r/   r%   r&   r_   ro   r>   r?   lcr   r   r   r   r   r   r   r   rendr]   r^   twthre   rf   rq   indexcr   r   rp   posr   r   r   rW     s    







zVPGrid.renderc                    sJ   t t| | d | j| jfvrFt| j| j| j krFtjj	sFt
dd S )NzVPGrid overfull.)r5   r   r7   r   r   rB   r   r   configallow_unfull_vpgridsr   )r/   drJ   r   r   r7     s
    z
VPGrid.addc                    s   t t|   d }d}d | j| jfvrN| j| j t| j }|dkrtd}n8| jpX| j}|r|t| j|  }||k rtd|}|d ur| j	}|d u rt
jjpt
jj}t
jjsd}|s|t|D ]}| t
jj  qd S )Nr   zVPGrid not completely full.z<VPGrid not completely full, needs a multiple of {} children.T)r5   r   rM   r   r   rB   r   r   formatr   r   r   allow_underfull_gridsr   	developerr   r7   r   rQ   Null)r/   excdeltagivenr   _rJ   r   r   rM     s,    
zVPGrid.per_interact)NNNr   N)r   r   r   r   r   r   r6   rW   r7   rM   r   r   r   rJ   r   r     s       jr   )
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   rO   pygame_sdl2r   r   r   r   rQ   	Containerr   r   r   r   r   r   <module>   s   8   S
