
    f                        d dl mZmZmZ d dlmZmZmZmZ d dl	Z	d dl
mZ  e        d dlmZmZmZmZmZ d dl d dlmZ d dlmZmZmZmZmZmZmZ d dlZ ej<                  d	      Zd d
l m!Z!  e!       Z"dejF                  z  Z$ G d de%      Z& G d de&e'e      Z( G d d      Z) G d de(      Z* G d de*      Z+ G d de+      Z, G d de)e,      Z- G d de)e(e.      Z/ G d d      Z0y)    )divisionprint_functionunicode_literals)pisincossqrtN)require_gi_versions)GLibGdkPango
PangoCairo	GdkPixbuf)*)DwellProgress)brightenunicode_strgradient_linedrop_shadowroundrect_curverounded_path"rounded_polygon_path_to_cairo_pathKeyGTK)Config      ?c                   r    e Zd ZdZdZdZdZdZdZd Z	d Z
ed        Zedd       Zed	        Zed
        Zy)KeyN r   ))   gQ?)   g{Gzt?c                 <    t         j                  |        i | _        y N)	KeyCommon__init___label_extentsselfs    0/usr/lib/python3/dist-packages/Onboard/KeyGtk.pyr$   zKey.__init__>   s    4      c                     t               )z}
        Get the maximum font possible that would not cause the label to
        overflow the boundaries of the key.
        )NotImplementedErrorr&   s    r(   get_best_font_sizezKey.get_best_font_sizeB   s     "##r)   c                      d t         _        y r"   )r   _pango_layouts r)   r(   reset_pango_layoutzKey.reset_pango_layoutJ   s
    !r)   c                 z   t         j                  t        j                  t	        j
                               t        j                  t	        j
                               t        j                  t	        j
                               ft         _        t         j                  |   }t         j                  || |       |S )N)context)r   r.   r   Layoutr   pango_context_getprepare_pango_layout)text	font_sizeslotlayouts       r(   get_pango_layoutzKey.get_pango_layoutN   s     % s'<'<'>?s'<'<'>?s'<'<'>?"AC
 ##D)  y9r)   c                    |d}| j                  |d       | j                  d       t        j                  t        j
                  j                        }|j                  t        d|             | j                  |       y )Nr   r   )
set_text	set_widthr   FontDescriptionconfigtheme_settingskey_label_fontset_sizemaxset_font_description)r9   r6   r7   font_descriptions       r(   r5   zKey.prepare_pango_layout]   si    <Db! 001F1F1U1UV!!#a"34##$45r)   c                 D    |d}| j                   |   \  | _        | _        y )Nr   )_shadow_presets_shadow_steps_shadow_alpha)_classqualitys     r(   set_shadow_qualityzKey.set_shadow_qualityg   s)    ?G$*$:$:7$C 	3f2r)   )r   )__name__
__module____qualname__r.   r%   _popup_indicatorrI   rJ   rH   r$   r,   staticmethodr0   r:   r5   classmethodrM   r/   r)   r(   r   r   5   s}    NNMM.O!$ " "   6 6 D Dr)   r   c                        e Zd ZdZdZdZd!dZd Zd Zd Z	d Z
d Z fdZd	 Zd
 Zej                   fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd"dZd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d  Z& xZ'S )#RectKeyNc                 j    t         j                  |        t        j                  | ||       i | _        y r"   )r   r$   RectKeyCommon_key_surfacesr'   idborder_rects      r(   r$   zRectKey.__init__u   s(    TtR5r)   c                      y)z Is this a key item? Tr/   r&   s    r(   is_keyzRectKey.is_key{   s    r)   c                 D    | j                          | j                          y)zU
        Clear buffered patterns, e.g. after resizing, change of settings...
        N)invalidate_keyinvalidate_shadowr&   s    r(   invalidate_cacheszRectKey.invalidate_caches   s     	 r)   c                     i | _         y r"   )rX   r&   s    r(   r_   zRectKey.invalidate_key   s
    r)   c                      i | _         i | _        y)zk
        Images only have to be expicitely cleared when the
        window_scaling_factor changes.
        N)_image_pixbuf_requested_image_sizer&   s    r(   invalidate_imagezRectKey.invalidate_image   s    
  %'"r)   c                     d | _         y r"   )_shadow_surfacer&   s    r(   r`   zRectKey.invalidate_shadow   s
    #r)   c                 t    || j                         k7  r$t        t        |   |       | j	                          yy)zw
        The expand-corrections button moves around a lot.
        Be sure to keep its image surfaces updated.
        N)get_border_rectsuperrU   set_border_rectra   r'   rect	__class__s     r(   rl   zRectKey.set_border_rect   s6    
 4''))'406""$ *r)   c                 J   | j                   | j                  dz	  f}| j                  j                  |      }|,| j                  r | j	                  |      }|| j                  |<   |r=|\  }}|j                  ||j                  |j                         |j                          y y )N   )	labelr7   rX   get_create_key_surfaceset_source_surfacexypaint)r'   crkeyentrysurfacern   s         r(   draw_cachedzRectKey.draw_cached   s    zz4>>Q./""&&s+=~~004*/""3'!MGT!!'466466:HHJ r)   c                    | j                         } |j                  | j                          j                         }|j	                         }|j                  t        j                  |j                  |j                        }t        j                  |      }|j                          |j                  |j                   |j                          | j                  |       |j!                          t#        j$                          ||fS r"   )get_canvas_rectinflateget_extra_render_sizeint
