U
    '1eWd                     @   s  d Z dZddlZddl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mZmZmZ ddlT ddlmZmZ ddlmZmZmZ dd	lmZmZm Z m!Z!m"Z"m#Z# dd
l$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+ ddlm,Z, dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2G dd deZ3G dd dZ4G dd de4Z5G dd  d e4Z6G d!d" d"eZ7G d#d$ d$e6Z8G d%d& d&eZ9G d'd( d(e7Z:dS ))z3.3.0z<This will be a collection of legends to be used with charts.    N)colors)isNumberOneOfisStringisColorOrNoneisNumberOrNoneisListOfNumbersOrNone	isBooleanEitherOrNoneOrAutoOrisAutoAutoisBoxAnchor
SequenceOfisInstanceOf)*)stringWidthgetFont)WidgetTypedPropertyCollection
PropHolder)DrawingGroupStringRectLineSTATE_DEFAULTS)uSymbol2SymbolisSymbol)isSeqfind_localsisStrasNative)_baseGFontNamec                 C   s   | dg }d}|D ]6}t |t|}t|D ]\}}t || |||< q,qdg|d |  }t|D ]}||d   || 7  < qd|S )Nr      )maxlen	enumeraterange)nAXmaix r1   E/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/charts/legends.py	_transMax   s    
r3   c                 C   s   t | rt| S t| S d S N)r"   r#   strsr1   r1   r2   _objStr"   s    r8   c                 C   s"   t | rttt| S t| S d S r4   )r    listmap_getStrr8   r6   r1   r1   r2   r;   (   s    r;   c                 C   s,   t | rtdd | D S | p ddS d S )Nc                 S   s   g | ]}|pd  dqS ) 
)split.0r0   r1   r1   r2   
<listcomp>0   s     z_getLines.<locals>.<listcomp>r<   r=   )r    tupler>   r6   r1   r1   r2   	_getLines.   s    rC   c                 C   s.   t | }t| r"tdd |D S t|S d S )Nc                 S   s   g | ]}t |qS r1   r'   r?   r1   r1   r2   rA   7   s     z!_getLineCount.<locals>.<listcomp>)rC   r    r&   r'   )r7   Tr1   r1   r2   _getLineCount4   s    rF   c                    s   g }|j }t|rt|D ]p\}}||| f }	t|	d| t|	d| fdd|dD }
t|	j|
rrt|
ptd}
||
 ||	j q|d= nZ|d| f }	t|	d| t|	d| fdd|dD }
|t|	j|
rt|
pd |S )	NfontNamefontSizec                    s   g | ]}t | qS r1   r   r?   fNfSr1   r2   rA   C   s     z_getWidths.<locals>.<listcomp>r=   r   c                    s   g | ]}t | qS r1   rI   r?   rJ   r1   r2   rA   L   s     )appendr    r(   getattrr>   r&   minWidthrpad)r/   r7   rG   rH   subColsSaSjtscr-   r1   rJ   r2   
_getWidths;   s$    rX   c                   @   s   e Zd ZdZeeeddeeddeeddddd	d
deeddeeddee	ddee
ddeeeeeeeeddddfddeeeeeeeeddddfddeeddeeddeeddddddZdS )SubColPropertyr   zminimum width for this subcoldesczright padding for this subcolleftrightcenterZcentrenumericzalignment in subColFont name of the stringsFont size of the stringszleading for the stringsZ	fontColoriZemptyOKlohizunderline definitionszoverline definitionszx offset from default positionzy offset from default positiontopZbottommiddlezvertical alignment in the row)rP   rQ   alignrG   rH   leading	fillColor
underlines	overlinesdxdyvAlignN)__name__
__module____qualname__dividerLinesAttrMapAttrMapValuer   r   r   r   r   r
   r   r   r   r   _attrMapr1   r1   r1   r2   rY   P   s   





**

