Package rocon_gateway_graph :: Module interactive_graphics_view
[frames] | no frames]

Source Code for Module rocon_gateway_graph.interactive_graphics_view

 1  #!/usr/bin/env python 
 2  # 
 3  # License: BSD 
 4  #   https://raw.github.com/robotics-in-concert/rocon_multimaster/master/rocon_gateway_graph/LICENSE  
 5  # 
 6  ############################################################################## 
 7  # Imports 
 8  ############################################################################## 
 9   
10  from __future__ import division 
11   
12  from python_qt_binding.QtCore import QPointF, QRectF, Qt 
13  from python_qt_binding.QtGui import QGraphicsView, QTransform 
14   
15  ############################################################################## 
16  # Class 
17  ############################################################################## 
18   
19   
20 -class InteractiveGraphicsView(QGraphicsView):
21
22 - def __init__(self, parent=None):
23 super(InteractiveGraphicsView, self).__init__(parent) 24 self.setObjectName('InteractiveGraphicsView') 25 26 self._last_pan_point = None 27 self._last_scene_center = None
28
29 - def mousePressEvent(self, mouse_event):
30 self._last_pan_point = mouse_event.pos() 31 self._last_scene_center = self._map_to_scene_f(QRectF(self.frameRect()).center()) 32 self.setCursor(Qt.ClosedHandCursor)
33
34 - def mouseReleaseEvent(self, mouse_event):
35 self.setCursor(Qt.OpenHandCursor) 36 self._last_pan_point = None
37
38 - def mouseMoveEvent(self, mouse_event):
39 if self._last_pan_point is not None: 40 delta_scene = self.mapToScene(mouse_event.pos()) - self.mapToScene(self._last_pan_point) 41 if not delta_scene.isNull(): 42 self.centerOn(self._last_scene_center - delta_scene) 43 self._last_scene_center -= delta_scene 44 self._last_pan_point = mouse_event.pos() 45 QGraphicsView.mouseMoveEvent(self, mouse_event)
46
47 - def wheelEvent(self, wheel_event):
48 if wheel_event.modifiers() == Qt.NoModifier: 49 num_degrees = wheel_event.delta() / 8.0 50 num_steps = num_degrees / 15.0 51 mouse_before_scale_in_scene = self.mapToScene(wheel_event.pos()) 52 53 scale_factor = 1.2 * num_steps 54 if num_steps < 0: 55 scale_factor = -1.0 / scale_factor 56 scaling = QTransform(scale_factor, 0, 0, scale_factor, 0, 0) 57 self.setTransform(self.transform() * scaling) 58 59 mouse_after_scale_in_scene = self.mapToScene(wheel_event.pos()) 60 center_in_scene = self.mapToScene(self.frameRect().center()) 61 self.centerOn(center_in_scene + mouse_before_scale_in_scene - mouse_after_scale_in_scene) 62 63 wheel_event.accept() 64 else: 65 QGraphicsView.wheelEvent(self, wheel_event)
66
67 - def _map_to_scene_f(self, pointf):
68 point = pointf.toPoint() 69 if pointf.x() == point.x() and pointf.y() == point.y(): 70 # map integer coordinates 71 return self.mapToScene(point) 72 elif pointf.x() == point.x(): 73 # map integer x and decimal y coordinates 74 pointA = self.mapToScene((pointf + QPointF(0, -0.5)).toPoint()) 75 pointB = self.mapToScene((pointf + QPointF(0, 0.5)).toPoint()) 76 return (pointA + pointB) / 2.0 77 elif pointf.y() == point.y(): 78 # map decimal x and integer y and coordinates 79 pointA = self.mapToScene((pointf + QPointF(-0.5, 0)).toPoint()) 80 pointB = self.mapToScene((pointf + QPointF(0.5, 0)).toPoint()) 81 return (pointA + pointB) / 2.0 82 else: 83 # map decimal coordinates 84 pointA = self.mapToScene((pointf + QPointF(-0.5, -0.5)).toPoint()) 85 pointB = self.mapToScene((pointf + QPointF(-0.5, 0.5)).toPoint()) 86 pointC = self.mapToScene((pointf + QPointF(0.5, -0.5)).toPoint()) 87 pointD = self.mapToScene((pointf + QPointF(0.5, 0.5)).toPoint()) 88 return (pointA + pointB + pointC + pointD) / 4.0
89