
    cc.                     F    d dl Z d dlmZmZ  G d de      Z G d d      Zy)    N)GtkGdkc                        e Zd Z fdZ xZS )WrongToolIdExceptionc                 Z    t        d      }t        | 	  |j                  ||             y )Nz<Can't start operation: wrong tool id (expected {0}, got {1}))_super__init__format)selfexpectedactualmsg	__class__s       7/usr/lib/python3/dist-packages/drawing/abstract_tool.pyr
   zWrongToolIdException.__init__   s&    	
HI#'3::h/0    )__name__
__module____qualname__r
   __classcell__)r   s   @r   r   r      s    1 1r   r   c                   d   e Z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 Z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 Z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% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6d4 Z7d5 Z8d;d6Z9d7 Z:d8 Z;d9 Z<y:)<AbstractAbstractToolz2Super-class implemented and extended by all tools.z'/com/github/maoschanz/drawing/tools/ui/c                     || _         || _        d| _        |x| _        | _        d| _        || _        d| _        d| _        d| _	        d| _
        d| _        g | _        | j                          y )Nr    Fcell)windowidmenu_idlabel_mnemo_label_mnemo_char
_icon_nameaccept_selection	use_coloruse_operatorcursor_name_ongoing_operation_modifier_keystry_build_pane)r   tool_idr   	icon_namer   kwargss         r   r
   zAbstractAbstractTool.__init__#   sp    $+$'$,#(($*t $$/$$.$$!$$r   c                 <    | j                   j                  ||       y)zConvenient wrapper method adding a stateless action to the window. It
		will be named 'action_name' (string) and activating the action will
		trigger the method 'callback'.N)r   add_action_simple)r   action_namecallbacks      r   add_tool_action_simplez+AbstractAbstractTool.add_tool_action_simple9   s    
 ++X6r   c                 P    | j                   j                  j                  ||       y N)r   options_manageradd_option_booleanr   r/   defaults      r   add_tool_action_booleanz,AbstractAbstractTool.add_tool_action_boolean@   s    ++00gFr   c                 P    | j                   j                  j                  ||       y r3   )r   r4   add_option_enumr6   s      r   add_tool_action_enumz)AbstractAbstractTool.add_tool_action_enumC   s    ++--k7Cr   c                 R    | j                   j                  }|j                  ||      S r3   )r   r4   add_option_from_bool_keyr   r/   key_nameoms       r   load_tool_action_booleanz-AbstractAbstractTool.load_tool_action_booleanF   $    {{"""		$	$[(	;;r   c                 R    | j                   j                  }|j                  ||      S r3   )r   r4   add_option_from_enum_keyr>   s       r   load_tool_action_enumz*AbstractAbstractTool.load_tool_action_enumJ   rB   r   c                 L    | j                   j                  j                  |      S r3   )r   r4   	get_value)r   r/   s     r   get_option_valuez%AbstractAbstractTool.get_option_valueN   s    		$	$	.	.{	;;r   c                 X    | j                   j                  |      j                  |       y r3   )r   lookup_actionset_enabled)r   r/   states      r   set_action_sensitivityz+AbstractAbstractTool.set_action_sensitivityQ   s    ++K(44U;r   c                 ,   | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  dd       | j                  dd       y )N
main_colorsecondary_colorexchange_colorcairo_operatorcancel_transformFapply_transform)rM   r$   r%   r   s    r   update_actions_statez)AbstractAbstractTool.update_actions_stateT   sy    lDNN;/@.?.0A0AB0%8/7r   c                 B    | j                   j                  j                  S r3   )r   r4   _tools_gsettingsrU   s    r   get_settingsz!AbstractAbstractTool.get_settings]   s    		$	$	5	55r   c                 :   g }|t         j                  j                  z  t         j                  j                  k(  r|j                  d       |t         j                  j                  z  t         j                  j                  k(  r|j                  d       || _        y )NSHIFTALT)r   ModifierType
SHIFT_MASKappend	MOD1_MASKr(   )r   event_statemodifier_keyss      r   update_modifier_statez*AbstractAbstractTool.update_modifier_state`   su    -C$$///C4D4D4O4OO C$$...33C3C3M3MM%$r   c                 :    | j                   j                  |       y r3   )r   reveal_message)r   
error_texts     r   
show_errorzAbstractAbstractTool.show_errorl   s    ++Z(r   c                      y r3    )r   event_xevent_ymotion_behaviors       r   get_tooltipz AbstractAbstractTool.get_tooltipo       	r   c                      y r3   ri   rU   s    r   r)   z#AbstractAbstractTool.try_build_paneu       r   c                      y r3   ri   rU   s    r   build_bottom_panez&AbstractAbstractTool.build_bottom_panex   rn   r   c                      y r3   ri   r   argss     r   !on_apply_transform_tool_operationz6AbstractAbstractTool.on_apply_transform_tool_operation{   rp   r   c                      y r3   ri   rt   s     r   "on_cancel_transform_tool_operationz7AbstractAbstractTool.on_cancel_transform_tool_operation~   rp   r   c                     t        d      S )Nz
No options)r   rU   s    r   get_options_labelz&AbstractAbstractTool.get_options_label   s    	
<r   c                      y r3   ri   )r   available_widths     r   adapt_to_window_sizez)AbstractAbstractTool.adapt_to_window_size   rp   r   c                 V    |j                  | j                  d| j                  z          y )Nzwin.active_tool::)r_   r    r   )r   
tools_menus     r   add_item_to_menuz%AbstractAbstractTool.add_item_to_menu   s"    D%%':TWW'DEr   c                     | j                   dz   | j                  z   dz   }t        j                  j	                  |      }|j                  d      S )zReturns a Gio.MenuModel corresponding to the tool's options. It'll be
		shown in the menubar (if any) and in the bottom pane (if the tool's
		bottom pane supports such a feature).ztool-z.uizoptions-menu)UI_PATHr   r   Buildernew_from_resource
get_object)r   fpathbuilders      r   get_options_modelz&AbstractAbstractTool.get_options_model   sE     ,,
 477
*U
2%KK))%0'			N	++r   c                      y)zReturns a Gtk.Widget (normally a box) corresponding to the tool's
		options. It'll be in the bottom pane (if the tool's bottom pane supports
		such a feature) in replacement of the Gio.MenuModel if such a simple
		menu can't provide all the features.Nri   rU   s    r   get_options_widgetz'AbstractAbstractTool.get_options_widget   s    
 
r   c                     | j                   gS r3   )r   rU   s    r   get_editing_tipsz%AbstractAbstractTool.get_editing_tips   s    
**r   c                 x    | j                   j                  |d|z   d      | _        |j                         | _        y )Nr      )r   replacer    upperr!   )r   	characters     r   set_mnemonicsz"AbstractAbstractTool.set_mnemonics   s0    jj((C)OQG$__&$r   c                 0   | j                   j                  j                  d      rt        j                  j
                  }nt        j                  j                  }t        j                         j                  | j                  |      }t        j                  t        j                  j                  dd      | _        | j                  j                  |       t        j                  d| j                         }| j                  j                  |       | j                  j#                          t        j                  dd| j$                  z         }| j                  j                  |       |j                  | j                         | j                  j'                         | _        | j$                  dk(  r&| j(                  j+                  | j,                         y
| j,                  dz   | j$                  z   d	z   }| j(                  j+                  |       y
)z-Build the icon and its label for the sidebar.	big-icons   )orientationspacingmarginT)use_underliner   r   r   z (Alt+)N)r   	gsettingsget_booleanr   IconSizeLARGE_TOOLBARSMALL_TOOLBARImagenew_from_icon_namer"   BoxOrientation
HORIZONTAL
_label_boxaddLabelr    show_allr!   
get_parent	_fb_childset_tooltip_textr   )r   flowboxsizeimagelabel_widget
mini_labeltooltips          r   build_flowbox_childz(AbstractAbstractTool.build_flowbox_child   sp    
[[&&{3
,,
$
$4
,,
$
$4
))+
(
($
?%GG))
$/
 //e T5F5FG,//l#// yyt39I9I3IJ*//j!	++doo??--/$. 
>>""4::.ZZ("T%5%55;7>>""7+r   c                 b    | j                   j                  j                  | j                         y r3   )r   tools_flowboxselect_childr   rt   s     r   select_flowbox_childz)AbstractAbstractTool.select_flowbox_child   s    ++((8r   c                 6    | j                   j                         S r3   )r   is_selectedrU   s    r   is_flowbox_child_selectedz.AbstractAbstractTool.is_flowbox_child_selected   s    		#	#	%%r   c                 D   | j                   j                         d   }|j                  |       | j                   j                         d   }|r*|j                  t        j
                  j                         y |j                  t        j
                  j                         y )Nr   r   )r   get_childrenset_visible
set_halignr   AlignSTARTCENTER)r   label_visibler   icons       r   set_show_labelz#AbstractAbstractTool.set_show_label   sk    --/2,=)		%	%	'	*$??399??#??399##$r   c                 *   | j                   j                         d   }| j                  j                  j	                  d      rt
        j                  j                  }nt
        j                  j                  }|j                  | j                  |       y )Nr   r   )r   r   r   r   r   r   r   r   r   set_from_icon_namer"   )r   r   r   s      r   update_icon_sizez%AbstractAbstractTool.update_icon_size   sc    
//
&
&
(
+%	[[&&{3
,,
$
$4
,,
$
$44??D1r   c                 :   | j                   dk(  ry | j                  j                         d   }|j                         ry | j                  j                         d   }| j                  j                         d   }|j	                  |        |j	                  |       y )Nr   r   r      )r!   r   r   get_visibler   )r   should_showr   r   r   s        r   show_only_mnemonicsz(AbstractAbstractTool.show_only_mnemonics   s    		--/2,	
//
&
&
(
+%++-a0*O$%r   c                      y r3   ri   rU   s    r   on_tool_selectedz%AbstractAbstractTool.on_tool_selected   rp   r   c                      y r3   ri   rU   s    r   on_tool_unselectedz'AbstractAbstractTool.on_tool_unselected   rp   r   c                     | j                          | j                  | j                         | j                          | j	                          | j                          d| _        y)zdReset the current tool when 'undo' is pressed while an operation has
		been started but not applied.FN)r   give_back_controlr#   r   restore_pixbufnon_destructive_show_modifr'   rU   s    r   cancel_ongoing_operationz-AbstractAbstractTool.cancel_ongoing_operation   sP     ../!!#!$r   c                 D    | j                          | j                          y)zReset the tool's state well enough to allow for a new tool to start.
		It should include unselecting/applying the selection if the next tool
		doesn't support it.N)r   r   )r   preserve_selections     r   r   z&AbstractAbstractTool.give_back_control   s     !!#r   c                     | j                   S r3   )r'   rU   s    r   has_ongoing_operationz*AbstractAbstractTool.has_ongoing_operation  s    		 	  r   c                      y r3   ri   r   	operations     r   do_tool_operationz&AbstractAbstractTool.do_tool_operation  rp   r   c                     |d   | j                   k7  rt        |d   | j                         | j                          d| _        y )Nr*   T)r   r   r   r'   r   s     r   start_tool_operationz)AbstractAbstractTool.start_tool_operation  s=    yTWW$	i	2DGG	<< $r   c                     | j                  |       | j                         j                          | j                         j                          y)z{Complete method to apply an operation: the operation is applied and
		the image is updated as well as the state of actions.N)simple_apply_operation	get_imagerV   update_history_sensitivityr   s     r   apply_operationz$AbstractAbstractTool.apply_operation  s8     i(..'')..--/r   c                     	 | j                  |       | j                         j                  |       d| _        | j                          y# t        $ r$}| j	                  t        |             Y d}~@d}~ww xY w)z?Simpler apply_operation, for the 'rebuild from history' method.NF)r   r   add_to_history	Exceptionrg   strr'   r   )r   r   es      r   r   z+AbstractAbstractTool.simple_apply_operation  se    )$>>""9- "$!!# 
 ??3q6s   0A
 
	A7A22A7c                 6    | j                         j                  S r3   )r   	selectionrU   s    r   get_selectionz"AbstractAbstractTool.get_selection%  s    			#	##r   c                 6    | j                         j                  S r3   )r   	is_activerU   s    r   selection_is_activez(AbstractAbstractTool.selection_is_active(  s    					'	''r   c                 >    | j                         j                         S r3   )r   
get_pixbufrU   s    r   get_selection_pixbufz)AbstractAbstractTool.get_selection_pixbuf+  s    					(	(	**r   c                 <    d| j                         j                  z  S )Nr   )r   
zoom_levelrU   s    r   get_overlay_thicknessz*AbstractAbstractTool.get_overlay_thickness.  s    
dnn))
)*r   c                 6    | j                   j                         S r3   )r   get_active_imagerU   s    r   r   zAbstractAbstractTool.get_image4  s    		%	%	''r   c                 >    | j                         j                         S r3   )r   get_surfacerU   s    r   r   z AbstractAbstractTool.get_surface7  s    			%	%	''r   c                 6    | j                         j                  S r3   )r   SCALE_FACTORrU   s    r   scale_factorz!AbstractAbstractTool.scale_factor:  s    			&	&&r   c                 H    t        j                  | j                               S r3   )cairoContextr   rU   s    r   get_contextz AbstractAbstractTool.get_context=  s    	t'')	**r   c                 6    | j                         j                  S r3   )r   main_pixbufrU   s    r   get_main_pixbufz$AbstractAbstractTool.get_main_pixbuf@  s    			%	%%r   c                 @    | j                         j                          y r3   )r   updaterU   s    r   r   z/AbstractAbstractTool.non_destructive_show_modifC  s    ..r   c                 @    | j                         j                          y r3   )r   use_stable_pixbufrU   s    r   r   z#AbstractAbstractTool.restore_pixbufF  s    ..$$&r   c                      y r3   ri   r   eventsurfacerj   rk   s        r   on_press_on_areaz%AbstractAbstractTool.on_press_on_areaL  rp   r   c                      y r3   ri   )r   r	  r
  rj   rk   renders         r   on_motion_on_areaz&AbstractAbstractTool.on_motion_on_areaO  rp   r   c                      y r3   ri   )r   r	  r
  s      r   on_unclicked_motion_on_areaz0AbstractAbstractTool.on_unclicked_motion_on_areaR  rp   r   c                      y r3   ri   r  s        r   on_release_on_areaz'AbstractAbstractTool.on_release_on_areaU  rp   r   c                      y r3   ri   )r   areacairo_contexts      r   on_draw_abovez"AbstractAbstractTool.on_draw_aboveX  rp   r   N)T)=r   r   r   __doc____gtype_name__r   r
   r1   r8   r;   rA   rE   rH   rM   rV   rY   rc   rg   rm   r)   rr   rv   rx   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r  r  r  ri   r   r   r   r      s&   9(4,7GD<<<<86&)F,' ,D9&%2
&"$!!0$$(++(('+&'r   r   )r   gi.repositoryr   r   r   r   r   ri   r   r   <module>r     s%   $  "19 1| |r   