|
|
@@ -10,10 +10,11 @@ class RotationGesture(Gesture, Positionable):
|
|
|
"""
|
|
|
_type = 'rotate'
|
|
|
|
|
|
- def __init__(self, event, centroid, angle):
|
|
|
+ def __init__(self, event, centroid, angle, n=1):
|
|
|
Gesture.__init__(self, event)
|
|
|
Positionable.__init__(self, *centroid.get_position())
|
|
|
self.angle = angle
|
|
|
+ self.n = n
|
|
|
|
|
|
def __str__(self):
|
|
|
return '<RotationGesture at (%s, %s) angle=%s>' \
|
|
|
@@ -30,10 +31,11 @@ class PinchGesture(Gesture, Positionable):
|
|
|
"""
|
|
|
_type = 'pinch'
|
|
|
|
|
|
- def __init__(self, event, centroid, scale):
|
|
|
+ def __init__(self, event, centroid, scale, n=1):
|
|
|
Gesture.__init__(self, event)
|
|
|
Positionable.__init__(self, *centroid.get_position())
|
|
|
self.scale = scale
|
|
|
+ self.n = n
|
|
|
|
|
|
def __str__(self):
|
|
|
return '<PinchGesture at (%s, %s) scale=%s>' \
|
|
|
@@ -80,11 +82,9 @@ class TransformationTracker(GestureTracker):
|
|
|
self.points = []
|
|
|
|
|
|
# Current and previous centroid of all touch points
|
|
|
- self.prev_centroid = self.centroid = None
|
|
|
+ self.centroid = None
|
|
|
|
|
|
def update_centroid(self):
|
|
|
- self.prev_centroid = self.centroid
|
|
|
-
|
|
|
if not self.points:
|
|
|
self.centroid = None
|
|
|
return
|
|
|
@@ -102,9 +102,6 @@ class TransformationTracker(GestureTracker):
|
|
|
else:
|
|
|
self.centroid = MovingPositionable(x, y)
|
|
|
|
|
|
- #wx, wy = self.area.get_screen_offset()
|
|
|
- #self.centroid.translate(-wx, -wy)
|
|
|
-
|
|
|
def on_point_down(self, event):
|
|
|
self.points.append(event.point)
|
|
|
self.update_centroid()
|
|
|
@@ -118,26 +115,26 @@ class TransformationTracker(GestureTracker):
|
|
|
l = len(self.points)
|
|
|
|
|
|
if l > 1:
|
|
|
+ offset_centroid = self.centroid - self.area.get_screen_offset()
|
|
|
+ print self.centroid, self.area, offset_centroid
|
|
|
+
|
|
|
# Rotation (around the previous centroid)
|
|
|
rotation = point.rotation_around(self.centroid) / l
|
|
|
- self.trigger(RotationGesture(event, self.centroid, rotation))
|
|
|
+ self.trigger(RotationGesture(event, offset_centroid, rotation, l))
|
|
|
|
|
|
# Scale
|
|
|
- prev = point.get_previous_position().distance_to(self.centroid)
|
|
|
- dist = point.distance_to(self.centroid)
|
|
|
+ prev = self.centroid.distance_to(point.get_previous_position())
|
|
|
+ dist = self.centroid.distance_to(point)
|
|
|
dist = prev + (dist - prev) / l
|
|
|
scale = dist / prev
|
|
|
- self.trigger(PinchGesture(event, self.centroid, scale))
|
|
|
+ self.trigger(PinchGesture(event, offset_centroid, scale, l))
|
|
|
|
|
|
- # Update centroid before movement can be detected
|
|
|
- self.update_centroid()
|
|
|
+ # Update centroid before movement can be detected
|
|
|
+ self.update_centroid()
|
|
|
|
|
|
- # Movement using multiple touch points
|
|
|
- self.trigger(DragGesture(event, self.centroid,
|
|
|
- self.centroid.translation(), l))
|
|
|
- else:
|
|
|
- # Movement using one touch point
|
|
|
- self.trigger(DragGesture(event, point, point.translation()))
|
|
|
+ # Movement using multiple touch points
|
|
|
+ self.trigger(DragGesture(event, self.centroid,
|
|
|
+ self.centroid.translation(), l))
|
|
|
|
|
|
def on_point_up(self, event):
|
|
|
if event.point not in self.points:
|