
    cc&z                         d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ  G d	 d
      Z G d de      Z ej.                  d       G d dej0                               Zy)    N)GtkGdkGio	GdkPixbufPangoGLib   )DrHistoryManager)DrSelectionManager)DrPropertiesDialog)InvalidFileFormatException) utilities_generic_canvas_outlinec                       e Zd ZdZdZdZdZy)DrMotionBehavior
   r   r	      N)__name__
__module____qualname___LIMITHOVERDRAWSLIP     //usr/lib/python3/dist-packages/drawing/image.pyr   r      s    
	
		r   r   c                        e Zd Z fdZ xZS )NoPixbufNoChangeExceptionc                 @    t        d      }t        | 	  ||z         y )Nz)New pixbuf empty, no change applied to %s)_super__init__)selfpb_namemessage	__class__s      r   r"   z"NoPixbufNoChangeException.__init__"   s     9:''7W$%r   )r   r   r   r"   __classcell__r&   s   @r   r   r   !   s    & &r   r   z)/com/github/maoschanz/drawing/ui/image.ui)resource_pathc                   4    e Zd Zd Zej
                  j                         Zej
                  j                         Zej
                  j                         Z	ej
                  j                         Z
ej
                  j                         ZdZdZdZ 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 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' Z2d( Z3d) Z4d* Z5d+ Z6d, Z7d- Z8d. Z9d/ Z:d0 Z;d1 Z<d2 Z=i fd3Z>d4 Z?d5 Z@d6 ZAd7 ZBd8 ZCd9 ZDd: ZEd; ZFd< ZGd= ZHd> ZIi fd?ZJd@ ZKdA ZLdB ZMdC ZNdD ZOdE ZPdF ZQdG ZRdH ZSdYdIZTdJ ZUdK ZVdL ZWdM ZXdN ZYdO ZZdP Z[dQ Z\dR Z]dS Z^dT Z_dU Z`dV ZadW ZbdX Zc xZdS )ZDrImage      ?      @i  c                     t        |   di | || _        d | _        d | _        d| _        d | _        | j                          | j                  j                  d| j                         | j                  j                  d| j                         d| _        d| _        d| _        | j                  j                  r4d| _        d| _        | j                  j"                  r| j%                          | j'                          | j)                          | j                  j*                  j                  d| j(                         | j-                          | j                  j*                  j                  d| j,                         y )NFcloseresponser   zchanged::ui-background-rgbazchanged::ctrl-zoomr   )r!   r"   windowgfilefilename_waiting_for_monitor_gfile_monitor_can_reloadreload_info_barconnecthide_reload_message_rendering_is_locked_framerate_hint_ctrl_pressed
devel_mode_skipped_frames_fps_countershould_track_frameratereset_fps_counter_init_drawing_area_update_background_color	gsettings_update_zoom_behavior)r#   r1   kwargsr&   s      r   r"   zDrImage.__init__<   s>   'V$+$*$-#$$ w(@(@Az4+C+CD $$$$	[[44
kk((!++ =,0,I,IK ++ 4/3/I/IKr   c                 $   | j                   j                  t        j                  j                  t        j                  j
                  z  t        j                  j                  z  t        j                  j                  z  t        j                  j                  z  t        j                  j                  z         | j                   j                  d| j                         | j                   j                  d| j                         | j                   j                  d| j                         | j                   j                  d| j                         | j                   j                  d| j                         | j                   j                  d| j"                         | j$                  j                  d| j"                         | j                   j                  d| j&                         | j                   j                  d| j(                         y )	Ndrawzmotion-notify-eventbutton-press-eventzbutton-release-eventzscroll-eventzvalue-changedzenter-notify-eventzleave-notify-event)_drawing_area
add_eventsr   	EventMaskBUTTON_PRESS_MASKBUTTON_RELEASE_MASKPOINTER_MOTION_MASKSMOOTH_SCROLL_MASKENTER_NOTIFY_MASKLEAVE_NOTIFY_MASKr8   on_drawon_motion_on_areaon_press_on_areaon_release_on_areaon_scroll_on_area_h_scrollbaron_scrollbar_value_change_v_scrollbaron_enter_imageon_leave_imager#   s    r   rB   zDrImage._init_drawing_areaa   s   ==""==$$%==$$% ==##$ ==""	#
 ==""#$ VT\\2 2D4J4JK143H3HI3T5L5LM ^T-C-CDOT-K-KLOT-K-KL 143F3FG143F3FGr   c                     | j                   j                  j                  d      }t        |d         t        |d         t        |d         t        |d         f| _        y )Nzui-background-rgbar   r	   r      )r1   rD   get_strvfloat_bg_rgba)r#   argsrgbas      r   rC   z DrImage._update_background_color}   sQ    				'	'(<	=$a>5a>+0a>5a>K$-r   c                 X    | j                   j                  j                  d      | _        y )Nz	ctrl-zoom)r1   rD   get_boolean_ctrl_to_zoomr#   rc   s     r   rE   zDrImage._update_zoom_behavior   s    {{,,88E$r   c                 &   d| _         d| _        d| _        d| _        t        j
                  | _        d| _        d| _        d| _	        d| _
        t        |       | _        t        |       | _        | j                  dd       | j                  dd       y)zRPart of the initialization common to both a new blank image and an
		opened image.Fr   r,   g        undoredoN)_is_pressedscroll_xscroll_y
