import PythonQt
from PythonQt import QtCore, QtGui
import director.visualization as vis
[docs]class ViewEventFilter(object):
LEFT_DOUBLE_CLICK_EVENT = 'LEFT_DOUBLE_CLICK_EVENT'
def __init__(self, view):
self.view = view
self._leftMouseStart = None
self._rightMouseStart = None
self._handlers = {}
self.installEventFilter()
[docs] def installEventFilter(self):
self.eventFilter = PythonQt.dd.ddPythonEventFilter()
self.eventFilter.connect('handleEvent(QObject*, QEvent*)', self.filterEvent)
self.view.vtkWidget().installEventFilter(self.eventFilter)
for eventType in self.getFilteredEvents():
self.eventFilter.addFilteredEventType(eventType)
[docs] def removeEventFilter(self):
self.view.vtkWidget().removeEventFilter(self.eventFilter)
self.eventFilter.disconnect('handleEvent(QObject*, QEvent*)', self.filterEvent)
[docs] def getFilteredEvents(self):
return [QtCore.QEvent.MouseButtonDblClick,
QtCore.QEvent.MouseButtonPress,
QtCore.QEvent.MouseButtonRelease,
QtCore.QEvent.MouseMove,
QtCore.QEvent.Wheel,
QtCore.QEvent.KeyPress,
QtCore.QEvent.KeyRelease]
[docs] def addHandler(self, eventType, handler):
self._handlers.setdefault(eventType, []).append(handler)
[docs] def callHandler(self, eventType, *args, **kwargs):
for handler in self._handlers.get(eventType, []):
if handler(*args, **kwargs):
self.consumeEvent()
break
[docs] def getMousePositionInView(self, event):
return vis.mapMousePosition(self.view, event)
[docs] def getCursorDisplayPosition(self):
cursorPos = self.view.mapFromGlobal(QtGui.QCursor.pos())
return cursorPos.x(), self.view.height - cursorPos.y()
[docs] def consumeEvent(self):
self.eventFilter.setEventHandlerResult(True)
[docs] def filterEvent(self, obj, event):
if event.type() == QtCore.QEvent.MouseButtonDblClick and event.button() == QtCore.Qt.LeftButton:
self.onLeftDoubleClick(event)
elif event.type() == QtCore.QEvent.MouseButtonPress and event.button() == QtCore.Qt.LeftButton:
self._leftMouseStart = QtCore.QPoint(event.pos())
self.onLeftMousePress(event)
elif event.type() == QtCore.QEvent.MouseButtonPress and event.button() == QtCore.Qt.RightButton:
self._rightMouseStart = QtCore.QPoint(event.pos())
elif event.type() == QtCore.QEvent.MouseMove:
if self._rightMouseStart is None and self._leftMouseStart is None:
self.onMouseMove(event)
else:
if self._rightMouseStart is not None:
delta = QtCore.QPoint(event.pos()) - self._rightMouseStart
if delta.manhattanLength() > 3:
self._rightMouseStart = None
if self._leftMouseStart is not None:
delta = QtCore.QPoint(event.pos()) - self._leftMouseStart
if delta.manhattanLength() > 3:
self._leftMouseStart = None
elif event.type() == QtCore.QEvent.MouseButtonRelease and event.button() == QtCore.Qt.LeftButton and self._leftMouseStart is not None:
self._leftMouseStart = None
self.onLeftClick(event)
elif event.type() == QtCore.QEvent.MouseButtonRelease and event.button() == QtCore.Qt.RightButton and self._rightMouseStart is not None:
self._rightMouseStart = None
self.onRightClick(event)
elif event.type() == QtCore.QEvent.Wheel:
self.onMouseWheel(event)
elif event.type() == QtCore.QEvent.KeyPress:
if not event.isAutoRepeat():
self.onKeyPress(event)
self.onKeyPressRepeat(event)
elif event.type() == QtCore.QEvent.KeyRelease and not event.isAutoRepeat():
self.onKeyRelease(event)
[docs] def onMouseWheel(self, event):
pass
[docs] def onMouseMove(self, event):
pass
[docs] def onLeftMousePress(self, event):
pass
[docs] def onLeftDoubleClick(self, event):
pass
[docs] def onLeftClick(self, event):
pass
[docs] def onRightClick(self, event):
pass
[docs] def onKeyPress(self, event):
pass
[docs] def onKeyPressRepeat(self, event):
pass
[docs] def onKeyRelease(self, event):
pass