Source code for director.viewbehaviors

import PythonQt
from PythonQt import QtCore, QtGui
import director.objectmodel as om
import director.visualization as vis
from director import cameracontrol
from director import propertyset
from director import frameupdater
from director import vieweventfilter


_contextMenuActions = []

[docs]def registerContextMenuActions(getActionsFunction): _contextMenuActions.append(getActionsFunction)
[docs]def getContextMenuActions(view, pickedObj, pickedPoint): actions = [] for func in _contextMenuActions: actions.extend(func(view, pickedObj, pickedPoint)) return actions
[docs]def getDefaultContextMenuActions(view, pickedObj, pickedPoint): def onDelete(): om.removeFromObjectModel(pickedObj) def onHide(): pickedObj.setProperty('Visible', False) def onSelect(): om.setActiveObject(pickedObj) actions = [ (None, None), ('Select', onSelect), ('Hide', onHide) ] if pickedObj.getProperty('Deletable'): actions.append(['Delete', onDelete]) return actions
registerContextMenuActions(getDefaultContextMenuActions)
[docs]def getShortenedName(name, maxLength=30): if len(name) > maxLength: name = name[:maxLength-3] + '...' return name
[docs]def showRightClickMenu(displayPoint, view): pickedObj, pickedPoint = vis.findPickedObject(displayPoint, view) if not pickedObj: return objectName = pickedObj.getProperty('Name') if objectName == 'grid': return objectName = getShortenedName(objectName) displayPoint = displayPoint[0], view.height - displayPoint[1] globalPos = view.mapToGlobal(QtCore.QPoint(*displayPoint)) menu = QtGui.QMenu(view) widgetAction = QtGui.QWidgetAction(menu) label = QtGui.QLabel('<b>%s</b>' % objectName) label.setContentsMargins(9,9,6,6) widgetAction.setDefaultWidget(label) menu.addAction(widgetAction) menu.addSeparator() propertiesPanel = PythonQt.dd.ddPropertiesPanel() propertiesPanel.setBrowserModeToWidget() propertyset.PropertyPanelHelper.addPropertiesToPanel(pickedObj.properties, propertiesPanel) def onPropertyChanged(prop): om.PropertyPanelHelper.setPropertyFromPanel(prop, propertiesPanel, pickedObj.properties) propertiesPanel.connect('propertyValueChanged(QtVariantProperty*)', onPropertyChanged) propertiesMenu = menu.addMenu('Properties') propertiesWidgetAction = QtGui.QWidgetAction(propertiesMenu) propertiesWidgetAction.setDefaultWidget(propertiesPanel) propertiesMenu.addAction(propertiesWidgetAction) actions = getContextMenuActions(view, pickedObj, pickedPoint) for actionName, func in actions: if not actionName: menu.addSeparator() else: action = menu.addAction(actionName) action.connect('triggered()', func) selectedAction = menu.popup(globalPos)
[docs]def zoomToPick(displayPoint, view): pickedPoint, prop, _ = vis.pickProp(displayPoint, view) if not prop: return flyer = cameracontrol.Flyer(view) flyer.zoomTo(pickedPoint)
[docs]def getChildFrame(obj): if hasattr(obj, 'getChildFrame'): return obj.getChildFrame()
[docs]def toggleFrameWidget(displayPoint, view): obj, _ = vis.findPickedObject(displayPoint, view) if not isinstance(obj, vis.FrameItem): obj = getChildFrame(obj) if not obj: return False edit = not obj.getProperty('Edit') obj.setProperty('Edit', edit) parent = obj.parent() if getChildFrame(parent) == obj: parent.setProperty('Alpha', 0.5 if edit else 1.0) return True
[docs]class ViewBehaviors(vieweventfilter.ViewEventFilter):
[docs] def onLeftDoubleClick(self, event): displayPoint = self.getMousePositionInView(event) if toggleFrameWidget(displayPoint, self.view): self.consumeEvent() else: self.callHandler(self.LEFT_DOUBLE_CLICK_EVENT, displayPoint, self.view, event)
[docs] def onRightClick(self, event): displayPoint = self.getMousePositionInView(event) showRightClickMenu(displayPoint, self.view)
[docs] def onKeyPress(self, event): consumed = False key = str(event.text()).lower() if key == 'f': consumed = True zoomToPick(self.getCursorDisplayPosition(), self.view) elif key == 'r': consumed = True self.view.resetCamera() self.view.render() if consumed: self.consumeEvent()
[docs] def onKeyPressRepeat(self, event): consumed = frameupdater.handleKey(event) # prevent these keys from going to vtkRenderWindow's default key press handler key = str(event.text()).lower() if key in ['r', 's', 'w', 'l', '3']: consumed = True if consumed: self.consumeEvent()