get_targetcreate_similarcairoCONTENT_COLOR_ALPHAwhContextsave	translaterv   rw   drawrestorer   flush)r'   base_contextrn   	clip_recttargetr|   ry   s          r(   rt   zRectKey._create_key_surface   s    ##% DLL$"<"<">?CCE	 ((*''(A(A(1Y[[B]]7#
	
ikk\IKK<0		"


		 	!!r)   c                 p    | j                  ||       | j                  ||       | j                  ||       y r"   )draw_geometry
draw_image
draw_label)r'   ry   lods      r(   r   zRectKey.draw   s.    2s#C C r)   c                 &   | j                   s| j                  sy |t        j                  k(  rv| j                  rj| j	                         }|rU| j                         }|j                  j                  d      }|d   |d   z   dz  }t        |d      |z  }t        |d      }nd}nd}| j                         }| j                         }|dk(  r| j                  |||       y |dk(  r| j                  ||||       y |d	k(  r| j                  ||||       y y )
Nr   r   r   r   g333333@g      @r   flatgradientdish)	show_faceshow_borderLODFULLget_stroke_widthget_layout_rootr2   scale_log_to_canvasminrD   get_fill_color	get_styledraw_flat_keydraw_gradient_keydraw_dish_key)	r'   ry   r   scaleroott
line_widthfill	key_styles	            r(   r   zRectKey.draw_geometry   s   ~~d&6&6#((?t//))+E++-||77
CdQqTkS0
 S1E9
 S1

J""$NN$	r44*$""2tZ=& r4S9 !r)   c                 $   | j                  |       | j                  r2 |j                  |  |r|j                          n|j	                          |r? |j                  | j                           |j                  |       |j                          y y r"   )_build_canvas_pathr   set_source_rgbafill_preserver   get_stroke_colorset_line_widthstroke)r'   ry   r   r   s       r(   r   zRectKey.draw_flat_key   sw    #>>B%  "	B 5 5 78j)IIK r)   c                    t         j                  j                  dz  }| j                         }| j	                         }| j                         }| j                  ||       t        ||      }	| j                  r|rl|rjt        j                  |	 }
t        |dz  g| } |
j                  dg|  t        | dz  g| } |
j                  dg|  |j                  |
       n |j                  |  | j                  r|j!                          n|j#                          | j                  r|r~|rl|}t        j                  |	 }
t        |dz  g| } |
j                  dg|  t        | dz  g| } |
j                  dg|  |j                  |
       n- |j                  |  n |j                  | j%                           |j'                  |       |j)                          y )N      Y@      ?r   r   )r@   rA   key_fill_gradientget_stroke_gradientget_gradient_angler   r   r   r   r   LinearGradientr   add_color_stop_rgba
