ó
ÉÝ{Tc           @   sK   d  Z  d d l Z d d l Td d l Z d d l Z d d d „  ƒ  YZ d S(   sE  
     pygl/glevent.py: CCP4MG Molecular Graphics Program
     Copyright (C) 2001-2008 University of York, CCLRC

     This library is free software: you can redistribute it and/or
     modify it under the terms of the GNU Lesser General Public License
     version 3, modified in accordance with the provisions of the 
     license to address the requirements of UK law.
 
     You should have received a copy of the modified GNU Lesser General 
     Public License along with this library.  If not, copies may be 
     downloaded from http://www.ccp4.ac.uk/ccp4license.php
 
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU Lesser General Public License for more details.
iÿÿÿÿN(   t   *t   GLEventc           B   s  e  Z d  d d d d d d d d d	 d
 d d d g Z d Z d Z d Z i e d d d g d  6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d	 6e d d d g d
 6e d d d g d 6e d d d g d 6e d d d g d 6Z i e d d d g d  6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d 6e d d d g d	 6e d d d g d
 6e d d d g d 6e d d d g d 6e d d d g d 6Z d „  Z d „  Z	 d „  Z
 i  d d d „ Z d d d „ Z d „  Z d  „  Z d! „  Z d" „  Z d# „  Z d$ „  Z d d d d d d d% „ Z e d d d e e d& „ Z g  d' „ Z RS((   s	   rotate-xys   rotate-zs   translate-xys   translate-zs   object-rotate-xys   object-rotate-zs   object-translate-xys   object-translate-zt   zooms
   clip-widths	   utility-1s	   utility-2s	   utility-3s	   utility-4i   i   i   i    t    i   t   zt   ht   ft   xt   ct   vc         C   sí   | |  _  g  |  _ d |  _ d  |  _ |  j  j |  _ t t t	 t
 g |  _ t t t t g |  _ t t t t g |  _ d d d d g |  _ |  j |  _ |  j |  _ |  j |  _ |  j |  _ d |  _ d |  _ |  j d d d	 d ƒ |  j  ƒ  d  S(
   Ni   g      ð?g      @g      ð¿g      Àiÿÿÿÿg      à?t   cleart   reset(!   t   glthreadt   modst
   firsteventt   Nonet
   interruptqt   SHIFTt   ACCELERATOR_KEYt   key_at   key_At   key_qt   key_Qt	   X_ROT_KEYt   key_ot   key_Ot   key_pt   key_Pt	   Y_ROT_KEYt   key_wt   key_Wt   key_et   key_Et	   Z_ROT_KEYt	   ROT_ANGLEt   ResizeRubberBandt   UtilityFunction1t   Dummyt   UtilityFunction2t   UtilityFunction3t   UtilityFunction4t   selected_symmt   zoom_inct   set_bindingst   create_binding_lookup(   t   selfR   (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyt   __init__C   s"    						c         C   s^  d d  l  } i  |  _ xB|  j j ƒ  D]1\ } } |  j j | d ƒ s[ i  |  j | d <n  |  j | d j | d ƒ s• i  |  j | d | d <n  |  j | d | d j | d ƒ sß i  |  j | d | d | d <n  | d d k r1| j j | d ƒ } | |  j | d | d | d d | <q% | |  j | d | d | d d <q% Wd  S(   Niÿÿÿÿi    i   i   i   R   ia   (   t   stringt   lookupt   bindingst   itemst   has_keyt	   lowercaset   index(   R-   R/   t   actiont   bindt   i(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyR,   [   s    	&$,c         C   s4   i  } x' |  j  j ƒ  D] \ } } | | | <q W| S(   N(   R1   R2   (   R-   t   parst   keyt   value(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyt   get_bindingsl   s     c         C   s€   | r i  |  _  n  | rH x- t j j ƒ  D] \ } } | |  j  | <q( Wn  x' | j ƒ  D] \ } } | |  j  | <qU W|  j ƒ  d  S(   N(   R1   R   t   CCP4mg_bindingsR2   R,   (   R-   t   new_bindingsR
   R   R:   R;   (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyR+   q   s     c         C   s(   | r | |  _  n  | r$ | |  _ n  d  S(   N(   t   jqR   (   R-   R?   t	   interrupt(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyt   registerqueue{   s      c         C   s   | |  _  d  S(   N(   R   (   R-   R   (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyt   registermods   s    c   $   
   C   s‘  | d |  j  j k rÔ | d |  _ | d } | d } | d } | d } | d } | |  j  j k r™ | d } |  j | | | d d d	 d d
 | ƒn  | |  j  j k rÔ | d } |  j | | | d
 | ƒqÔ n  | d |  j  j k r| d } | d }	 | d }
 |
 d k r#d |  j  _ n d |  j  _ | d } | d } | |  _ | |  _	 |  j  j
 } |  j  j } | d } |
 d k r«|  j | | | d d d	 d d d ƒn  |
 d k rË|	 d k rË|  j | d k rË| d } | d } |  j | | | d d d	 d d d ƒ} | r–| j d } | j d } d t | ƒ d t | ƒ d t | ƒ d t | ƒ d t | ƒ d } |  j j d | g ƒ q|  j j d d t | ƒ d t | ƒ d g ƒ n8 |
 d k r|  j | d k r|  j | | | ƒ qn  | d |  _ n  | d |  j  j k r¡| d } | d } | d } |  j  j |  j d k rid } n d } | |  j  j k ró|  j  j | d d ƒ xX |  j D]J } | j |  j  j |  j  j ƒ | j j ƒ  r¢| j j | d d ƒ q¢q¢Wn  | |  j  j k rw|  j  j | d d ƒ xY |  j D]K } | j |  j  j |  j  j ƒ | j j ƒ  r%| j j | d d ƒ q%q%Wn  | |  j  j k rû|  j  j d | d ƒ xX |  j D]J } | j |  j  j |  j  j ƒ | j j ƒ  rª| j j d | d ƒ qªqªWn  | |  j  j k r|  j  j d | d ƒ xY |  j D]K } | j |  j  j |  j  j ƒ | j j ƒ  r-| j j d | d ƒ q-q-Wn  | |  _ | |  _	 | d |  _ n  | d |  j  j  k rš| d } | d } | d } |  j! j" | ƒ r|  j# |  j! j$ | ƒ } |  j  j% d d | f ƒ n\|  j& j" | ƒ rd|  j# |  j& j$ | ƒ } |  j  j% d | d f ƒ n|  j' j" | ƒ r«|  j# |  j' j$ | ƒ } |  j  j% | d d f ƒ nÍ| t( k rÖ|  j) rx|  j) j d ƒ qxn¢| t* k rC|  j  j |  j  j+ d k rxg  } | j, |  j  j- ƒ  ƒ | j, |  j  j. ƒ  ƒ |  j/ | ƒ qxn5| t0 k rf|  j  j1 |  j2 ƒ n| t3 k rˆ|  j  j1 |  j2 ƒ nð | t4 k r½|  j  j5 d  ƒ |  j j d d! g ƒ n» | t6 k rò|  j  j5 d" ƒ |  j j d d! g ƒ n† | t7 k r'|  j  j8 d  ƒ |  j j d d! g ƒ nQ | t9 k r\|  j  j8 d" ƒ |  j j d d! g ƒ n | t: k rx|  j  j; ƒ  n  | |  _ | |  _	 | d |  _ n  | d |  j  j< k r¾	| d } | d } | d } | d } | d } | d } | t= k r@	|  j  j |  j  j> r'	|  j j d d# g ƒ qœ	|  j j d d$ g ƒ n\ |  j j d d% t | ƒ d& t | ƒ d t | ƒ d' t | ƒ d t | ƒ d( g ƒ | |  _ | |  _	 | d |  _ n  |  j  j? |  j  j@ |  j  jA g j" | d ƒ d k r¢| d } | jB d) ƒ rU
