modules/pymol/embed/__init__.py (159 lines of code) (raw):
import _cmd
import threading
import pymol
P_GLUT_IDLE_EVENT = 0
P_GLUT_DISPLAY_EVENT = 1
P_GLUT_RESHAPE_EVENT = 2
P_GLUT_MOUSE_EVENT = 3
P_GLUT_MOTION_EVENT = 4
P_GLUT_CHAR_EVENT = 5
P_GLUT_SPECIAL_EVENT = 6
P_GLUT_PASSIVE_MOTION_EVENT= 7
P_GLUT_ACTIVE_ALT = 4
P_GLUT_ACTIVE_CTRL = 2
P_GLUT_ACTIVE_SHIFT = 1
P_GLUT_LEFT_BUTTON = 0
P_GLUT_MIDDLE_BUTTON = 1
P_GLUT_RIGHT_BUTTON = 2
P_GLUT_BUTTON_SCROLL_FORWARD= 3
P_GLUT_BUTTON_SCROLL_BACKWARD=4
P_GLUT_DOWN = 0
P_GLUT_UP = 1
P_GLUT_KEY_F1 = 1
P_GLUT_KEY_F2 = 2
P_GLUT_KEY_F3 = 3
P_GLUT_KEY_F4 = 4
P_GLUT_KEY_F5 = 5
P_GLUT_KEY_F6 = 6
P_GLUT_KEY_F7 = 7
P_GLUT_KEY_F8 = 8
P_GLUT_KEY_F9 = 9
P_GLUT_KEY_F10 = 10
P_GLUT_KEY_F11 = 11
P_GLUT_KEY_F12 = 12
P_GLUT_KEY_LEFT = 100
P_GLUT_KEY_UP = 101
P_GLUT_KEY_RIGHT = 102
P_GLUT_KEY_DOWN = 103
P_GLUT_KEY_PAGE_UP = 104
P_GLUT_KEY_PAGE_DOWN = 105
P_GLUT_KEY_HOME = 106
P_GLUT_KEY_END = 107
P_GLUT_KEY_INSERT = 108
special_dict = {
'F1' : P_GLUT_KEY_F1,
'F2' : P_GLUT_KEY_F2,
'F3' : P_GLUT_KEY_F3,
'F4' : P_GLUT_KEY_F4,
'F5' : P_GLUT_KEY_F5,
'F6' : P_GLUT_KEY_F6,
'F7' : P_GLUT_KEY_F7,
'F8' : P_GLUT_KEY_F8,
'F9' : P_GLUT_KEY_F9,
'F10' : P_GLUT_KEY_F10,
'F11' : P_GLUT_KEY_F11,
'F12' : P_GLUT_KEY_F12,
'LEFT' : P_GLUT_KEY_LEFT,
'UP' : P_GLUT_KEY_UP,
'RIGHT' : P_GLUT_KEY_RIGHT,
'DOWN' : P_GLUT_KEY_DOWN,
'PAGE_UP' : P_GLUT_KEY_PAGE_UP,
'PAGE_DOWN' : P_GLUT_KEY_PAGE_DOWN,
'HOME' : P_GLUT_KEY_HOME,
'END' : P_GLUT_KEY_END,
'INSERT' : P_GLUT_KEY_INSERT,
}
mod_dict = {}
def get_mod_value(shift,control,meta):
global mod_dict
mod = 0
if shift:
mod = mod + P_GLUT_ACTIVE_SHIFT
if control:
mod = mod + P_GLUT_ACTIVE_CTRL
if meta:
mod = mod + P_GLUT_ACTIVE_ALT
mod_dict[(shift,control,meta)]=mod
return mod
class EmbeddedPyMOL:
def ep_get_pymol(self):
return pymol
def ep_swap_dummy(self):
pass
def ep_init(self):
_cmd.runwxpymol()
pymol._swap_buffers = lambda s=self: s.ep_swap_dummy() # dummy swap function
self.ep_mod = 0
self.ep_button = None
self.ep_swap = None
def ep_reshape(self, width, height):
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_RESHAPE_EVENT,width,height,0,0,0)
def ep_char(self, x, y, code, shift, control, meta):
self.ep_mod = mod_dict.get((shift,control,meta))
if self.ep_mod == None:
self.ep_mod = get_mod_value(shift,control,meta)
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_CHAR_EVENT,x,y,code,0,self.ep_mod)
def ep_special(self,x,y,code,shift,control,meta):
self.ep_mod = mod_dict.get((shift,control,meta))
if self.ep_mod == None:
self.ep_mod = get_mod_value(shift,control,meta)
code = special_dict.get(code)
if code!=None:
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_SPECIAL_EVENT,x,y,code,0,self.ep_mod)
def ep_mouse_down(self,x,y,left,middle,right,shift,control,meta):
self.ep_mod = mod_dict.get((shift,control,meta))
if self.ep_mod == None:
self.ep_mod = get_mod_value(shift,control,meta)
if left:
self.ep_button = P_GLUT_LEFT_BUTTON
elif middle:
self.ep_button = P_GLUT_MIDDLE_BUTTON
elif right:
self.ep_button = P_GLUT_RIGHT_BUTTON
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_MOUSE_EVENT,x,y,self.ep_button,P_GLUT_DOWN,self.ep_mod)
def ep_mouse_up(self, x, y):
if self.ep_button != None:
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_MOUSE_EVENT,x,y,self.ep_button,P_GLUT_UP,self.ep_mod)
self.ep_button = None
def ep_motion(self, x, y, left, middle, right, shift, control, meta):
self.ep_mod = mod_dict.get((shift,control,meta))
if self.ep_mod == None:
self.ep_mod = get_mod_value(shift,control,meta)
if left:
self.ep_button = P_GLUT_LEFT_BUTTON
elif middle:
self.ep_button = P_GLUT_MIDDLE_BUTTON
elif right:
self.ep_button = P_GLUT_RIGHT_BUTTON
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_MOTION_EVENT,x,y,self.ep_button,0,self.ep_mod)
def ep_passive_motion(self, x, y, shift, control, meta):
self.ep_mod = mod_dict.get((shift,control,meta))
if self.ep_mod == None:
self.ep_mod = get_mod_value(shift,control,meta)
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_PASSIVE_MOTION_EVENT,x,y,0,0,self.ep_mod)
def ep_wheel(self, x, y, direction, shift, control, meta):
_cmd.runwxpymol()
if direction>0:
_cmd.p_glut_event(P_GLUT_MOUSE_EVENT, x,y,P_GLUT_BUTTON_SCROLL_FORWARD,0,self.ep_mod)
else:
_cmd.p_glut_event(P_GLUT_MOUSE_EVENT, x,y,P_GLUT_BUTTON_SCROLL_BACKWARD,0,self.ep_mod)
def ep_draw(self):
_cmd.runwxpymol()
_cmd.p_glut_event(P_GLUT_DISPLAY_EVENT,0,0,0,0,0) # draw event
def ep_idle(self):
_cmd.runwxpymol()
_cmd.p_glut_event(0,0,0,0,0,0)
def ep_get_redisplay(self):
_cmd.runwxpymol()
result = _cmd.p_glut_get_redisplay()
return result
def ep_set_swap_callback(self,swap):
self.ep_swap = swap
pymol._swap_buffers = lambda s=self: s.swap()