set_sourcer   r   r   r   r   r   r   )r'   ry   r   r   r   fill_gradientstroke_gradientalpharn   glinepatrgbar   s                r(   r   zRectKey.draw_gradient_key   s    //AAEI224'')##%D)dE* >>**U3r 19D9'''1D1r 19D9'''1D1s#"""D)  "	 !F..7C#_$4R$7A&AD+C++A55#_$4R$7A&AD+C++A55MM3'&B&&-"""D$9$9$;<j)
		r)   c                    | j                         }| j                  r| j                  }n#t        j                  | j	                               }|j                  d      \  }}|j                  d      }t        dg| }	| j                         }
| j                         t        dz  z
  }t        |      }t        |      }| j                  |      \  }}}}t        t        j                   j"                  d      }t        |d      }| j%                         }| j&                  j)                  |      | j&                  j+                  |      z   dz  }| j-                         }|t        j.                  |z  z
  }t        j0                  }d|d   |z  |z  dz  z
  }d|d   |z  |z  dz  z
  }||z  }||z  }|||z   z  dz  }| j3                  |||||||      \  }}| j3                  |||||z
  ||z
  ||      \  }}| j3                  |||||||      \  } }!| j4                  rp|s3 |j6                  |	  |D ]  }"t9        ||"       |j;                            n;t=        |      D ]-  \  }#}$||#   }%||#   }"||#   }&| j?                  ||"|&|$|%|	|
||	       / | j@                  r|s |j6                  |  n| jB                  d	k(  r
t        dz  }'nd
}'t        j                   jD                  dz  }(t        |( dz  g| })t        |(dz  g| }*tG        ||'      }+tI        jJ                  |+ }, |,jL                  d
g|)   |,jL                  dg|*   |,jL                  dg|)  |jO                  |,       |!D ]  }"t9        ||"       |j;                            y y )Nr   r   gɿr      r          @r   SPCE        r   )(r   geometryKeyGeometry	from_rectrj   scale_log_to_sizer   r   r   get_light_directionr   r   r   get_key_offset_sizerD   r@   rA   roundrect_radiusget_chamfer_sizer2   scale_log_to_canvas_xscale_log_to_canvas_yr   DISH_KEY_Y_OFFSETDISH_KEY_BORDERget_canvas_polygonsr   r   r   r   	enumerate_draw_dish_key_borderr   rZ   r   r   r   r   r   r   )-r'   ry   r   r   r   canvas_rectr   size_scale_xsize_scale_y	base_rgbar   	light_dirlightxlightykey_offset_xkey_offset_y
key_size_x
key_size_y
radius_pctchamfer_sizestroke_widthkey_offset_top_yborderscale_top_xscale_top_ykey_size_top_xkey_size_top_ychamfer_size_toppolygonspolygon_pathspolygons_toppolygon_paths_toppolygons_top1polygon_paths_top1pathipgpolygonpolygon_toppath_topangler   	dark_rgbabright_rgbar   r   s-                                                r(   r   zRectKey.draw_dish_key  s   **,==}}H",,T-A-A-CDH%-%?%?
%K"l "))#. V+d+	224,,.c9	YY -1,D,DX,N 	;lJ
..??C
Q'
,,.::<H::<HILOP --/'$$|34''VAY5DsJKVAY5DsJK#k1#k1';+DEK $$X#/#-z#-|= 	 - $$X#/1A#1L#@#1L#@#-/?	A 	(' $$X#/1A#1>#-/?A 	*) """I.) D6r4@GGI %.h$7 ?LC".s"3K(-D05H..r4/6/8//5v?? >>"""D) 77f$HEE"("7"7"I"IE"Q$m^B%6>>	&~b'8@4@%k59**U3'''8i8''':k:'''8i8s#* 22t<	+ r)   c
           
         t        |      }
t        |      }g }t        d|
d      D ]  }||   }||dz      }||
dz
  k  r||dz      }||dz      }n
|d   }|d   }||z
  }||z
   }t        ||z  ||z  z         }|r||z  ||	z  z   |z  |z  dz  nd}|j                  t	        |g|         d}t        d|dz
  d      D ]D  }|dz   }|dz   }||k\  r||z  }|dz   }||k\  rd}||   }|d   }|d   }||   }|d   }|d   }||   } | d   }!| d   }"||   }#|#d   }$|#d   }%||   }&|&d   }'|&d   }(||   }&|&d   })|&d   }*||   }&|&d   }+|&d   },|dz  }-|-dz   }.|.|
k\  r|.|
z  }.|-dz   }/|/|
k\  r|/|
z  }/||-   }0||-dz      }1||.   }2||.dz      }3||/   }4||/dz      }5|2|0z
  }6|3|1z
  }7|5|3z
  }8|4|2z
   }9|6|8z  |7|9z  z   dk  }:t        j                  ||)z   dz  ||*z   dz  |!|+z   dz  |"|,z   dz        };|dz   t        |      z  }< |;j                  dg||      |;j                  d	g||<     |j                  |;       |j                  ||       |j                  ||       |j                  | d   | d   | d   | d
   | d   | d          |j                  |$|%       |j                  |+|,       |:r|j                  |2|3       |j                  |)|*       |j                  |'|(       |j                          |j                          |dz  }G y )Nr   r   r      g?r   r    r   r      )lenranger	   appendr   r   r   r   r   move_toline_tocurve_to
close_pathr   )=r'   ry   r   r   r   r   r   r   r   r   nmedge_colorsix0y0x1y1nxnylnIedgei1i2i3p0p0xp0yp1p1xp1yp2p2xp2yp3p3xp3ypptop0xptop0yptop1xptop1yptop2xptop2yj0j1j2ptopaxptopayptopbxptopbyptopcxptopcyvaxvaynbxnbyconcaver   edge1s=                                                                r(   r   zRectKey._draw_dish_key_border  s    LI q!Q 	8AB1B1Q3wQqS\QqS\QZQZbB7Bbebem$B  frF{*b0!"$'(  x6I67!	8& q!A#q! U	AQBQBQwaQBQwaBQ%CQ%CbBQ%CQ%CbBQ%CQ%CbBQ%CQ%CAqTFqTFAqTFqTFAqTFqTF aBaBQwaaBQwa _F a(F _F a(F _F a(F6/C6/C6/CVO$C#gC'#-G &&f';),v(<),v(<),v(<>C AX[!11E#C##C<+d*;<#C##C=+e*<=MM3 JJsC JJsC KK1r!ubeRUBqE2a5AJJsC JJvv&

66*JJvv&JJvv&MMOGGIAIDkU	r)   c                     g }| j                         }| j                  j                  |      }| j                         }|rt	        |      dk(  rt
        j                  j                  r| j                  dz  }| j                  ||d      }|j                         }|d   t        z  |d   t        z  f}| j                  ||j                  |j                  f      \  }}	t        |j                   |z         }