zoom_levelr   r   motion_behavior_slip_press_x_slip_press_y_slip_init_x_slip_init_yr   	selectionr
   _historyset_action_sensitivityr]   s    r   _init_image_commonzDrImage._init_image_common   s     $ $-$-$/)//$$$$$ &d+$. #4($-fe,fe,r   c                     | j                          | j                  j                  |d ||       | j                          y N)rx   rv   set_initial_operationrestore_last_state)r#   widthheightbackground_rgbas       r   init_backgroundzDrImage.init_background   s2    --%%otUFKr   c                     | j                          | j                  |       | j                          | j                          y rz   )rx   _load_pixbuf_commonr|   update_title)r#   pixbufs     r   try_load_pixbufzDrImage.try_load_pixbuf   s4    6"r   c                 x    t         j                  j                  t         j                  j                  dd||      S )NT   )r   Pixbufnew
ColorspaceRGBr#   whs      r   _new_blank_pixbufzDrImage._new_blank_pixbuf   s-    					i2266aA	FFr   c                 Z    | j                   j                         }| j                  |       y)zvSet the last saved pixbuf from the history as the main_pixbuf. This
		is used to rebuild the picture from its history.N)rv   get_last_saved_state_apply_state)r#   last_saved_pixbuf_ops     r   r|   zDrImage.restore_last_state   s&     ;;=()r   c                     | j                  | j                  j                         | j                  j                          y rz   )r   rv   initial_operationrewind_historyr]   s    r   reset_to_initial_pixbufzDrImage.reset_to_initial_pixbuf   s*    DMM334-- r   c                    |d   }|d   }|d   }| j                  | j                  dd             | j                  j                          t	        j
                  t        j                  j                  ||      | _        ||d   }|j                  }|j                  }|j                  }|j                  }	| j                  | j                  ||             t	        j                  | j                        }
|
j                  ||||	       |
j!                          | j#                          | j%                          y | j                  |d   j'                                | j)                          y )Nr   r}   r~   r	   rd   )set_temp_pixbufr   ru   init_pixbufcairoImageSurfaceFormatARGB32surfaceredgreenbluealphaset_main_pixbufContextset_source_rgbapaintupdateset_surface_as_stable_pixbufcopyuse_stable_pixbuf)r#   state_opr   r}   r~   rd   rgbacairo_contexts              r   r   zDrImage._apply_state   s(   H&
7
%H&t--a34..##ELL$7$7G$,^
6
4xx1zz1yy1zz1..uf=>==.=  Aq!,;;=$$&*//12r   c                 ,   |j                         s|j                  dddd      }| j                  j                  j	                  d      }| j
                  j                  |||j                         |j                                | j                  |       y )NF   zdefault-rgba)
