summaryrefslogtreecommitdiff
path: root/silx/gui/plot3d/scene/interaction.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/plot3d/scene/interaction.py')
-rw-r--r--silx/gui/plot3d/scene/interaction.py58
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)