mirror of
https://github.com/schrodinger/pymol-open-source.git
synced 2026-06-03 19:54:24 +08:00
136 lines
2.9 KiB
Python
136 lines
2.9 KiB
Python
'''
|
|
Module for translating Qt key codes to PyMOL key and "special" codes
|
|
'''
|
|
|
|
from pymol.Qt import QtCore
|
|
Qt = QtCore.Qt
|
|
|
|
DEBUG = False
|
|
|
|
keyMap = {
|
|
Qt.Key.Key_Escape: 27,
|
|
Qt.Key.Key_Tab: 9,
|
|
Qt.Key.Key_Backspace: 8,
|
|
Qt.Key.Key_Return: 13,
|
|
Qt.Key.Key_Enter: 13,
|
|
Qt.Key.Key_Delete: 127,
|
|
}
|
|
|
|
specialMap = {
|
|
Qt.Key.Key_Left: 100,
|
|
Qt.Key.Key_Up: 101,
|
|
Qt.Key.Key_Right: 102,
|
|
Qt.Key.Key_Down: 103,
|
|
Qt.Key.Key_PageUp: 104,
|
|
Qt.Key.Key_PageDown: 105,
|
|
Qt.Key.Key_Home: 106,
|
|
Qt.Key.Key_End: 107,
|
|
Qt.Key.Key_Insert: 108,
|
|
Qt.Key.Key_F1: 1,
|
|
Qt.Key.Key_F2: 2,
|
|
Qt.Key.Key_F3: 3,
|
|
Qt.Key.Key_F4: 4,
|
|
Qt.Key.Key_F5: 5,
|
|
Qt.Key.Key_F6: 6,
|
|
Qt.Key.Key_F7: 7,
|
|
Qt.Key.Key_F8: 8,
|
|
Qt.Key.Key_F9: 9,
|
|
Qt.Key.Key_F10: 10,
|
|
Qt.Key.Key_F11: 11,
|
|
Qt.Key.Key_F12: 12,
|
|
}
|
|
|
|
|
|
def get_modifiers(ev):
|
|
'''Get modifers from event and translate into PyMOL modifier mask'''
|
|
pymolmod = 0
|
|
qtmodifiers = ev.modifiers()
|
|
|
|
for mask, qtm in [
|
|
(0x1, Qt.KeyboardModifier.ShiftModifier),
|
|
(0x2, Qt.KeyboardModifier.MetaModifier), # CTRL on Mac
|
|
(0x2, Qt.KeyboardModifier.ControlModifier),
|
|
(0x4, Qt.KeyboardModifier.AltModifier)
|
|
]:
|
|
if qtmodifiers & qtm:
|
|
pymolmod |= mask
|
|
|
|
return pymolmod
|
|
|
|
|
|
def keyPressEventToPyMOLButtonArgs(ev):
|
|
# translate modifier mask
|
|
pymolmod = get_modifiers(ev)
|
|
|
|
# Qt::Key_*
|
|
key = ev.key()
|
|
|
|
if key in specialMap:
|
|
k = specialMap[key]
|
|
|
|
# PyMOL_Special
|
|
state = -2
|
|
else:
|
|
# PyMOL_Key
|
|
state = -1
|
|
|
|
# doesn't work on Mac: k = keyMap.get(key, ev.nativeVirtualKey())
|
|
k = keyMap.get(key, -1)
|
|
if k == -1:
|
|
text = ev.text()
|
|
if text:
|
|
k = ord(text)
|
|
|
|
# CTRL-<key>
|
|
if k == -1 and (pymolmod & 0x2):
|
|
k = key - 64
|
|
|
|
# ALT-<key>
|
|
if k != -1 and (pymolmod & 0x4):
|
|
k = key
|
|
|
|
if k > 255 or k < 0:
|
|
if DEBUG:
|
|
print('DEBUG: skipped: 0x%x 0x%x' % (key, k))
|
|
return
|
|
|
|
return (k, state, 0, 0, pymolmod)
|
|
|
|
|
|
def get_wheel_delta(ev):
|
|
'''
|
|
Get mouse wheel delta from event.
|
|
Ignores horizontal scrolling (returns zero).
|
|
'''
|
|
try:
|
|
# Qt4
|
|
return ev.delta()
|
|
except AttributeError:
|
|
pass
|
|
|
|
# Qt5
|
|
angledelta = ev.angleDelta()
|
|
delta_x = angledelta.x()
|
|
delta_y = angledelta.y()
|
|
|
|
if abs(delta_y) < abs(delta_x):
|
|
# Shift+Wheel emulates horizontal scrolling
|
|
if not (ev.modifiers() & Qt.KeyboardModifier.ShiftModifier):
|
|
return 0
|
|
return delta_x
|
|
|
|
return delta_y
|
|
|
|
|
|
def get_wheel_button(ev):
|
|
'''
|
|
Get mouse wheel button index (3 or 4) from event, or 0 if no vertial
|
|
scrolling was detected.
|
|
'''
|
|
delta = get_wheel_delta(ev)
|
|
if delta > 0:
|
|
return 3
|
|
if delta < 0:
|
|
return 4
|
|
return 0
|