t        |j"                  |	z         }| j%                         }|j'                  ||
||f       | j(                  t
        j*                  s| j-                         }| j                  }| j                  ||d      }|j                         }|d   t        z  |d   t        z  f}| j/                  ||j                  |j                  f      \  }}	t        |j                   |z         }
t        |j"                  |	z         }| j%                         }|j'                  ||
||f       | j1                         }|r| j                  }| j                  ||d      }|j                         }|d   t        z  |d   t        z  f}| j3                  ||j                  |j                  f      \  }}	t        |j                   |z         }
t        |j"                  |	z         }| j5                         }|j'                  ||
||f       |S )Nr   r   r   r   )get_label_rectr2   log_to_canvas_rectget_secondary_labelr   r@   keyboardshow_secondary_labelsr7   r:   get_sizePangoUnscalealign_secondary_labelr   r   r   rv   rw   get_secondary_label_colorr  popup_idxid_mode_get_popup_indicatoralign_popup_indicator	get_labelalign_labelget_label_color)r'   runslog_rectr   rr   r7   r9   src_sizexalignyalignrv   rw   r   s                r(   get_label_runszRectKey.get_label_runs  s   &&(ll55h? ((*u:???00,I**5)Q?F(H l2HQK,4NOH!771<0NPNFFKMMF*+AKMMF*+A113DKKAt,- }}$--/EI**5)Q?F(H l2HQK,4NOH!772=--1OQNFFKMMF*+AKMMF*+A113DKKAt,-  I**5)Q?F(H l2HQK,4NOH!--h1<0NPNFFKMMF*+AKMMF*+A'')DKKAt,-r)   c                     | j                   }|sHd}d}d}d}|D ]4  }| j                  ||d      }|j                         d   }|||k  s1|}|}6 || _         |S )z
        Find the shortest ellipsis possible with the current font.
        The font is assumed to never change during the livetime of the key.
        )u   …z...逖 Nr   r   r   )rQ   r:   r>  )r'   resultlabelsBASE_FONTDESCRIPTION_SIZEwminrr   r9   r   s           r(   rD  zRectKey._get_popup_indicator,  s    
 &&#F(0%DF #..u6OQRSOO%a(<1t8D"F# %+D!r)   c                    | j                   dk(  s| j                  sy | j                         }|sy | j                         }| j	                  |      D ]  \  }}}}|rD| j                         r4t        j                  | || j                         | j                                |D ]R  \  }	}
}}|rt        |g| }|j                  |
|z   ||z           |j                  |  t        j                  ||	       T  y )Nr   )r7   
show_labelrN  r   _label_iterationsis_dwellingr   r   get_dwell_progress_canvas_rectget_dwell_progress_colorr   r  r   r   show_layout)r'   r2   r   rI  r   dxdylumlastr9   rv   rw   r   s                r(   r   zRectKey.draw_labelB  s     >>Qdoo""$""$!%!7!7!< 	8BC((*""4#'#F#F#H#'#@#@#BD '+ 8"1d#C/$/DBB/'''.&&w78	8r)   c           	      (   | j                   r| j                  sy| j                         }| j                  j	                  |      }|j
                  dk  s|j                  dk  ry| j                  |j
                  |j                        }|sy|j                         |j                         f}| j                  ||j
                  |j                  f      \  }}| j                         }	| j                         }
| j                  |      D ]  \  }}}}|rD| j                         r4t        j                   | || j#                         | j%                                |rt'        |g|
 }n|	}|j!                  ||j)                  ||z   ||z         |        y)z
        Draws the key's optional image.
        Fixme: merge with draw_label, can't do this for 0.99 because
        the Gdk.flush() workaround on the nexus 7 might fail.
        Nr   )image_filenames
show_imager9  r2   r:  r   r   	get_image	get_width
get_heightrG  rH  r   rW  rX  r   r   rY  rZ  r   offset)r'   r2   r   rJ  rn   pixbufrK  rL  rM  
label_rgbar   r\  r]  r^  r_  r   s                   r(   r   zRectKey.draw_image[  sc    ##4??&&(||..x866A:!/$$&(9(9(;<))(TVVTVV4DE))+
""$!%!7!7!< 	NBC((*""4#'#F#F#H#'#@#@#BD +d+!KKVb[&2+!FM	Nr)   c                 6   | j                   }|Ht        j                  j                  r.| j	                  || j
                  | j                        }|| _         |rA|\  }}|j                  dddd       |j                  ||j                  |j                         y y )Nr   r   )rh   r@   rA   key_shadow_strengthcreate_shadow_surfacerI   rJ   r   mask_surfacerv   rw   )r'   r2   r{   r|   rn   s        r(   draw_shadow_cachedzRectKey.draw_shadow_cached  s    $$=$$88227.2.@.@.2.@.@B (-$!MGT##Cc37  $&&$&&9 r)   c           	      2   | j                         }| j                         }|j                         ryt        |j                  j                  d            }t        dz  | j                         z   }t        j                  j                  |z  }t        j                  j                  dz  }	t        ||	z  d      }
