
    ը	f;                         d Z ddlZddl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	e      Z G d
 de      Zy)a?  
@package mapwin.mapwindow

@brief Map display canvas basic functionality - base class and properties.

Classes:
 - mapwindow::MapWindowProperties
 - mapwindow::MapWindowBase

(C) 2006-2012 by the GRASS Development Team

This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.

@author Martin Landa <landa.martin gmail.com>
@author Michael Barton
@author Jachym Cepicky
@author Vaclav Petras <wenzeslaus gmail.com> (handlers support)
@author Stepan Turek <stepan.turek seznam.cz> (handlers support)
    N)UserSettings)GError)StockCursor)core)Signalc                   `   e Zd Zd Zd Zed        Zej                  d        Zed        Zej                  d        Zed        Z	e	j                  d        Z	ed	        Z
e
j                  d
        Z
ed        Zej                  d        Zed        Zed        Zej                  d        Zy)MapWindowPropertiesc                    d | _         t        d      | _        d | _        t        d      | _        d | _        t        d      | _        d | _        t        d      | _        d| _	        t        d      | _
        d | _        t        d      | _        y )Nz%MapWindowProperties.resolutionChangedz%MapWindowProperties.autoRenderChangedz%MapWindowProperties.showRegionChangedz&MapWindowProperties.alignExtentChangedFz/MapWindowProperties.useDefinedProjectionChangedz!MapWindowProperties.sbItemChanged)_resolutionr   resolutionChanged_autoRenderautoRenderChanged_showRegionshowRegionChanged_alignExtentalignExtentChanged_useDefinedProjectionuseDefinedProjectionChanged_sbItemsbItemChangedselfs    ,/usr/lib/grass83/gui/wxpython/mapwin/base.py__init__zMapWindowProperties.__init__"   s    !'(O!P!'(O!P!'(O!P "()Q"R%*"+1=,
( #$GH    c                     t        j                  ddd      | _        t        j                  ddd      | _        d| _        t        j                  ddd      | _        y)	zFConvenient function to get values from user settings into this object.displaycompResolutionenabledgroupkeysubkeyautoRenderingFalignExtentN)r   Getr   r   r   r   r   s    r   setValuesFromUserSettingsz-MapWindowProperties.setValuesFromUserSettings2   s]    '++!1)
 (++
 !(,,y
r   c                     | j                   S N)r   r   s    r   
resolutionzMapWindowProperties.resolution?       r   c                 j    || j                   k7  r$|| _         | j                  j                  |       y y N)value)r   r   emitr   r.   s     r   r*   zMapWindowProperties.resolutionC   4    D$$$$D""''e'4 %r   c                     | j                   S r)   )r   r   s    r   
autoRenderzMapWindowProperties.autoRenderI   r+   r   c                 j    || j                   k7  r$|| _         | j                  j                  |       y y r-   )r   r   r/   r0   s     r   r3   zMapWindowProperties.autoRenderM   r1   r   c                     | j                   S r)   )r   r   s    r   
showRegionzMapWindowProperties.showRegionS   r+   r   c                 j    || j                   k7  r$|| _         | j                  j                  |       y y r-   )r   r   r/   r0   s     r   r6   zMapWindowProperties.showRegionW   r1   r   c                     | j                   S r)   )r   r   s    r   r%   zMapWindowProperties.alignExtent]   s       r   c                 j    || j                   k7  r$|| _         | j                  j                  |       y y r-   )r   r   r/   r0   s     r   r%   zMapWindowProperties.alignExtenta   s4    D%%% %D##((u(5 &r   c                     | j                   S r)   )r   r   s    r   useDefinedProjectionz(MapWindowProperties.useDefinedProjectiong   s    )))r   c                 j    || j                   k7  r$|| _         | j                  j                  |       y y r-   )r   r   r/   r0   s     r   r;   z(MapWindowProperties.useDefinedProjectionk   s4    D...).D&,,111> /r   c                 2    t        j                  ddd      S )N
projection	statusbarepsgr    )r   r&   r   s    r   r@   zMapWindowProperties.epsgq   s    lFSSr   c                     | j                   S r)   )r   r   s    r   sbItemzMapWindowProperties.sbItemu       ||r   c                 j    || j                   k7  r$|| _         | j                  j                  |       y y )N)mode)r   r   r/   )r   rE   s     r   rB   zMapWindowProperties.sbItemy   s1    4<<DL###.  r   N)__name__
__module____qualname__r   r'   propertyr*   setterr3   r6   r%   r;   r@   rB    r   r   r	   r	   !   s5   I 
     5 5
     5 5
     5 5
 ! ! 6 6
 * *   ? !?
 T T   ]]/ /r   r	   c                       e 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 eee      Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)MapWindowBasea  Abstract map display window class

    Superclass for BufferedWindow class (2D display mode), and GLWindow
    (3D display mode).

    Subclasses have to define
     - _bindMouseEvents method which binds MouseEvent handlers
     - Pixel2Cell
     - Cell2Pixel (if it is possible)
    c                    || _         || _        || _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        ddgddgddd| _        d | _	        d | _
        t        j                  g t        j                  g t        j                  g t        j                  g t        j                   g t        j"                  g t        j$                  g t        j&                  g t        j(                  g t        j*                  g t        j,                  g t        j.                  g t        j0                  g t        j2                  g i| _        t7        t        j8                  	      t7        t        j:                  	      t7        t        j<                  	      t7        t        j>                  	      t7        t        j@                  	      d
| _!        d| _"        t        jF                  | jH                         y )Nz MapWindow.mouseHandlerRegisteredz"MapWindow.mouseHandlerUnregisteredzMapWindow.overlayActivatedzMapWindow.overlayRemovedr   pointerpoint)beginendusebox)cursorId)defaultcrosshandpencilsizenwserV   )%parentMap_gifacer   mouseHandlerRegisteredmouseHandlerUnregisteredoverlayActivatedoverlayRemovedmouselastEN_overriddenCursorwxEVT_LEFT_DOWNEVT_LEFT_UPEVT_LEFT_DCLICKEVT_MIDDLE_DOWNEVT_MIDDLE_UPEVT_MIDDLE_DCLICKEVT_RIGHT_DOWNEVT_RIGHT_UPEVT_RIGHT_DCLICK
EVT_MOTIONEVT_ENTER_WINDOWEVT_LEAVE_WINDOWEVT_MOUSEWHEELEVT_MOUSE_EVENTShandlersContainerr   CURSOR_ARROWCURSOR_CROSSCURSOR_HANDCURSOR_PENCILCURSOR_SIZENWSE_cursors_cursor	CallAfterInitBinding)r   r[   gifacer\   s       r   r   zMapWindowBase.__init__   s    '--O&P#(./S(T% &'C D$%?@
 Vq6	

  "&
 bNNBb  "rOORMM2r"
& #BOO< "//:8!2+;+;<#R-?-?@
 !
T%%&r   c                 $    | j                          y r)   )UnregisterAllHandlersr   s    r   __del__zMapWindowBase.__del__   s    ""$r   c                     t        j                  | j                        D ]&  \  }}| j                  || j	                  |             ( y)zfBinds helper functions, which calls all handlers
        registered to events with the events
        N)six	iteritemsrt   BindEventTypeHandler)r   evhandlerss      r   r}   zMapWindowBase.InitBinding   s?      MM$*@*@A 	;LBIIb$//9:	;r   c                       fdS )Nc                 (    j                  |       S r)   )HandlersCaller)event
evHandlersr   s    r   <lambda>z0MapWindowBase.EventTypeHandler.<locals>.<lambda>   s    T00
C r   rK   )r   r   s   ``r   r   zMapWindowBase.EventTypeHandler   s	    CCr   c                     |D ]  }	  ||        |j	                          y#  |j                  |       t        | t        d      |j                  z         Y WxY w)zNHelper function which calls all handlers registered for
        event
        zGError occurred during calling of handler: %s 
Handler was unregistered.r[   messageN)remover   _rF   Skip)r   r   r   handlers       r   r   zMapWindowBase.HandlersCaller   se       	G	 	

	(4 &&	's	   "6ANc                 Z   | j                   j                          t        j                  | j                        D ]  \  }}||k(  s|j                  |        | j                  d   | j                  d<   d| j                  d<   |r&| j                         | _        | j                  |       y)aL  Binds event handler

        @deprecated This method is deprecated. Use Signals or drawing API
        instead. Signals do not cover all events but new Signals can be added
        when needed consider also adding generic signal. However, more
        interesting and useful is higher level API to create objects, graphics etc.

        Call event.Skip() in handler to allow default processing in MapWindow.

        If any error occurs inside of handler, the handler is removed.

        Before handler is unregistered it is called with
        string value "unregistered" of event parameter.

        ::

            # your class methods
            def OnButton(self, event):
                # current map display's map window
                # expects LayerManager to be the parent
                self.mapwin = self.parent.GetLayerTree().GetMapDisplay().GetWindow()
                if self.mapwin.RegisterEventHandler(wx.EVT_LEFT_DOWN, self.OnMouseAction,
                                                    'cross'):
                    self.parent.GetLayerTree().GetMapDisplay().Raise()
                else:
                    # handle that you cannot get coordinates

            def OnMouseAction(self, event):
                # get real world coordinates of mouse click
                coor = self.mapwin.Pixel2Cell(event.GetPositionTuple()[:])
                self.text.SetLabel('Coor: ' + str(coor))
                self.mapwin.UnregisterMouseEventHandler(wx.EVT_LEFT_DOWN, self.OnMouseAction)
                event.Skip()


        Emits mouseHandlerRegistered signal before handler is registered.

        :param event: one of mouse events
        :param handler: function to handle event
        :param cursor: cursor which temporary overrides current cursor

        :return: True if successful
        :return: False if event cannot be bind
        rS   useBeforeGenericEventgenericEventT)
r^   r/   r   r   rt   appendrb   GetNamedCursorrd   SetNamedCursor)r   r   r   cursorcontainerEvr   s         r   RegisterMouseEventHandlerz'MapWindowBase.RegisterMouseEventHandler   s    Z 	##((*%(]]43I3I%J 	)!K#(	) /3jj.?

*+*

5%)%8%8%:D"'r   c           	      
   t        j                  | j                        D ]&  \  }}|D ]  }	  |d       |j                  |        ( y#  t	        | t        d      |j                  z         |j                  |       Y ZxY w)zUnregisters all registered handlers

        @deprecated This method is deprecated. Use Signals or drawing API instead.

        Before each handler is unregistered it is called with string
        value "unregistered" of event parameter.
        unregisteredzvError occurred during unregistration of handler: %s 
                                        Handler was unregistered.r   N)r   r   rt   r   r   r   rF   )r   r   r   r   s       r   r   z#MapWindowBase.UnregisterAllHandlers)  s     &)]]43I3I%J 	-!K# --N+OOG,-	-
	-# !B! "**	!+ OOG,s   A

6Bc                 "   t        j                  | j                        D ]U  \  }}||k7  r	  |d       ||v r|j                  |       n+t	        j
                  t        d      |j                  z         W | j                  d   | j                  d<   | j                  r| j                  | j                         | j                  j                          y#  t        | t        d      |j                  z         |j                  |       Y xY w)a  Unbinds event handler for event

        @deprecated This method is deprecated. Use Signals or drawing API instead.

        Before handler is unregistered it is called with string value
        "unregistered" of event parameter.

        Emits mouseHandlerUnregistered signal after handler is unregistered.

        :param handler: handler to unbind
        :param event: event from which handler will be unbinded

        :return: True if successful
        :return: False if event cannot be unbind
        r   zHandler: %s was not registeredzuError occurred during unregistration of handler: %s 
                                        Handler was unregisteredr   r   rS   T)r   r   rt   r   grasswarningr   rF   r   rb   rd   r   r_   r/   )r   r   r   r   r   s        r   UnregisterMouseEventHandlerz)MapWindowBase.UnregisterMouseEventHandlerA  s    " &)]]43I3I%J 	)!K#)'h&OOG,MM:;g>N>NN	). !JJ'>?

5 !! 6 67%%**,'	)A &&	' (s   A	C6Dc                     t               r)   NotImplementedError)r   xyCoordss     r   
Pixel2CellzMapWindowBase.Pixel2Cellr      !##r   c                     t               r)   r   )r   enCoordss     r   
Cell2PixelzMapWindowBase.Cell2Pixelu  r   r   c                     	 | j                  |j                               | _        |j	                          y# t        $ r
 d| _        Y #w xY w)zTracks mouse motion and update statusbar

        .. todo::
            remove this method when lastEN is not used

        :func:`GetLastEN`
        N)r   GetPositionrc   
ValueErrorr   )r   r   s     r   OnMotionzMapWindowBase.OnMotionx  sC    	//%*;*;*=>DK 	

  	DK	s   $7 A
	A
c                     | j                   S )zReturns last coordinates of mouse cursor.

        @deprecated This method is deprecated. Use Signal with coordinates as parameters.

        :func:`OnMotion`
        )rc   r   s    r   	GetLastENzMapWindowBase.GetLastEN  s     {{r   c                 R    | j                   |   }| j                  |       || _        y)zSets cursor defined by name.N)rz   	SetCursorr{   )r   
cursorNamer   s      r   r   zMapWindowBase.SetNamedCursor  s#    z*v!r   c                     | j                   S )zReturns current cursor name.)r{   r   s    r   r   zMapWindowBase.GetNamedCursor  rC   r   )fgetfsetc                 b    d| j                   d<   d| j                   d<   | j                  d       y)zSets mouse mode to pointer.rO   rS   rP   rT   rV   N)rb   r   r   s    r   SetModePointerzMapWindowBase.SetModePointer  s,    %

5#

5I&r   c                 p    d| j                   d<   d| j                   d<   d| _        | j                  d       y)zSets mouse mode to pan.panrS   rT   r   rX   Nrb   zoomtyper   r   s    r   
SetModePanzMapWindowBase.SetModePan  s3    !

5!

5F#r   c                 (    | j                  d       y )N   zoomType_setModeZoomr   s    r   SetModeZoomInzMapWindowBase.SetModeZoomIn  s    1%r   c                 (    | j                  d       y )Nr   r   r   s    r   SetModeZoomOutzMapWindowBase.SetModeZoomOut  s    2&r   c                     || _         d| j                  d<   d| j                  d<   t        j                  ddt        j                        | _        | j                  d       y )NzoomrS   rT   Red   colourwidthstylerW   )r   rb   re   Pen
SHORT_DASHpenr   )r   r   s     r   r   zMapWindowBase._setModeZoom  sK     "

5!

566ar}}EG$r   c                     d| j                   d<   d| j                   d<   t        j                  ddt        j                        | _        | j                  d       y )N
drawRegionrS   rT   r   r   r   rW   )rb   re   r   r   r   r   r   s    r   SetModeDrawRegionzMapWindowBase.SetModeDrawRegion  sD    (

5!

566ar}}EG$r   c                 p    d| j                   d<   d| j                   d<   d| _        | j                  d       y)zQuery mode onqueryrS   rP   rT   r   rW   Nr   r   s    r   SetModeQueryzMapWindowBase.SetModeQuery  s3    #

5#

5G$r   c                     t               )z2Use when the class instance is hidden in MapFrame.r   r   s    r   DisactivateWinzMapWindowBase.DisactivateWin      !##r   c                     t               )z6Used when the class instance is activated in MapFrame.r   r   s    r   ActivateWinzMapWindowBase.ActivateWin  r   r   r)   )rF   rG   rH   __doc__r   r   r}   r   r   r   r   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r   r   r   r   rK   r   r   rM   rM      s    	>'@%;D(:x-0/b$$" >?F'$&'%%%$$r   rM   )r   re   r   core.settingsr   	core.gcmdr   gui_core.wrapr   grass.scriptr   r   grass.pydispatch.signalr   objectr	   rM   rK   r   r   <module>r      s>   * 
 
 &  % & *\/& \/~I$F I$r   