rY   c                   @   s,   e Zd Zdd ZeeZdd Zdd ZdS )LegendCalloutc                    s&   t fdd t fdd|D S )zZreturn a tuple of values from the first function up the stack with isinstance(self,legend)c                    s   |  dd  kr| pd S NselfgetLlegendr1   r2   <lambda>d       z-LegendCallout._legendValues.<locals>.<lambda>c                    s   g | ]} | qS r1   r1   r@   r.   r{   r1   r2   rA   e   s     z/LegendCallout._legendValues.<locals>.<listcomp>r!   rB   )r~   argsr1   )r|   r~   r2   _legendValuesb   s    zLegendCallout._legendValuesc                    s(   t fdd t fdd|D S )Nc                    s   |  dd  kr| pd S rw   ry   r{   r}   r1   r2   r   i   r   z3LegendCallout._selfOrLegendValues.<locals>.<lambda>c                    s   g | ]}t | | qS r1   )rO   r   )r|   rx   r1   r2   rA   j   s     z5LegendCallout._selfOrLegendValues.<locals>.<listcomp>r   )rx   r~   r   r1   )r|   r~   rx   r2   _selfOrLegendValuesh   s    z!LegendCallout._selfOrLegendValuesc                 C   s   |\}}d S r4   r1   )rx   r~   gthisxycolNamecolnamer1   r1   r2   __call__l   s    zLegendCallout.__call__N)ro   rp   rq   r   staticmethodr   r   r1   r1   r1   r2   rv   a   s   rv   c                   @   s   e Zd Zdd ZdS )LegendSwatchCalloutc           
      C   s   |\}}	d S r4   r1   )