t        ||	z  dz  d      }|t        |      z  |t        |      z  f}|dkD  xr t        j                  j                    }|dz  }t        |d	z  d      }|j#                  |d
   dz   |d   dz         }|r|j%                  |dz        }n|j%                  |
dz        }|j'                         }|j)                         }|j+                  t,        j.                  |j0                  |j2                        }t-        j4                  |      }|j7                          |j9                  |j:                   |j<                           |j>                  |  |jA                          |jC                  t,        j.                         | jE                  ||       |jG                  dddd       |jI                          |jK                         }tM        ||||
|||       |rtM        |||||||       |jO                  t,        jP                         |jG                  dddd       | jE                  ||       |jI                          |jS                          ||fS )z
        Draw shadow and shaded halo.
        Somewhat slow, make sure to cache the result.
        Glitchy, if the clip-rect covers only a single button (Precise),
        therefore, draw only with unrestricted clipping rect.
        Nr   r   g      4@r   gp=
ף?r   g)\(?g       @r   g      ?g?r   )*r   r   is_emptyr   r2   r   r   r   r@   rA   rj  key_shadow_sizerD   r   r   windowtransparent_backgroundrf  r   r   r   r   r   CONTENT_ALPHAr   r   r   r   r   rv   rw   	rectangleclippush_group_with_contentr   r   r   	pop_groupr   set_operatorOPERATOR_CLEARr   )r'   r   shadow_stepsshadow_alpharn   r   extentr   shadow_opacityshadow_scaleshadow_radiusshadow_displacementshadow_offsethas_halohalo_opacityhalo_radiusr   r   r|   r2   shapes                        r(   rk  zRectKey.create_shadow_surface  s    ##%##%==?T\\55jABQ1133..BB%&..>>EVl2C8!&<"7$">D-E
:-E
:<  !#PFMM,P,P(P'$.Vc\3/KKa 0 2M!4DQ4FG	!))+*;<I!))-#*=>IMMO	 ((*''(;(;(1Y[[B--( 	9;;,59%''(;(;<.S#s3!!# 	GUD!=.,	P #]L,P 	U112S#s3.	!!r)   c                     | j                   r%|s| j                         }| j                  ||       y|s| j                         }| j	                  ||       y)z' Build cairo path of the key geometry. N)r   get_canvas_path_build_complex_pathr   _build_rect_path)r'   ry   rn   r   s       r(   r   zRectKey._build_canvas_path  sK    ==++-$$R.++-!!"d+r)   c                     t         j                  j                  }| j                         }| j                  j                  |      }t        ||||       y r"   )r@   rA   r   r   r2   r   r   )r'   ry   r   	roundnessr   s        r(   r  zRectKey._build_complex_path  sC    ))::	,,.||99,GRy,7r)   c                 v    t         j                  j                  }|rt        |||       y  |j                  |  y r"   )r@   rA   r   r   rt  )r'   r2   rn   r  s       r(   r  zRectKey._build_rect_path  s2    ))::	GT95Gt$r)   c                 8    t          dz  | j                         z   S )Nr   )r   r   r&   s    r(   r   zRectKey.get_gradient_angle  s    s3w11333r)   c                    | j                  | j                               }| j                  |      \  }}| j                  j	                  |j
                  | j                  d   dz  z
        |z  }| j                  j                  |j                  | j                  d   dz  z
        |z  }||k  rt        |      S t        |      S )zy
        Get the maximum font size that would not cause the label to
        overflow the boundaries of the key.
        r   r   r   )
r9  get_unpressed_rectget_label_base_extentsr2   r   r   label_marginr   r   r   )r'   mod_maskrn   label_widthlabel_heightsize_for_maximum_widthsize_for_maximum_heights          r(   r,   zRectKey.get_best_font_size  s     ""4#:#:#<=11(; 	"\ #',,"D"D'+vv0A0A!0DQ0F'F#I$/#0 #',,"D"D&*fft/@/@/CA/E&E#H$0#1 "$;;-...//r)   c                     | j                   j                  |      }|s.| j                  | j                               }|| j                   |<   |S )L
        Update resolution independent extents of the label layout.
        )r%   rs   calc_label_base_extentsrF  r'   r  extentss      r(   r  zRectKey.get_label_base_extents
  sI     %%))(3224>>3CDG,3D)r)   c                    t        j                         }t        j                  |      }d}| j	                  |||       |j                         \  }}|xs d}|xs d}|t        j                  |z  z  |t        j                  |z  z  fS )z* Calculate font-size independent extents. rP  r   )r   r4   r   r3   r5   r>  SCALE)r'   rr   ry   r9   rS  r   r   s          r(   r  zRectKey.calc_label_base_extents  s    ""$b!$,!!!&%1JK 1HHEKK";;<EKK";;<= 	=r)   c                     i | _         y)z
        Cached label extents are resolution independent. Calling this
        is only necessary when the system font dpi change.
        N)r%   r&   s    r(   invalidate_label_extentsz RectKey.invalidate_label_extents!  s    
 !r)   c                 V   | j                   sy| j                  r-t        j                  | j                   v rt        j                  }nt        j                  }| j                   j                  |      }|sy| j                  si | _        i | _        | j                  j                  |      }| j                  j                  |      }|r"|d   t        |      k7  s|d   t        |      k7  rd}t        j                  |      }|rat        j                  dj                  |             	 t        j                  |||      }|r#t        |      t        |      f| j                  |<   || j                  |<   |S # t         $ r+}t        j#                  dt%        |      z          Y d}~ed}~ww xY w)z
        Get the cached image pixbuf object, load image
        and create it if necessary.
        Width and height in canvas coordinates.
        Nr   r   zloading image '{}'zget_image(): )ra  active	ImageSlotACTIVENORMALrs   rd   re   r   r@   get_image_filename_loggerdebugformatPixBufScaledfrom_file_and_size	Exceptionerrorr   )	r'   widthheightr8   image_filenamerg  sizefilenameexs	            r(   rc  zRectKey.get_image(  ss    ##;;9++t/C/CC##D##D--11$7!!!#D)+D&##''-))--d37c%j DGs6{$:F00@H299(CDE)**8UFC  8;E