get_has_alpha	add_alphar1   rD   r`   rv   r{   	get_width
get_heightr   )r#   r   r   s      r   r   zDrImage._load_pixbuf_common   sz    				UCc26KK))22>B/--%%ov"("2"2"4f6G6G6IKvr   c                 .   | j                   yt        j                  j                  | j	                               }| j                  |       | j                  j                          | j                          | j                          | j                          y)z'Safely reloads the image from the disk.N)r2   r   r   new_from_fileget_file_pathr   r1   update_picture_titler   r   remember_current_state)r#   disk_pixbufs     r   reload_from_diskzDrImage.reload_from_disk   sm    	ZZ	  ..t/A/A/CD+;'++""$++-r   c                    	 || _         t        j                  j                  | j	                               }| j                          | j                  |       | j                          y # t        $ r}|j                  sd|_        t        |j                  |j                               }| j                  j                  |j                         d | _         | j                  dd      }Y d }~d }~ww xY w)Nz#[exception without a valid message]d   )r2   r   r   r   r   connect_gfile_monitoring	Exceptionr%   r   get_pathr1   reveal_action_reportr   r   r6   )r#   r2   r   exs       r   try_load_filezDrImage.try_load_file   s    
-4:**4+=+=+?@6  " v 
 -
**6BJ"2::u~~/?@2;;##BJJ/4:""3,6-s   AA( (	C01A5C++C0c                     t         j                  j                  }| j                  j	                  |      | _        | j
                  j                  d| j                         y )Nchanged)r   FileMonitorFlagsWATCH_MOUNTSr2   monitorr5   r8   reveal_reload_message)r#   flagss     r   r   z DrImage.connect_gfile_monitoring   sF    



+
+%

**51$i)C)CDr   c                     || _         y rz   )r4   )r#   values     r   set_monitoringzDrImage.set_monitoring  s
    #$r   c                 .   | j                   r(|d   t        j                  j                  k7  rd| _         y | j	                          | j
                  j                  | j                  j                         dkD         | j                  j                  d       y )Nr_   F  T)
r4   r   FileMonitorEventCHANGEDr6   reload_labelset_visibler1   get_allocated_widthr7   rh   s     r   r   zDrImage.reveal_reload_message  sv    	 1g%%--- %D	 ? ? AC GH""4(r   c                 :    | j                   j                  d       y NF)r7   r   rh   s     r   r9   zDrImage.hide_reload_message  s    ""5)r   c                 @    | j                  d| j                  d u       y )Nreload_file)rw   r2   r]   s    r   r6   zDrImage._can_reload  s    mTZZt-CDr   c                    t         j                  j                  dt         j                  j                        }|j                  t         j                  j                         |j                  d| j                         t        j                  | j                               | _        | j                  j                  t        j                  j                          t        j"                         }|j%                  | j                         |j                  d| j&                         t        j(                  t         j*                  j,                  d      }| j.                  j0                  dk(  r+|j3                  |ddd	
       |j5                  |ddd	
       n*|j3                  |ddd	
       |j5                  |ddd	
       |j7                          |S )z0Build the GTK widget displayed as the tab title.zwindow-close-symbolicclicked)labelrI   T)orientationexpandheFr   )r   fillpadding)r   Buttonnew_from_icon_nameIconSizeBUTTON
set_reliefReliefStyleNONEr8   try_close_tabLabelget_filename_for_display	tab_labelset_ellipsizer   EllipsizeModeENDEventBoxaddon_tab_title_clickedBoxOrientation
HORIZONTALr1   deco_layout
pack_startpack_endshow_all)r#   btn	event_box	tab_titles       r   build_tab_widgetzDrImage.build_tab_widget  sR    	

%%&=s||?R?RS#..%%&++i++,994#@#@#BC$...u22667lln)--($*C*CDgg#//"<"<TJ)	[[$EqAi4C	$T1Ec%eQ?	r   c                     |j                   t        j                  j                  k(  r.|j                  t        j
                  k(  r| j                          yy)NTF)typer   	EventTypeBUTTON_PRESSbuttonBUTTON_MIDDLEr   )r#   widgetevent_buttons      r   r   zDrImage.on_tab_title_clicked/  s@    #--444S...
	r   c                 r    | j                         }| j                         sd|z   }| j                  |       |S )N*)r   is_savedset_tab_label)r#   
main_titles     r   r   zDrImage.update_title6  s7    ,,.*	j :Z 	r   c                     | j                         t        d      }|S | j                         j                  d      d   }|S )NzUnsaved file/)r   r    split)r#   unsaved_file_names     r   r   z DrImage.get_filename_for_display=  sK    	!( 
 ))+11#6r:	r   c                     | j                   j                  |       rT| j                          | j                  j	                  d       d| _        d| _        | j                  j                          yy)zMAsk the window to close the image/tab. Then unallocate widgets and
		pixbufs.FNT)	r1   	close_tabdestroyru   resetmain_pixbuftemp_pixbufrv   empty_historyrh   s     r   r   zDrImage.try_close_tabD  sW     
[[4 <<>>>44== 

r   c                 :    | j                   j                  |       y rz   )r   	set_label)r#   
title_texts     r   r  zDrImage.set_tab_labelQ  s    ..:&r   c                 P    | j                   y | j                   j                         S rz   )r2   r   r]   s    r   r   zDrImage.get_file_pathT  s"    	ZZ

**


r   c                 0    t        | j                  |        y rz   )r   r1   r]   s    r   show_propertieszDrImage.show_propertiesZ  s    T[[$'r   c                 D    | j                          | j                          y rz   )update_history_sensitivityr6   r]   s    r   update_image_wide_actionsz!DrImage.update_image_wide_actions]  s    !!#r   c                 8    | j                   j                          y rz   )rv   try_undor]   s    r   r#  zDrImage.try_undod      --r   c                 8    | j                   j                          y rz   )rv   try_redor]   s    r   r&  zDrImage.try_redog  r$  r   c                 6    | j                   j                         S rz   )rv   	get_savedr]   s    r   r
  zDrImage.is_savedj  s    		 	 	""r   c                 j    | j                   j                  | j                  j                                y rz   )rv   	add_stater  r   r]   s    r   r   zDrImage.remember_current_statem  s#    --$**//12r   c                     | j                  d| j                  j                                | j                  d| j                  j                                y )Nrj   rk   )rw   rv   can_undocan_redor]   s    r   r   z"DrImage.update_history_sensitivityp  s<    fdmm&<&<&>?fdmm&<&<&>?r   c                 :    | j                   j                  |       y rz   )rv   add_operation)r#   	operations     r   add_to_historyzDrImage.add_to_historyu  s    --i(r   c                 n    | j                   j                         ry| j                   j                          S r   )rv   r,  has_initial_pixbufr]   s    r   should_replacezDrImage.should_replacex  s+    	]]
]]--/	//r   c                 4    | j                   j                  d   S )Nrd   )rv   r   r]   s    r   get_initial_rgbazDrImage.get_initial_rgba}  s    		(	(	00r   c                 X    | j                   j                  |      j                  |       y rz   )r1   lookup_actionset_enabled)r#   action_namestates      r   rw   zDrImage.set_action_sensitivity  s    ++K(44U;r   c                    | j                   j                  }| j                  d|       | j                  d|        | j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d|       | j                  d	|       | j                         j	                          y )
Nunselect
select_allselection_cutselection_copyselection_deleteselection_exportnew_tab_selectionzselection-replace-canvaszselection-expand-canvas)ru   	is_activerw   active_toolupdate_actions_state)r#   r;  s     r   rF  zDrImage.update_actions_state  s    
..
"
"%j%0lI6ou5.60%80%81598%@7?))+r   c                 6    | j                   j                         S rz   )r1   rE  r]   s    r   rE  zDrImage.active_tool  s    		 	 	""r   c                     | j                   S rz   )rl   r]   s    r   get_mouse_is_pressedzDrImage.get_mouse_is_pressed  s    			r   c                    | j                   j                  r| xj                  dz  c_         |j                  | j                    |j                          |j                  | j                  | j                         |j                  | j                         d| j                  z  d| j                  z         | j                         r-|j                         j                  t        j                          |j                          | j#                         j%                  ||       t'        || j                  | j)                         | j                  z
  | j+                         | j                  z
         y)z=Signal callback. Executed when self._drawing_area is redrawn.r	   r  N)r1   r=   r?   r   rb   r   scalero   set_source_surfaceget_surfacerm   rn   is_zoomed_surface_sharp
get_source
set_filterr   FILTER_NEARESTrE  on_draw_abover   get_pixbuf_widthget_pixbuf_height)r#   arear   s      r   rS   zDrImage.on_draw  s   	[[  -/ doot7 ""4#3#3#5#%#5rDMM7IK	!!#(()=)=> ""47 #=$// $ 5 5 7$-- G#557$--GIr   c                    | j                   ry| j                  |      \  }}|j                  dk(  rZt        j                  | _        |j                  | _        |j                  | _	        | j                  | _        | j                  | _        yt        j                  | _        d| _         | j                  j!                          | j#                         j%                  || j&                  ||       y)zSignal callback. Executed when a mouse button is pressed on
		self._drawing_area, if the button is the mouse wheel the colors are
		exchanged, otherwise the signal is transmitted to the selected tool.Nr   T)rl   get_event_coordsr  r   r   rp   xrq   yrr   rm   rs   rn   rt   r   r1   set_window_subtitlesrE  rU   r   r#   rU  eventevent_xevent_ys        r   rU   zDrImage.on_press_on_area  s     
 
**51'7
\\Q*//444}}4}}4	)..$$++""$ %%eT\\7GLr   c                    | j                  |      \  }}| j                  t        j                  k(  r,| j	                         j                  || j                         nC| j                  t        j                  k(  r| j	                         j                  || j                  ||| j                         | j                  r,| j                  j                  r| xj                  dz  c_        yd| _	        | j                          t        j                  | j                   | j"                  i        nt| j$                  | _        | j(                  | _        | j,                  |j.                  z
  }| j0                  |j2                  z
  }| j5                  ||d| j6                  z         |j8                  t:        j<                  j>                  z  t:        j<                  j>                  k(  rd| _         | j@                  rRtC        |      dz   tC        |      z   }| jE                  ||      }||d|z   z  }| jF                  jI                  |       y| jF                  jI                  d       y)a<  Signal callback. Executed when the mouse pointer moves upon
		self._drawing_area, the signal is transmitted to the selected tool.
		If a button (not the mouse wheel) is pressed, the tool's method should
		have an effect on the image, otherwise it shouldn't change anything
		except the mouse cursor icon for example.r	   NTz, 
)%rW  rp   r   r   rE  on_unclicked_motion_on_arear   r   rT   r:   r1   r=   r>   r   r   timeout_addr;   _async_unlockrs   rm   rt   rn   rq   rX  rr   rY  
add_deltasro   r;  r   ModifierTypeCONTROL_MASKr<   str_get_tool_tooltiprJ   set_tooltip_text)	r#   rU  r\  r]  r^  delta_xdelta_yfull_tooltip_texttool_tooltips	            r   rT   zDrImage.on_motion_on_area  s    **51'7	-333 11%F/444''t||W$+T-F-FH
{{	Q
#4;;=D(($*<*<bA $$4=$$4=%'')7%'')7??7GQ%89 kkC$$111c6F6F6S6SS4	7|d*S\9((':<,,&&'89&&t,r   c                    d| _         | j                  t        j                  k(  r@| j	                         s| j
                  j                          t        j                  | _        yt        j                  | _        | j                  |      \  }}| j                         j                  || j                  ||       d| _        | j
                  j                          | j
                  j                          y)zSignal callback. Executed when a mouse button is released on
		self._drawing_area, if the button is not the signal is transmitted to
		the selected tool.FN)r<   rp   r   r   _is_slip_movingr1   on_middle_clickr   rW  rE  rV   r   rl   r   rZ  r[  s        r   rV   zDrImage.on_release_on_area  s     $	-222



 KK!*004	)//$**51'7''t||WgN$++""$++""$r   c                     t        | j                  | j                  z
        t        j                  kD  }t        | j
                  | j                  z
        t        j                  kD  }|xs |S )zvTells if the pointer moved while the middle button of the mouse is
		pressed, depending on a constant hardcoded limit.)absrs   rm   r   r   rt   rn   )r#   mxmys      r   ro  zDrImage._is_slip_moving  sW     4t}},-0@0G0GG"
4t}},-0@0G0GG"	r/r   c                 X    | j                         j                  ||| j                        S rz   )rE  get_tooltiprp   )r#   ev_xev_ys      r   rh  zDrImage._get_tool_tooltip  s&    					'	'dD4H4H	IIr   c                 8    | j                   j                          y rz   )rJ   
queue_drawr]   s    r   r   zDrImage.update  s    !r   c                     d| _         y)z8This is used as a GSourceFunc so it should return False.F)r:   )r#   content_paramss     r   rc  zDrImage._async_unlock  s    #$	r   c                     | j                   S rz   )r   r]   s    r   rM  zDrImage.get_surface!  s    	r   c                 :    | j                   j                  d       y )NTr1   
set_cursorrh   s     r   r[   zDrImage.on_enter_image$  s    ++r   c                 :    | j                   j                  d       y r   r  rh   s     r   r\   zDrImage.on_leave_image'  s    ++r   c                 D    | j                          | j                          y rz   )r   r   r]   s    r   	post_savezDrImage.post_save*  s    ++-r   c                    | j                   j                         }| j                   j                         }t        j                  | j                   dd||      | _        t        j                  ||z        dz
  | _        t        | j                  dz        | _        t        dt        d| j                              | _        y )Nr     g?!   r   )r   r   r   r   pixbuf_get_from_surfacer  mathsqrtr;   intmaxminr   s      r   r   z$DrImage.set_surface_as_stable_pixbuf.  s    
ll!
ll!00q!QJ$1q5)D0$T11C78$RS$*>*>!?@$r   c                     t        j                  | j                  dd      | _        | j                  j	                  | j
                  | j
                         y)zdThis is called by tools' `restore_pixbuf`, so at the beginning of
		each operation (even unapplied).r   N)r    cairo_surface_create_from_pixbufr  r   set_device_scaleSCALE_FACTORr]   s    r   r   zDrImage.use_stable_pixbuf8  s@     55d6F6F4P$,,, 1 143D3DEr   c                 6    | j                   j                         S rz   )r  r   r]   s    r   rS  zDrImage.get_pixbuf_width@  s    				#	#	%%r   c                 6    | j                   j                         S rz   )r  r   r]   s    r   rT  zDrImage.get_pixbuf_heightC  s    				$	$	&&r   c                 ,    |t        d      || _        y)zdSafely set a pixbuf as the main one (not used everywhere internally
		in image.py, but it's normal).Nr  )r   r  r#   
new_pixbufs     r   r   zDrImage.set_main_pixbufF  s     	"=	11 4r   c                 ,    |t        d      || _        y )Nr  )r   r  r  s     r   r   zDrImage.set_temp_pixbufQ  s    	"=	11 4r   c                     | j                  | j                  dd             | j                          | j                          y )Nr	   )r   r   r   r   r]   s    r   
reset_tempzDrImage.reset_tempW  s2    t--a34++-r   c                    | j                   j                  rt        d      | j                  z  }|dt	        | j
                        z   dz   z  }| j                   j                  |       d| _        d| _        t        j                  d| j                  i        y| j                   j                  j                         r| j                   j                  dd       y)	zDevelopment only: live-display the evolution of the framerate of the
		drawing area. The max should be around 60, but many tools don't require
		so many redraws.
		This is used as a GSourceFunc so it should return False.z%s frames per secondz (z motion inputs skipped)r   r  zTracking stopped.TF)r1   r@   r    r?   rg  r>   reveal_messager   rb  rA   info_barget_visible)r#   async_cb_datamsgs      r   rA   zDrImage.reset_fps_counter_  s    
 
[[''	
!	"T%6%6	63$T))*
*-F
FF3;;c"44D$00"5 
 {{'');;148	r   c                 6    | j                   j                         S rz   )rJ   r   r]   s    r   get_widget_widthzDrImage.get_widget_widths  s    				/	/	11r   c                 6    | j                   j                         S rz   )rJ   get_allocated_heightr]   s    r   get_widget_heightzDrImage.get_widget_heightv  s    				0	0	22r   c                     | j                         }| j                         }||kD  r|||z  z  }|}n
|}|||z  z  }| j                  j                  ||t        j
                  j                        S rz   )rS  rT  r  scale_simpler   
InterpTypeTILES)r#   preview_size	mpb_width
mpb_heightmwmhs         r   generate_mini_pixbufzDrImage.generate_mini_pixbufy  su    ##%)%%'*)	*,-222
9,-2				&	&r2y/C/C/I/I	JJr   c                     | j                         }| j                         }| j                         || j                  z  k  }| j	                         || j                  z  k  }|xs |}|S rz   )rS  rT  r  ro   r  )r#   r  r  show_xshow_yshow_overlays         r   get_minimap_need_overlayz DrImage.get_minimap_need_overlay  sf    ##%)%%'*  "Y%@@&!!#j4??&BB&!6,	r   c                 (    || j                         z  S rz   )rS  )r#   
mini_widths     r   get_minimap_ratiozDrImage.get_minimap_ratio  s    	D))+	++r   c                     t        | j                         | j                  z        }t        | j                         | j                  z        }||fS rz   )r  r  ro   r  )r#   visible_widthvisible_heights      r   get_visible_sizezDrImage.get_visible_size  sE    d++-?@-t--/$//AB.		&&r   c                     | j                         j                  dk(  r7| j                         j                  s| j                  j	                         dz   S | j                         S Nr	      )rE  menu_idapply_to_selectionr  r   rS  r]   s    r   get_previewed_widthzDrImage.get_previewed_width  sT    	1$




/
/%%'",,				  r   c                     | j                         j                  dk(  r7| j                         j                  s| j                  j	                         dz   S | j                         S r  )rE  r  r  r  r   rT  r]   s    r   get_previewed_heightzDrImage.get_previewed_height  sT    	1$




/
/&&(2--				!!r   c                 *    | j                  ddd       y Nr   )rd  r]   s    r   fake_scrollbar_updatezDrImage.fake_scrollbar_update  s    //!Qr   c                     | j                   |j                  | j                  z  z   }| j                  |j                  | j                  z  z   }|r |dz  }|dz  }t        |      t        |      fS ||fS )Ng      ?)rm   rX  ro   rn   rY  r  )r#   r\  as_integersr]  r^  s        r   rW  zDrImage.get_event_coords  sm    MMUWWt67'MMUWWt67' c>7
c>7
g,G
$$
7
r   c                 V   ||z
  }||z
  }|| j                   z
  }|| j                  z
  }|r2|| j                  j                  z  }|| j                  j                  z  }||z   }||z   }|r<|| j
                  z  }|| j
                  z  }|| j
                  z  }|| j
                  z  }||||fS )zDo whatever coordinates conversions are needed by tools like `crop`
		and `scale` to display things (selection pixbuf, mouse cursors on hover,
		etc.) correctly enough.)rm   rn   ru   selection_xselection_yro   )	r#   x1x2y1y2with_selection	with_zoomr   r   s	            r   get_corrected_coordszDrImage.get_corrected_coords  s     	2g!2g!	DMM"	DMM"	#	##2	#	##2	Av"	Av"2222	RRr   c                    | j                   j                         }| j                   j                         }|sd}d}| j                  t	        |      |t	        |      ||d      \  }}}}	|d|z  | j
                  z  z  }|d|z  | j
                  z  z  }|d|z  | j
                  z  z  }|	d|z  | j
                  z  z  }	||||	dS )zzReturns the sizes of the 'nineths' of the image used for example by
		'scale' or 'crop' to decide the cursor they'll show.r   Tg?)wlwrhthb)r  r   r   r  r  ro   )
r#   r  r  r  r~   r}   r  r  r  r  s
             r   get_nineths_sizeszDrImage.get_nineths_sizes  s     &&(&



$
$
&%		2	2,,SWeSW)/1CTK."b"b
 edoo%%"edoo%%"ft&&"ft&&""Bb	11r   c                 >   |j                   t        j                  j                  z  t        j                  j                  k(  }|| j                  k(  r| j                  |       y d| j                         z  }| j                  |j                  |j                  |       y )N   )
r;  r   re  rf  rg   _zoom_to_point_zoom_profilerd  rj  rk  )r#   rU  r\  ctrl_is_usedaccelerations        r   rW   zDrImage.on_scroll_on_area  st    ++ 0 0 = ==#BRBRB_B__,T'''ut))++<??5==%-->r   c                     | j                  | j                  j                         | j                  j                                | j	                          y rz   )correct_coordsrX   	get_valuerZ   r   )r#   	scrollbars     r   rY   z!DrImage.on_scrollbar_value_change  s9    d''113T5F5F5P5P5RS++-r   c                    |dkD  r| j                         }n|dk  rd}n| j                  }|dkD  r| j                         }n|dk  rd}n| j                  }| j	                  ||       | j
                  j                  j                          y r  )r  rm   r  rn   r  r1   minimapupdate_overlay)r#   rj  rk  wanted_xwanted_ys        r   reset_deltaszDrImage.reset_deltas  s|    q[&&(8{8mm8q['')8{8mm8h)++$$&r   c                     | j                   t        ||z        z   }| j                  t        ||z        z   }| j                  ||       | j                  j
                  j                          y rz   )rm   r  rn   r  r1   r  r  )r#   rj  rk  factorr  r  s         r   rd  zDrImage.add_deltas  sX    ]]S6!122(]]S6!122(h)++$$&r   c                    | j                         }| j                         }|dk  ry | j                         }t        || j	                  ||            }t        |d      }| j                  d|t        |      t        |             | j                         }t        || j	                  ||            }t        |d      }| j                  d|t        |      t        |             y )Nr   r   FT)	r  r  r  r  get_max_coordr  update_scrollbarr  r  )r#   r  r  available_wavailable_hr  r  s          r   r  zDrImage.correct_coords  s    %%'+&&(+1_	 &&()4--iEF(1({C	NCMJ ((**4--j+FG(1(k3z?CMJr   c                 *    ||| j                   z  z
  }|S rz   ro   )r#   mpb_sizeavailable_size	max_coords       r   r  zDrImage.get_max_coord  s    .4??:;)	r   c                    |r| j                   }n| j                  }|j                  || j                  z  |k         |j	                  d|       |j                         j                  || j                  z         |j                  |       |rt        |j                               | _
        y t        |j                               | _        y r  )rZ   rX   r   ro   	set_rangeget_adjustmentset_page_size	set_valuer  r  rn   rm   )r#   is_verticalallocated_sizepixbuf_sizecoordr  s         r   r  zDrImage.update_scrollbar  s      9  98;FGa%**>DOO+KLey**,-4=y**,-4=r   c                 
   | j                  |      \  }}|j                  |j                  z   dz  | j                         z  }| j	                  |       | j                  |      \  }}||z
  }||z
  }| j                  ||d       y)zvZoom in or out the image in a way such that the point under the
		pointer stays as much as possible under the pointer.r  r	   N)rW  rj  rk  r  inc_zoom_levelrd  )	r#   r\  r]  r^  
zoom_deltanew_event_xnew_event_ydelta_correction_xdelta_correction_ys	            r   r  zDrImage._zoom_to_point%  s     **51'7 -3d6H6H6JJ*j!!2259+{,, //$&8!<r   c                 F    | j                  | j                  dz  |z          y )Nr   )set_zoom_levelro   )r#   deltas     r   r  zDrImage.inc_zoom_level5  s    t,56r   c                    t        t        || j                        d      }t        |      dz  | _        | j
                  j                  j                  | j                         | j                         r2| j
                  j                  j                  | j                  dz         | j                          | j                          y )Nr  r   )r  r  ZOOM_MAXr  ro   r1   r  update_zoom_scalerN  set_zoom_labelr  r   )r#   levelnormalized_zoom_levels      r   r  zDrImage.set_zoom_level8  s    c%7<./3$/++''8	!!#;;%%doo&;<++-r   c                     | j                         }| j                         }|| j                         z  }|| j                         z  }t	        ||      dz  }| j                  |       d| _        d| _        y )Nc   r   )r  r  r  r  r  r  rm   rn   )r#   rc   allocated_widthallocated_heighth_ratiov_ratiooptis          r   set_opti_zoom_levelzDrImage.set_opti_zoom_levelA  sr    ))+/++-d6688't88::'	Wg		#$d$-$-r   c                 4    | j                   | j                  kD  S rz   )ro   ZOOM_THRESHOLDr]   s    r   rN  zDrImage.is_zoomed_surface_sharpK  s    	4..	..r   c                 d    | j                   dk  ry| j                   dk  ry| j                   dk  ryy)zThis is the 'speed' of the zoom scrolling: when between 20% and 100%
		it's quite precise, but between 1000% and 2000% we prefer being as fast
		as possible.g       @g      @r-   g      @g      $@g      4@r  r]   s    r   r  zDrImage._zoom_profileN  s4     
__s



r   )T)er   r   r   __gtype_name__r   TemplateChildrJ   rX   rZ   r7   r   r  r  r  r"   rB   rC   rE   rx   r   r   r   r|   r   r   r   r   r   r   r   r   r9   r6   r   r   r   r   r   r  r   r  r!  r#  r&  r
  r   r   r1  r4  r6  rw   rF  rE  rI  rS   rU   rT   rV   ro  rh  r   rc  rM  r[   r\   r  r   r   rS  rT  r   r   r  rA   r  r  r  r  r  r  r  r  r  rW  r  r  rW   rY   r  rd  r  r  r  r  r  r  r  rN  r  r'   r(   s   @r   r+   r+   )   s;   ##%""$""$<<%%'""$   #KJH8KF-.
G*!8
 $E
$	)*E.' (#3@
)0
1<,#I8M.+-Z%"J" )+ 
 AF&'!! ,. (23	K,'!"
(2(?'$'K$.= 7/r   r+   )r   randomr  gi.repositoryr   r   r   r   r   r   history_managerr
   selection_managerr   
propertiesr   utilities_filesr   utilities_overlayr   r   r   r   r  r   r+   r   r   r   <module>r!     sg   $   ? ? - 1 * 7 ?
 
&	 & GHocgg o Ior   