rx   r~   r   r   r   r/   r   Zswatchr   r   r1   r1   r2   r   p   s    zLegendSwatchCallout.__call__Nro   rp   rq   r   r1   r1   r1   r2   r   o   s   r   c                   @   s   e Zd Zdd ZdS )LegendColEndCalloutc                 C   s   d S r4   r1   )rx   r~   r   r0   xtr   widthlWidthr1   r1   r2   r   t   s    zLegendColEndCallout.__call__Nr   r1   r1   r1   r2   r   s   s   r   c                &   @   s  e Zd ZdZeeeddeeddeeddeeddeeddeedd	d
eedd	d
eedd	d
eeddeeddeeddeeddddedddee	ddeeddeeddee
ddee
ddeeddeeeedd	d
eddd	d
eedeedd	deed d	d!d"d#d$d%d&d'd	deed(d	d
ee
d)d	d
eed*d	d
eeed d!d!d+d,d	d
eed-d	d
edd.d	d
edd/dedd0d	d
eed1deed2dd3"Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdS )HLegenda%  A simple legend containing rectangular swatches and strings.

    The swatches are filled rectangles whenever the respective
    color object in 'colorNamePairs' is a subclass of Color in
    reportlab.lib.colors. Otherwise the object passed instead is
    assumed to have 'x', 'y', 'width' and 'height' attributes.
    A legend then tries to set them or catches any error. This
    lets you plug-in any widget you like as a replacement for
    the default rectangular swatches.

    Strings can be nicely aligned left or right to the swatches.
    z*x-coordinate of upper-left reference pointrZ   z*y-coordinate of upper-left reference pointz(x-distance between neighbouring swatchesz(y-distance between neighbouring swatchesz*Distance between swatch rectangle and textz(x Padding between columns if deltax=Noner%   )r[   advancedUsagez%y Padding between rows if deltay=NonezAdditional gap between rowszWidth of swatch rectanglezHeight of swatch rectanglezMax. number of items per columnr\   r]   z*Alignment of text with respect to swatchesNz4List of color/name tuples (color can also be widget)r`   ra   ztext leadingzswatches filling colorzBorder color of the swatchesz)Width of the border color of the swatchesz)None, Auto() or makeMarker('Diamond') ...z'a user callout(self,g,x,y,(color,text))z Anchor point for the legend areaz1If true column widths may vary (default is false))r   r                     zGIf 1 we have dividers between the rows | 2 for extra top | 4 for bottomzdividerLines widthzdividerLines colorzDash array for dividerLines.rb   zdivider lines X offsetszdividerLines Y offsetz.a user callout(self,g, x, xt, y,width, lWidth)zsubColumn propertiesz5a user swatch callout(self,g,x,y,i,(col,name),swatch)z$x position adjustment for the swatchz$y position adjustment for the swatch)"r0   r   deltaxdeltaydxTextSpaceautoXPaddingautoYPaddingyGaprl   rm   columnMaximum	alignmentcolorNamePairsrG   rH   rh   ri   strokeColorstrokeWidthswatchMarkercallout	boxAnchor
variColumnrr   dividerWidthdividerColordividerDashArraydividerOffsXdividerOffsYcolEndCalloutrR   swatchCalloutswdxswdyc                 C   s  d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
d| _d| _tjd	ftjd
ftjdftjdftjdfg| _td | _td | _d | _td | _td | _td | _d | _d| _d| _d| _d| _d| _ d | _!tj"| _#d| _$d| _%d | _&| '  d S )Nr   r\   K      r   r   
   r   redbluegreenpinkyellowrG   rH   ri   r   r   nw      ?r   r   )(r0   r   r   r   r   r   r   rl   rm   r   r   r   r   r   r   r   r   r   r   r   r   rG   rH   rh   ri   r   r   r   r   r   r   rr   r   r   blackr   r   r   r   _init_subColsrx   r1   r1   r2   __init__   sJ    




zLegend.__init__c                 C   sF   t t }| _d|_d |_ |_|_d|_d|d _d|_d |_	d S )Nr%   r   r]   r\   re   )
r   rY   rR   rQ   rl   rm   rP   rg   rn   rh   )rx   rW   r1   r1   r2   r      s    
zLegend._init_subColsc                 C   s    dD ]}t ||r|  S qd S )N)linesZbarsZslicesZstrands)hasattr)rx   chartr.   r1   r1   r2   _getChartStyleName   s    
 
zLegend._getChartStyleNamec                 C   s   t || |d S r4   )rO   r   )rx   r   r1   r1   r2   _getChartStyle   s    zLegend._getChartStylec                    sH   t |sdd |D }n,t|dt|dd   fddt jD }|S )Nc                 S   s   g | ]}t |d  qS )r%   )r;   )r@   pr1   r1   r2   rA      s     z$Legend._getTexts.<locals>.<listcomp>r   objc                    s   g | ]}  |d | qS )	series %d)getSeriesNamer@   r/   r   r1   r2   rA      s     )r   rO   r)   _seriesCount)rx   r   Ztextsr1   r   r2   	_getTexts   s
    zLegend._getTextsc                    s   | j | j| jfddt| |D   s>ddgS tdd  D | jr| j fddtdt	 | jD S t
 S dS )z2Calculate the maximum width of some given strings.c                    s    g | ]\}}t || qS r1   )rX   )r@   r/   r-   )rG   rH   rR   r1   r2   rA      s     z2Legend._calculateMaxBoundaries.<locals>.<listcomp>r   c                 S   s   g | ]}t |qS r1   rD   r@   r-   r1   r1   r2   rA     s     c                    s"   g | ]}t  ||  qS r1   )r3   )r@   r)Mr   r*   r1   r2   rA     s     N)rG   rH   rR   r(   r   r&   r   r   r)   r'   r3   )rx   r   r1   )r   r   rG   rH   r*   rR   r2   _calculateMaxBoundaries   s     $zLegend._calculateMaxBoundariesc                 C   s  | j }| j}| j|  }}| j}| j}t|jjd }|dkrBd}||9 }|d }| j}	|	slt	||| j
 }	d}
d}|}| jd }| | jD ]x}||| d  }|t||  }d| | | }|t	|	| | }t|||}||krd}|}|
d7 }
q|}|d }q|| S )N     @@r   `"?333333?r%   r   r   )rm   r   r   rH   rG   r   faceascentr   r&   r   r   r   r   rF   min)rx   rm   r   thisy
upperleftyrH   rG   r   rh   r   ZcolumnCountcountZlowylimr   y0r   leadingMoveZnewyr1   r1   r2   _calcHeight	  s<      


zLegend._calcHeightc              	   C   s   t |||||||dS )N)ri   r   r   )r   )rx   r0   r   rl   rm   ri   r   r   r1   r1   r2   _defaultSwatch(  s
    
zLegend._defaultSwatchc           V      C   s  | j }t|}|rFt|dt|dd }d }t|d}|j}| |}n:t| dd }t|rxt|dt|dd }t|d}t|}| j}| j}| j	}	| j
}
| j}| j}| j}| j}| j}| j}| j}| j}| j}|d }| j}|st||| j }| j}| |}t||
 d |
d  }|| | j }| j}|rNtdd	 |D ||  }n$t|d
 | |}|| }||g }| j}| j| j }|dkr|  }|dkr||d 7 }n||7 }|dkr|dkr||d 8 }n||8 }|}t  } t!|j"j#d }!|!dkrd}!|!|9 }!|