CK7PD..t4'-Dt$ ! EMM/KO"CDDEs   'E4 4	F(=!F##F(c              #     K   | j                         }|t        j                  k(  r| j                         dk7  r|r| j	                         }d}d}| j                         }|j                  j                  |t        |      z        }|j                  j                  |t        |      z        }t        t        t        |            |      }t        t        t        |            |      }|dz  }	|||	 df | | |	df d y w)Nr   g?r   g      ?F)r   r   r   T)r   r   r   r   r   r   r2   r   r   r   r   r   r   round)
r'   r   r   r   d
max_offsetr   xoyoluminosity_factors
             r(   rW  zRectKey._label_iterationsU  s     224#((?>>v%/'')DAJ++-E33AE
NCB33AE
NCBSr^Z0BSr^Z0B /$ 6 b,,e33 #s-u44 s   DDr   N)NN)(rN   rO   rP   rd   re   rh   r$   r]   ra   r_   rf   r`   rl   r}   rt   r   r   r   r   r   r   r   r   rN  rD  r   r   rm  rk  r   r  r  r   r,   r  r  r  rc  rW  __classcell__ro   s   @r(   rU   rU   o   s    M O ! ($%"( !XX !
::,\aFqf7r,82#NJ:F"P	,8%402	
=!+Zr)   rU   c                   $    e Zd ZdZd ZddZd Zy)FixedFontMixinz& Font size independent of text length c                 t    | j                  | j                  | j                         j                         d      S )zu
        Get the maximum font size that would not cause the label to
        overflow the height of the key.
        T)calc_font_sizer2   get_fullsize_rectr>  )r'   r  s     r(   r,   z!FixedFontMixin.get_best_font_sizes  s5    
 ""4<<#'#9#9#;#D#D#F#') 	)r)   c                    | j                  d      \  }}|j                  |d   | j                  d   dz  z
        |z  }|j                  |d   | j                  d   dz  z
        |z  }|}|r||k  r|}t	        |dz        S )z4 Calculate font size based on the height of the key r   r   r   g?)r  r   r  r   r   )	r'   r2   r  	use_widthr  r  r  r  r7   s	            r(   r  zFixedFontMixin.calc_font_size|  s    
 %)$?$?$B!\")"?"?&*1g0A0A!0DQ0F&F#I$/#0 #*"?"?&*1g0A0A!0DQ0F&F#I#/#0 ,	/);.I9s?##r)   c                     | j                   j                  |      }|s | j                  d      }|| j                   |<   |S )r  Mg)r%   rs   r  r  s      r(   r  z%FixedFontMixin.get_label_base_extents  sB     %%))(32248G,3D)r)   NF)rN   rO   rP   __doc__r,   r  r  r/   r)   r(   r  r  p  s    0)$*	r)   r  c                   >     e Zd Z fdZ fdZ fdZd Zd Z xZS )WordlistKeyc                 :    t         t        |          }|dk(  rd}|S )Nr   r   )rk   r  r   )r'   stylero   s     r(   r   zWordlistKey.get_style  s#    k424F?Er)   c                 @    t         t        |          }t        |d      S )Ng333333?)rk   r  r   r   r'   valuero   s     r(   r   zWordlistKey.get_stroke_width  s    k49;5#r)   c                 @    t         t        |          }t        |d      S )Ng333333?)rk   r  r   r   r  s     r(   r   zWordlistKey.get_stroke_gradient  s    k4<>5#r)   c                     dt         z  dz  S )Ng333333ӿ   )r   r&   s    r(   r   zWordlistKey.get_light_direction  s    by3r)   c                      y r"   r/   )r'   r2   s     r(   rm  zWordlistKey.draw_shadow_cached  s    r)   )	rN   rO   rP   r   r   r   r   rm  r  r  s   @r(   r  r    s    