| d) j" d ƒ rU
| d) j$ d ƒ } | d* k  sI
| d+ k r[
d } q[
n d } d, } |  j  j |  j  j> } |  j  j |  j  jC } |  jD jB | d ƒ r|  jD | d } | jB | ƒ r| | } | jB | ƒ r| | } | jB | ƒ r| | } qqqn  | s| jE ƒ  d- S| d } | d } |  jF d k r`d |  _F | |  _ | |  _	 n  | d. k r°| d/ } | d0 } |  j  j% | |  j  jG | |  j  jH d f ƒ nÐ| d1 k rá| d } | d } | d/ } | d0 } | |  j  jI d k  r |  j  j% d d | |  j  jG f ƒ nA | |  j  jI d d k ra|  j  j% d d | |  j  jG f ƒ n  | |  j  jJ d k  rž|  j  j% d d | |  j  jH f ƒ q€| |  j  jJ d d k r€|  j  j% d d | |  j  jH f ƒ q€nŸ| d2 k r›| d/ } | d0 } | |  j  jK } | |  j  jL }  d }! |  j  j | |  |! ƒ x@|  j D]M } | j |  j  j |  j  j ƒ | j j ƒ  rG| j j | |  |! ƒ qGqGWnå| d3 k r1d } d }  | d0 }! |  j  j | |  |! ƒ xª|  j D]M } | j |  j  j |  j  j ƒ | j j ƒ  rÝ| j j | |  |! ƒ qÝqÝWnO| d4 k rU|  j  j1 | d0 ƒ n+| d5 k r”| d0 }" |  j  j8 |" ƒ |  j j d d! g ƒ nì| d6 k r| d/ } | d0 } |  j j d d7 t | ƒ d8 t | ƒ d g ƒ |  j |  jM j jN | |  j  jG | |  j  jH d ƒ nb| d9 k r\| d0 } |  j j d d: t | ƒ d g ƒ n$| d; k r±| d/ } | d0 } |  j j d d< t | ƒ d= t | ƒ d g ƒ nÏ | d> k rï| d0 } |  j j d d? t | ƒ d g ƒ n‘ | d@ k rdA GH|  jO | | d ƒ ni | dB k r:|  jP | | d ƒ nF | dC k r]|  jQ | | d ƒ n# | dD k r€|  jR | | d ƒ n  | |  _ | |  _	 | d |  _ n  | d |  j  jS k rÛ| d |  _ |  j  j1 |  j2 ƒ n  | d |  j  jT k r| d |  _ |  j  j1 |  j2 ƒ n  | d |  j  jU k rƒ| d } | d } | d } | dE }# |  j  j% | |  j  jV | |  j  jW d f ƒ n  | jE ƒ  d- S(F   sm   
     Function to deal with keyboard/mouse events that are
     just concerned with the graphics stuff.
     i    i   i   i   i   i   i   t   do_labelt	   do_centret
   text_labelt   buttont   stateR   t   yt   xyzboxi   t   do_zoomt   screenxt   screenyt   return_labels4   atom_picking.atom_picking.insts.post_graphics_popup(t   ,s   ,"s   ",t   )t   COMMANDi   g      ð?gš™™™™™¹?g        t	   INTERRUPTg      à¿s,   DT().viewmenu.handle_clip_planes(update="1")g      à?s   DT().centre.next_residue(-1)s   DT().centre.next_residue()s:   atom_picking.atom_picking.insts.handle_keyboard_input(key=s   ,xy=[s
   ],screen=[s   ])t   key_pressesia   iz   R   Ns	   rotate-xyt   dxt   dys   rotate-zs   translate-xys   translate-zR   s
   clip-widths   object-rotate-xys8   #FLUSH atom_picking.atom_picking.insts.move_object(rotx=s   ,roty=s   object-rotate-zs8   #FLUSH atom_picking.atom_picking.insts.move_object(rotz=s   object-translate-xys6   #FLUSH atom_picking.atom_picking.insts.move_object(dx=s   ,dy=s   object-translate-zs6   #FLUSH atom_picking.atom_picking.insts.move_object(dz=s	   utility-1s   to utility-1s	   utility-2s	   utility-3s	   utility-4t
   joybuttons(X   R   t   MENUt
   jobtypeoldt   CENTRE_ON_PRIMITIVEt   findprimitivet   LABEL_PRIMITIVEt   MOUSEt   draw_simplet   oldxt   oldyt   NEARt   FARt   linet   strt   reprR?   t   putt   SPECIALt	   modifiersR   t   keyleftt   move_cameraR   t   SetupSymmetryt   rpost   extentst   objt
   IsAnchoredt   movet   keyrightt   keyupt   keydownt   KEYBOARDR!   t   countR"   R5   t   rotate_cameraR   R   t   key_escR   R   t   ALTt   extendt   get_rubber_band_planest   get_clipping_planest   FindPrimitivesInVolumet   key_eqt   zoom_cameraR*   t	   key_minust   key_comt   MoveSlabt   key_stopt   key_ltt
   ExpandSlabt   key_gtt   key_mt   UnDefineSlabt   KEYBOARD_UPt	   key_spaceR   t   LEFT_MOTIONt   MIDDLE_MOTIONt   RIGHT_MOTIONR3   t   CTRLR0   t   popR   t	   rotscaleyt	   rotscalext   win_wt   win_ht
   movescalext
   movescaleyt   selected_modelt   rotateR$   R&   R'   R(   t   WHEEL_UPt
   WHEEL_DOWNt   JOYSTICK_AXISt	   joyscaleyt	   joyscalex($   R-   t   jobt   xyzt   neart   farRI   R6   RE   t   binfoRF   RG   R   RH   RK   RL   t   modt   node1t   node2t   cmdR:   Rn   t   rott   planest   kt   shiftt   ctrlt   a1t   a2t   a3RS   RT   t   xmovet   ymovet   zmovet   deltat   buttons(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyt   glevent‚   sö   





(





		
(+

'L)


	 ! !		


	 		





\		"
" 




		

0



&'')

 #
 #


&8


)
		



0c      	   C   s-  x&|  j  D]} d } | j } | j d k r
 d d l } | j ƒ  } x | D] } | j | ƒ qM W| j | ƒ } | GHxˆ | D]€ }	 |	 j ƒ  d }
 d d l } | j	 | j
 |	 j |	 j |	 j ƒ |
 | j
 |	 j |	 j |	 j ƒ ƒ } d | _ | j j | ƒ q Wt | ƒ d k r%| j ƒ  q%q
 q
 Wd S(   sj   
      Determine which primitives are inside a volume
      defined by arbitrary numbers of planes.
      i    iÿÿÿÿN(   R   Rl   t   visiblet
   pygl_coordt   Volumet   AddPlanet   GetAtomsInVolumet	   GetAtomIDt   cprimt   Textt	   CartesianR   RH   R   t   thisownt   add_text_primitivet   lent   rebuild(   R-   R¤   RŸ   t   ninboxRl   R²   t   contained_volumet   planet   selected_atomst   att   labelR·   t   tl(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyRz   ¶  s$    	E	c         C   s‹   xh t  t |  j ƒ ƒ D]Q } |  j | j }	 |	 j d k r |	 j | | | ƒ }
 |
 d  k r` Pqg d  Sq q W|	 j |
 | | | | j ƒ d  S(   Ni    (	   t   rangeR¼   R   Rl   R±   t   findtextprimitiveR   t   MoveTextPrimitiveInWindowCoordst   dval(   R-   RI   Rœ   R�   t   quatRS   RT   t   dzR8   Rl   t   neartextprim(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyt   movetextprim×  s    c         C   s   d  S(   N(    (   R-   Rž   t   jobtype(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyR%   ã  s    c         C   s`   | d } | d } d G|  j  G| GH|  j  | k rI |  j j | | ƒ n |  j j | | ƒ d  S(   NR   RH   R#   (   RW   R   t   set_rubber_band_startt   set_rubber_band_end(   R-   Rž   RÍ   R   RH   (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyR#   æ  s    

c
         C   sE  g  }
 d } t  |  j ƒ d k r% d SxŠ t t  |  j ƒ ƒ D]s } |  j | j } | j d k r¡ |  j | j | | | |  j j ƒ |
 j	 |  j | j
 d ƒ q; |
 j	 d ƒ q; Wt |
 ƒ } | d k rÎ d S|
 j | ƒ } | |  _ |  j | } | j } | j
 d |  _ | r0| j
 d d k  r)| Sd Sn  | d k sH| d k rç| j
 d d k  rç| j
 d } | j
 d } | j | ƒ } | räd t | ƒ d	 t | ƒ d
 t | ƒ d t | ƒ d } |  j j d | g ƒ qäqçn  | d k r7| rë| j ƒ  } | r¨t j | d d | d d | d d ƒ } t j | d d | d d | d d ƒ } | j | | ƒ } |  j | j ƒ  | j ƒ  | j ƒ  | d |	 ƒq+| j ƒ  } | r+|  j | d | d | d f | d |	 ƒq+n@ | j ƒ  } | r+|  j | d | d | d f | d |	 ƒn  | |  _ n
 | j ƒ  d S(   sb   
      Search through all models' primitives to find out which
      one has been selected.
      R   i    i   i † g      à?i   i   s9   atom_picking.atom_picking.insts.handle_application_pick("s   ",RN   s   ,focus=RO   RP   R   N(   R¼   R   R   RÅ   Rl   R±   t   GetClickedLinesAndPointsR   t   draw_symmetryt   appendRa   t   minR5   R“   R)   t   AddLabelRc   Rb   R?   Rd   t   ClickedLineCoordsR²   R¹   t   MidPointt	   centre_ont   get_xt   get_yt   get_zt   ClickedPrimitiveCoordsR½   (   R-   RI   Rœ   R�   RC   RD   RM   RE   t   linesRJ   t   clicked_line_distsRÃ   R8   Rl   t   min_distt   clicked_line_idxRŸ   R    R¡   RÂ   R¢   t
   linecoordst   p1t   p2t   pt   coords(    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyRY   ð  s\     # 		>--11.c         C   sì  | \ } }	 }
 |  j  d k r‹ | r‹ d d  l } | j |  j  ƒ } | j | ƒ } | | j | ƒ } | j ƒ  } | j ƒ  }	 | j ƒ  }
 n  | rd d  l } | j | j	 | |	 |
 ƒ d ƒ } | j | j
 ƒ  d ƒ } | d | d | d | d | d | d f } n | |	 |
 f } t j ƒ  j |  j j k r­d t | d ƒ d t | d ƒ d t | d ƒ d t | ƒ d	 t | ƒ d
 } |  j j d | g ƒ n+ |  j j d | d | d | d | d | ƒ |  j d | ƒ d  S(   Niÿÿÿÿi   i    i   i   s3   build.build.insts.glthread.set_camera_origin(o_in=(RN   s
   ),radius="s   ",zoom=RO   RP   t   o_int   radiusR   RÀ   t   plane_upt   position(   R)   R²   t   GetSymmetryMatrixt	   matrixPtrR¹   RØ   RÙ   RÚ   t   listt   rotate_pointt
   get_origint	   threadingt   currentThreadt   _Thread__nameR   Rb   R?   Rd   t   set_camera_origint   update_anchored(   R-   Rå   Rl   R   Ræ   t   quickRÀ   Rç   R   RH   R   R²   t   cmatt   matt   cartRë   t   primoriginrott   ooRè   R¢   (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyR×   =  s(    !9X+c         C   sY   xR |  j  D]G } | j j ƒ  r
 | j | d | d | d f ƒ | j ƒ  q
 q
 Wd  S(   Ni    i   i   (   R   Rl   Rm   t   CentreOnt   build_primitives(   R-   Rè   RŸ   (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyRò   V  s    %(   t   __name__t
   __module__t   bindings_orderRˆ   R‰   RŠ   R=   t   Coot_bindingsR.   R,   R<   R+   RA   RB   R°   Rz   RÌ   R%   R#   RY   R   R×   Rò   (    (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyR      sh   				
		ÿ 5	!			
M(    (   t   __doc__t   Queuet   keyst   timeRî   R   (    (    (    s9   /opt/xtal/ccp4-6.5-linux32/lib/py2/ccp4mg/pygl/glevent.pyt   <module>   s   