d }"t| dd }#t| dd }$| j$}%|%rZ| j%}&| j&}'| j'}(| j(})| j)}*t*|D ]^}+|r|},|+|,_+||+ }-nJ||+ \},}-t|r|},|+|,_+t|-rt|dt|dd ,|+d|+ }-t-|-}.g }/|/j.}0t|+|
d  }1||1 }2|||! d   }3}4|#r$|#| | ||3|,|-f |	dkrD|}5||2d
  | }6n$|	dkr`|| | }5|}6nt/dt0|-sx|.g}.t1|-}7|3}8t2|.D ]<\}9}:|4}3|9d };|5|2|;  }<|5|2|;d   }=||9|+f }>|>j3}?|>j}@|>j}At|>d|}Bt|>d|}Ct|>d|}D|>j4pd| }E|B|kr(|!|C | }Fn&t!|j"j#d }F|FdkrFd}F|F|C9 }F|>j5}G|Gdkrdd}Hn$|E |7t|:  }H|Gdkr|Hd9 }H|?dkrd }?|<}In4|?dkrd!}?|=}In |?d"kr|=}Ind}?d|<|=  }I|:D ]4}J|0t6|I|@ |3|A |H |J|B|C|D|?d# |3|E8 }3qt7|8|3}8|3|E7 }3|3t|E|F d d$f|3|F d%ffD ]\}K}Lt|>|Ld }M|Mr>t8|Mt9t:fsn|Mf}M|MD ]P}Nt;;|N}N|N j<|K7  _<|N j=|K7  _=|N j>|<7  _>|N j?|=7  _?|0|N qrq>q|6}5|8}3d|4 |3 | }O|%r|| | |2d
  |)d  }P||d  |* }8|%d@ r*|+|
 s>|%d@ rb|+|
 sb| @tA||)d  |8|P|8|'|&|(d& |%d'@ r|+|
 |"ks|+|d kr|8t||O| 8 }8| @tA||)d  |8|P|8|'|&|(d& |5t| d(d }Q|t| d)d }Rt|,rt|,dt|,dd }|Bt|,d*|+|Q|R||}Snt8|,tCjDrjtE|rPtF||Q|d  |R|d  |,}Sn| jG|Q|R|||,||d+}SnH|,d k	rz&t;H|,}S|Q|S_|R|S_||S_I||S_JW n   d }SY nX nd }S|Sr| @|S |$r|$| | ||4|+|,|-f|S |/D ]}T| @|T q| jKrz|+|
 |"ks|+|d krz|	dkr*|}Un|| | }U||d  |* t||O|  }8| K| | ||U|8|2d
 |2d
 | |  |+|
 |"kr|r||2d
 | 7 }n|| }|}n|t||O | }qb| S ),Nr   r   )r   r   r   r%   g      ?c                 S   s   g | ]}|d  qS )rM   r1   r   r1   r1   r2   rA   U  s     zLegend.draw.<locals>.<listcomp>rM   )ner*   r   Zautoy)ecwg       @)r   r   swZautox)r*   r   r7   r   r   r   r   r   r   r   r   r\   r]   zbad alignmentrG   rH   ri   re   rf   startendr_   rG   rH   ri   Z
textAnchorrj   rk   r   r   strokeDashArrayr   r   r   index)ri   r   r   )Lr   r   rO   r   r   r   r'   rl   rm   r   r   r   r   r   rG   rH   ri   r   r   rR   r   r&   r   r   r   intr   r   sumr0   r   r   r   r   r   r   rr   r   r   r   r   r   r)   r   r   rC   rN   
ValueErrorr    rF   r(   rg   rh   rn   r   r   
isinstancerB   r9   copyy1y2x1x2addr   ZmakeSwatchSampler   ZColorr   r   r   deepcopyr   heightr   )Vrx   r   ZautoCPr   r   r*   Z
chartTextsrl   rm   r   r   r   r   r   rG   rH   ri   r   r   rR   rh   r   baZmaxWidthZnColsZxWr   r   r   r   r   r   r   r   r   r   Zscalloutrr   r   r   r   r   r   r/   r   r   rE   rS   rT   rU   ZjOffsr   r   r0   ZxnZ	lineCountZydkr   kkr   r   rW   anchorZscdxZscdyrK   rL   ZfCZfLZfAZvAZvAdyZxoffsrV   Ziyr.   Zillr   ZxdZswatchXZswatchYr   r7   r   r1   r1   r2   draw/  s   








 


  




 

 


&
* 
(  &  

 



  $
&zLegend.drawc                 C   sT   t dd}t }d|_d|_d|_d|_d }dd |D }||_||d	 |S )
zMake sample legend.   d   r\   r   r   z&red green blue yellow pink black whitec                 S   s   g | ]}t t||fqS r1   )rO   r   r   r1   r1   r2   rA     s     zLegend.demo.<locals>.<listcomp>r~   )	r   r   r   r0   r   r   r>   r   r   )rx   dr~   itemsr1   r1   r2   demo  s    
zLegend.demo)ro   rp   rq   __doc__rs   rt   r   r   r   r   r   r   r   r   r   r	   r   r   ru   r   r   r   r   r   r   r   r   r   r  r1   r1   r1   r2   r   w   s`   

