r)   r  c                   &     e Zd Zd fd	Zd Z xZS )FullSizeKeyc                 .    t         t        |   ||       y r"   )rk   r  r$   r'   rZ   r[   ro   s      r(   r$   zFullSizeKey.__init__  s    k4)"k:r)   c                 "    | j                         S )z) Get bounding box in logical coordinates )r  r&   s    r(   get_rectzFullSizeKey.get_rect  s     %%''r)   r  )rN   rO   rP   r$   r  r  r  s   @r(   r  r    s    ;(r)   r  c                   J     e Zd Zd fd	Zej
                  fdZd Zd Z xZ	S )BarKeyc                 .    t         t        |   ||       y r"   )rk   r  r$   r  s      r(   r$   zBarKey.__init__  s    fd$R5r)   c                     | j                   s| j                  s| j                  r| j                  ||       | j	                  ||       | j                  ||       y r"   )pressedr  scannedr   r   r   )r'   r2   r   s      r(   r   zBarKey.draw  sA    <<4;;$,,w,%%r)   c                      y)NFr/   r&   s    r(   can_show_label_popupzBarKey.can_show_label_popup  s    r)   c                      yNr   r/   r&   s    r(   r   zBarKey.get_stroke_width  s     r)   r  )
rN   rO   rP   r$   r   r   r   r  r   r  r  s   @r(   r  r    s     6 #&(( &r)   r  c                         e Zd Zd fd	Z xZS )WordKeyc                 .    t         t        |   ||       y r"   )rk   r  r$   r  s      r(   r$   zWordKey.__init__  s    gt%b+6r)   r  )rN   rO   rP   r$   r  r  s   @r(   r  r    s    7 7r)   r  c                   `     e Zd ZdZddZd Zd Zd Z fdZd Z	d Z
d	 Zedd
       Z xZS )InputlineKeyr   c                 N    t         j                  | ||       g | _        d| _        y r  )rU   r$   
word_infos_xscrollrY   s      r(   r$   zInputlineKey.__init__  s"    r;/r)   c                     || _         || _        || _        | j                          t	        j
                  |d      }|t        j                  j                  k7  | _        y )Nr<   )	liner  cursorr_   r   find_base_dir	DirectionRTLltr)r'   r  r  r  dirs        r(   set_contentzInputlineKey.set_content  sM    	$ !!$+%//---r)   c                    | j                         \  }}}}|j                  dz  }t        |d      }| j                         }|j	                           |j
                  |  |j                           |j                  |   |j                  |  t        j                  ||       |j                          |j                  |j                  |j                         |j                  d|j                          |j                  |  |j                  |       |j!                          |j#                  t%        j&                                y )Ng333333?r   r   )_calc_layout_paramsr   rD   rH  r   rt  ru  r   r  r   r[  r   rv   rw   rel_line_tor   r   set_attributesr   AttrList)	r'   r2   r   r9   rn   cursor_rect
layout_poscursor_widthrh  s	            r(   r   zInputlineKey.draw_label  s   040H0H0J-k:"}}u,<-))+
4  	 ,$w/ 	{}}5A{}}-,|, 	enn./r)   c                     | j                         \  }}| j                  || j                        }|j                  |       |j	                  d       |S )NT)_build_layout_contentsr:   r7   r  set_auto_dir)r'   r6   attrsr9   s       r(   
get_layoutzInputlineKey.get_layout	  sK    113e&&tT^^<e$D!r)   c                 H    t         t        |          }|j                         S r"   )rk   r  get_canvas_label_rectr   rm   s     r(   r  z"InputlineKey.get_canvas_label_rect  s    \4>@xxzr)   c                 B   | j                   dz   }d }d}d}d}d}d}| j                  }t        |      D ]:  \  }	}
| j                  |
j                  k(  }d }d }	 |
j                  r|}||
j                  |
j                   }t        j                  |      }|s|r/d}|r|dz  }|r|d	|z   d
z   dz   z  }||z  }|r|dz  }|r|dz  }|}n|}|	dk(  r(|d |
j                   }|t        j                  |      z  }n9||	dz
     }||j                  |
j                   }|t        j                  |      z  }||z  }|	t        |      dz
  k(  s||
j                  d  }|t        j                  |      z  }= t        j                  |dd      }t        |      dk(  r|\  }}}}||fS )N z#00FFFFz#00AA00z#00FF00z#FF0000r   r   z<b>z<span underline_color='z' zunderline='error'>z</span>z</b>r   r<    r    )r  r  r   r  endignoredexact_matchpartial_matchspelling_errorsstartr   markup_escape_textr   r   parse_markup)r'   r6   r  color_ignoredcolor_partial_matchcolor_no_matchcolor_errormarkupwisr	  wicursor_at_word_endpredict_colorspell_colorwordspanr   introwiprevgap	remainderrQ  okr  s                           r(   r  z#InputlineKey._build_layout_contents  s   		C (''' oos^ 9	=EAr!%!6 !MK !!) 266*D**40D EMD5CdJ!56 6DI%D FND AvYbhh$11%88 QqS6::1$11#66 dNFCHqL  M	$11)<<s9	=v ##FB5v;!%+"BtUU{r)   c                    | j                         }| j                         }|j                         }| j                  ||j                  |j
                  f| j                        \  }}| j                  || j                  | j                        }|j                  |      \  }}|}	t        |	j                  |	j                  |	j                  |	j                        j                  dt         j"                  z        }
