diff options
Diffstat (limited to 'silx/gui/plot3d/scene/interaction.py')
-rw-r--r-- | silx/gui/plot3d/scene/interaction.py | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/silx/gui/plot3d/scene/interaction.py b/silx/gui/plot3d/scene/interaction.py index 2911b2c..e5cfb6d 100644 --- a/silx/gui/plot3d/scene/interaction.py +++ b/silx/gui/plot3d/scene/interaction.py @@ -1,7 +1,7 @@ # coding: utf-8 # /*########################################################################## # -# Copyright (c) 2015-2017 European Synchrotron Radiation Facility +# Copyright (c) 2015-2018 European Synchrotron Radiation Facility # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -33,6 +33,7 @@ __date__ = "25/07/2016" import logging import numpy +from silx.gui import qt from silx.gui.plot.Interaction import \ StateMachine, State, LEFT_BTN, RIGHT_BTN # , MIDDLE_BTN @@ -380,16 +381,16 @@ class FocusManager(StateMachine): """ class Idle(State): def onPress(self, x, y, btn): - for eventHandler in self.machine.eventHandlers: - requestfocus = eventHandler.handleEvent('press', x, y, btn) - if requestfocus: + for eventHandler in self.machine.currentEventHandler: + requestFocus = eventHandler.handleEvent('press', x, y, btn) + if requestFocus: self.goto('focus', eventHandler, btn) break def _processEvent(self, *args): - for eventHandler in self.machine.eventHandlers: - consumeevent = eventHandler.handleEvent(*args) - if consumeevent: + for eventHandler in self.machine.currentEventHandler: + consumeEvent = eventHandler.handleEvent(*args) + if consumeEvent: break def onMove(self, x, y): @@ -424,8 +425,10 @@ class FocusManager(StateMachine): def onWheel(self, x, y, angleInDegrees): self.eventHandler.handleEvent('wheel', x, y, angleInDegrees) - def __init__(self, eventHandlers=()): - self.eventHandlers = list(eventHandlers) + def __init__(self, eventHandlers=(), ctrlEventHandlers=None): + self.defaultEventHandlers = eventHandlers + self.ctrlEventHandlers = ctrlEventHandlers + self.currentEventHandler = self.defaultEventHandlers states = { 'idle': FocusManager.Idle, @@ -433,31 +436,48 @@ class FocusManager(StateMachine): } super(FocusManager, self).__init__(states, 'idle') + def onKeyPress(self, key): + if key == qt.Qt.Key_Control and self.ctrlEventHandlers is not None: + self.currentEventHandler = self.ctrlEventHandlers + + def onKeyRelease(self, key): + if key == qt.Qt.Key_Control: + self.currentEventHandler = self.defaultEventHandlers + def cancel(self): - for handler in self.eventHandlers: + for handler in self.currentEventHandler: handler.cancel() # CameraControl ############################################################### class RotateCameraControl(FocusManager): - """Combine wheel and rotate state machine.""" + """Combine wheel and rotate state machine for left button + and pan when ctrl is pressed + """ def __init__(self, viewport, orbitAroundCenter=False, - mode='center', scaleTransform=None): + mode='center', scaleTransform=None, + selectCB=None): handlers = (CameraWheel(viewport, mode, scaleTransform), CameraRotate(viewport, orbitAroundCenter, LEFT_BTN)) - super(RotateCameraControl, self).__init__(handlers) + ctrlHandlers = (CameraWheel(viewport, mode, scaleTransform), + CameraSelectPan(viewport, LEFT_BTN, selectCB)) + super(RotateCameraControl, self).__init__(handlers, ctrlHandlers) class PanCameraControl(FocusManager): - """Combine wheel, selectPan and rotate state machine.""" + """Combine wheel, selectPan and rotate state machine for left button + and rotate when ctrl is pressed""" def __init__(self, viewport, + orbitAroundCenter=False, mode='center', scaleTransform=None, selectCB=None): handlers = (CameraWheel(viewport, mode, scaleTransform), CameraSelectPan(viewport, LEFT_BTN, selectCB)) - super(PanCameraControl, self).__init__(handlers) + ctrlHandlers = (CameraWheel(viewport, mode, scaleTransform), + CameraRotate(viewport, orbitAroundCenter, LEFT_BTN)) + super(PanCameraControl, self).__init__(handlers, ctrlHandlers) class CameraControl(FocusManager): @@ -675,7 +695,11 @@ class PanPlaneRotateCameraControl(FocusManager): class PanPlaneZoomOnWheelControl(FocusManager): """Combine zoom on wheel and pan plane state machines.""" def __init__(self, viewport, plane, - mode='center', scaleTransform=None): + mode='center', + orbitAroundCenter=False, + scaleTransform=None): handlers = (CameraWheel(viewport, mode, scaleTransform), PlanePan(viewport, plane, LEFT_BTN)) - super(PanPlaneZoomOnWheelControl, self).__init__(handlers) + ctrlHandlers = (CameraWheel(viewport, mode, scaleTransform), + CameraRotate(viewport, orbitAroundCenter, LEFT_BTN)) + super(PanPlaneZoomOnWheelControl, self).__init__(handlers, ctrlHandlers) |