%6	 er   c                   @   s:   e Zd Zddedejdejdddddfdd	Zd
d ZdS )TotalAnnotatorZTotalz0.0r   r   Nr   r   c                 C   sL   || _ || _|| _|| _|| _|
| _|	| _|| _|| _|| _	|| _
|| _d S r4   )lTextrTextrG   rH   ri   rm   rl   dlydlxr   r   r   )rx   r  r  rG   rH   ri   r   r   r   rl   rm   r  r	  r1   r1   r2   r   &  s    zTotalAnnotator.__init__c                 C   s  ddl m}m}	 | j}
| j}| j}| j}| j}t|j	j
d }|dkrJd}||
9 }|
d }|| j |d  }| jr|r||||| j||
|dd | jr|||| || j||
|d	d |r|r|| j | }||	|| jd  ||| jd
  | |||| jd d S )Nr   )r   r   r   r   r   g?r   r   r   r%   r   )reportlab.graphics.shapesr   r   rH   rG   ri   r   r   r   r   r   rm   r  r   r  r  r	  r   )rx   r~   r   r0   r   r   r   r   r   r   rH   rG   ri   r   r   r   rh   ZytZyLr1   r1   r2   r   6  sB     
& zTotalAnnotator.__call__)ro   rp   rq   r$   r   r   r   r   r1   r1   r1   r2   r  %  s         
r  c                   @   sn   e Zd ZdZeeeddeeddeeddeeddeeddeeddee	d	dd
Z
dd Zdd ZdS )
LineSwatchzHbasically a Line with properties added so it can be used in a LineLegendz(x-coordinate for swatch line start pointrZ   z(y-coordinate for swatch line start pointzlength of swatch linezused for line strokeWidthzcolor of swatch linezthickness of the swatchzdash array for swatch line)r0   r   r   r   r   r   r   c                 C   s:   ddl m} d| _d| _d| _d| _|| _d | _d| _d S )Nr   )r   r   r%   )	Zreportlab.lib.colorsr   r0   r   r   r   r   r   r   )rx   r   r1   r1   r2   r   `  s    zLineSwatch.__init__c                 C   s8   t | j| j| j| j | j}| j|_| j|_| j|_|S r4   )r   r0   r   r   r   r   r   )rx   r   r1   r1   r2   r   j  s
    zLineSwatch.drawN)ro   rp   rq   r  rs   rt   r   r   r   r   ru   r   r   r1   r1   r1   r2   r  T  s   








r  c                   @   s    e Zd ZdZdd Zdd ZdS )
LineLegendzA subclass of Legend for drawing legends with lines as the
    swatches rather than rectangles. Useful for lineCharts and
    linePlots. Should be similar in all other ways the the standard
    Legend class.
    c                 C   s   t |  d| _d| _d S )Nr   r   )r   r   rl   rm   r   r1   r1   r2   r   x  s    
zLineLegend.__init__c           	      C   s.   t  }||_||_||_||_||_||_|S r4   )r  r0   r   r   r   r   r   )	rx   r0   r   rl   rm   ri   r   r   r   r1   r1   r2   r     s    zLineLegend._defaultSwatchN)ro   rp   rq   r  r   r   r1   r1   r1   r2   r  q  s   r  );__version__r  r   Zreportlab.libr   Zreportlab.lib.validatorsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Zreportlab.lib.attrmapZreportlab.pdfbase.pdfmetricsr   r   Zreportlab.graphics.widgetbaser   r   r   r
  r   r   r   r   r   r   Z"reportlab.graphics.widgets.markersr   r   Zreportlab.lib.utilsr    r!   r"   r#   r$   r3   r8   r;   rC   rF   rX   rY   rv   r   r   r   r  r  r  r1   r1   r1   r2   <module>   s8   D    1/