| j%                  |||
|       |j                  |z   | j&                  z   }|j                  |z   }|
xj                  |z  c_        |
xj                  |z  c_        |||
||ffS )Nr   )r   r  get_pixel_sizerG  r   r   r  cursor_to_layout_indexr  get_cursor_posRectrv   rw   r  r  r   r   r  _update_scroll_positionr  )r'   r9   rn   	text_sizerL  rM  cursor_index
strong_posweak_posposr  xlayoutylayouts                r(   r  z InputlineKey._calc_layout_paramsf  s*   " ))+))+	)))dffdff5EtxxP 2264;;Q%44\B
H355#%%CJJ?EEcEKKFWX 	$$T9k6J&&6/DMM1&&6/  t[7G*<<<r)   c                     | j                   }||z   }|j                  ||z   |d   z   z
  }|dkD  s|dkD  rd}||j                  z    }||j                  z   |j                  z
  }	||z
  dkD  r|}|	|z   dkD  r|	 }|| _         y )Nr   r   )r  r   rv   )
r'   
label_rectr%  r  rL  xscroll	gap_begingap_end
over_beginover_ends
             r(   r$  z$InputlineKey._update_scroll_position~  s    -- W$	LLFW$4y|$CDq=GaKG -.
-
<#% Gg#iGr)   c                 v   g }d}| j                         }	 |j                  |j                                |j                         sn1|r7t	        |      dk(  rd}|S |dk  rd}|S |t	        |      k\  r|d   }|S ||   }|S t	        |      dk(  rd}|S |dk  r|d   }|S |t	        |      k\  rd}|S ||dz       }|S )z; Translate unicode character position to pango byte index. r   r<   r   )get_iterr  	get_index	next_charr   )r9   r  r  indexesr	  iterr&  s          r(   r!  z#InputlineKey.cursor_to_layout_index  s     NN4>>+,>># 
 7|q  " ! !   3w<'&r{   'v  7|q    !&r{  3w<'    '{3r)   r  r  )rN   rO   rP   r  r$   r  r   r   r  r  r  r$  rR   r!  r  r  s   @r(   r  r    sF    F
.06Pd=0 (  r)   r  c                   L    e Zd ZdZdZdZdZdZdZe	d        Z
d Zd Zd Zd Zy)	r  zD
    Workaround for blurry images when window_scaling_factor >1
    Nr   c                 @    t               }|j                  | ||       |S r"   )r  _load)r  r  r  rg  s       r(   r  zPixBufScaled.from_file_and_size  s    Xuf-r)   c                     | j                   S r"   )_widthr&   s    r(   rd  zPixBufScaled.get_width  s    {{r)   c                     | j                   S r"   )_heightr&   s    r(   re  zPixBufScaled.get_height  s    ||r)   c                 P   t         j                  }||z  }||z  }t        j                  j	                  |||      | _        | j
                  j                         | _        | j
                  j                         | _	        | j                  |z  | _
        | j                  |z  | _        y r"   )r@   window_scaling_factorr   Pixbufnew_from_file_at_size_pixbufrd  _real_widthre  _real_heightr=  r?  )r'   r  r  r  r   
load_widthload_heights          r(   r;  zPixBufScaled._load  s    ,,U]
un ''))(JL 	<<113 LL335&&.((50r)   c                    |j                          |j                  |j                  |j                         t        j
                  }|r|dk7  r|j                  d|z  d|z         t        j                  || j                  dd       |j                         } |j                  |  |j                  |       |j                          y)zq
        Draw the image in the theme's label color.
        Only the alpha channel of the image is used.
        r   r   N)r   r   rv   rw   r@   rA  r   r   cairo_set_source_pixbufrD  
get_sourcer   maskr   )r'   r2   rn   r   r   patterns         r(   r   zPixBufScaled.draw  s    
 	$&&$&&),,Uc\MM#+sU{3##GT\\1a@$$&&Wr)   )rN   rO   rP   r  rD  r=  r?  rE  rF  rR   r  rd  re  r;  r   r/   r)   r(   r  r    sH     GFGKL 

1r)   r  )1
__future__r   r   r   mathr   r   r   r	   r   Onboard.Versionr
   gi.repositoryr   r   r   r   r   Onboard.KeyCommonOnboard.WindowUtilsr   Onboard.utilsr   r   r   r   r   r   r   logging	getLoggerr  Onboard.Configr   r@   r  r?  r#   r   rW   rU   r  r  r  r  r  InputlineKeyCommonr  r  r/   r)   r(   <module>rY     s   2 B A # #  /   A A ! -C C C 
'

H
% "	 U[[ 7D) 7Dt~c=- ~B* *Z' 6(+ ([ (7nf 7
U>7,> Up3 3r)   