[pitivi/groups: 2/4] timeline: On dragEnd, get the set of toplevel elements contained



commit fec5fec65c09702f6a677524fa8dfe6eec7ed9e0
Author: Mathieu Duponchelle <mathieu duponchelle epitech eu>
Date:   Wed Jul 10 02:09:37 2013 +0200

    timeline: On dragEnd, get the set of toplevel elements contained
    
    in the lasso selection.

 pitivi/timeline/timeline.py |   65 +++++++++++++++++++++++++++++++-----------
 1 files changed, 48 insertions(+), 17 deletions(-)
---
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index 4835377..9b90b27 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -309,6 +309,42 @@ class TimelineStage(Clutter.ScrollActor, Zoomable):
 
     # Internal API
 
+    def _elementIsInLasso(self, element, x1, y1, x2, y2):
+        xE1 = element.props.x
+        xE2 = element.props.x + element.props.width
+        yE1 = element.props.y
+        yE2 = element.props.y + element.props.height
+
+        return self._overlap((x1, x2), (xE1, xE2)) and self._overlap((y1, y2), (yE1, yE2))
+
+    def _overlap(self, a, b):
+        x = max(a[0], b[0])
+        y = min(a[1], b[1])
+        return x < y
+
+    def _translate(self, event):
+        event.x -= CONTROL_WIDTH
+        event.x += self._scroll_point.x
+        event.y += self._scroll_point.y
+
+        delta_x = event.x - self.dragBeginStartX
+        delta_y = event.y - self.dragBeginStartY
+
+        newX = self.dragBeginStartX
+        newY = self.dragBeginStartY
+
+        # This is needed when you start to click and go left or up.
+
+        if delta_x < 0:
+            newX = event.x
+            delta_x = abs(delta_x)
+
+        if delta_y < 0:
+            newY = event.y
+            delta_y = abs(delta_y)
+
+        return (newX, newY, delta_x, delta_y)
+
     def _setUpDragAndDrop(self):
         self.set_reactive(True)
 
@@ -509,31 +545,26 @@ class TimelineStage(Clutter.ScrollActor, Zoomable):
         if not self.drawMarquee:
             return False
 
-        event.x -= CONTROL_WIDTH
-        event.x += self._scroll_point.x
-        event.y += self._scroll_point.y
+        x, y, width, height = self._translate(event)
 
-        delta_x = event.x - self.dragBeginStartX
-        delta_y = event.y - self.dragBeginStartY
+        self.marquee.set_position(x, y)
 
-        newX = self.dragBeginStartX
-        newY = self.dragBeginStartY
+        self.marquee.set_size(width, height)
 
-        if delta_x < 0:
-            newX = event.x
-            delta_x = abs(delta_x)
+        return False
 
-        if delta_y < 0:
-            newY = event.y
-            delta_y = abs(delta_y)
+    def _dragEndCb(self, actor, event):
+        if not self.drawMarquee:
+            return
 
-        self.marquee.set_position(newX, newY)
+        x, y, width, height = self._translate(event)
 
-        self.marquee.set_size(delta_x, delta_y)
+        elements = set({})
 
-        return False
+        for element in self.elements:
+            if self._elementIsInLasso(element, x, y, x + width, y + height):
+                elements.add(element.bElement.get_toplevel_parent())
 
-    def _dragEndCb(self, actor, event):
         self.marquee.hide()
 
     # snapping indicator


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]