[pitivi] Make layers selectable by clicking into canvas



commit 7736f363bf4b9dceab6ef15b5aae25bb4a0aa693
Author: Paul Lange <palango gmx de>
Date:   Thu Jul 5 18:34:25 2012 +0200

    Make layers selectable by clicking into canvas

 pitivi/timeline/layer.py    |    2 +-
 pitivi/timeline/timeline.py |   34 +++++++++++++++++++++++++++++-----
 2 files changed, 30 insertions(+), 6 deletions(-)
---
diff --git a/pitivi/timeline/layer.py b/pitivi/timeline/layer.py
index 2949f7a..c4d46e6 100644
--- a/pitivi/timeline/layer.py
+++ b/pitivi/timeline/layer.py
@@ -154,7 +154,7 @@ class BaseLayerControl(gtk.EventBox, Loggable):
         """
         Send TimelineControls the changed selection
         """
-        self._app.gui.timeline_ui.controls.selectLayerControl(self._layer, self)
+        self._app.gui.timeline_ui.controls.selectLayerControl(self)
 
     def _selectionChangedCb(self):
         """
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index 1ed940b..4e44266 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -223,7 +223,7 @@ class TimelineCanvas(goocanvas.Canvas, Zoomable, Loggable):
         root.connect("motion-notify-event", self._selectionDrag)
         root.connect("button-press-event", self._selectionStart)
         root.connect("button-release-event", self._selectionEnd)
-        self.connect("button-release-event", self._snapEndedCb)
+        self.connect("button-release-event", self._buttonReleasedCb)
         # add some padding for the horizontal scrollbar
         self.set_size_request(-1, self.height)
 
@@ -397,7 +397,12 @@ class TimelineCanvas(goocanvas.Canvas, Zoomable, Loggable):
             self._snap_indicator.props.height = self.height
             self._snap_indicator.props.visibility = goocanvas.ITEM_VISIBLE
 
-    def _snapEndedCb(self, *args):
+    def _buttonReleasedCb(self, canvas, event):
+        # select clicked layer, if any
+        x, y = self.from_event(event) + self._get_adjustment(True, True)
+        self.app.gui.timeline_ui.controls.selectLayerControlForY(y)
+
+        # also hide snap indicator
         self._snap_indicator.props.visibility = goocanvas.ITEM_INVISIBLE
 
 ## settings callbacks
@@ -420,7 +425,7 @@ class TimelineCanvas(goocanvas.Canvas, Zoomable, Loggable):
             self._timeline.disconnect_by_func(self._trackAddedCb)
             self._timeline.disconnect_by_func(self._trackRemovedCb)
             self._timeline.disconnect_by_func(self._snapCb)
-            self._timeline.disconnect_by_func(self._snapEndedCb)
+            self._timeline.disconnect_by_func(self._buttonReleasedCb)
 
         self._timeline = timeline
         if self._timeline is not None:
@@ -430,7 +435,7 @@ class TimelineCanvas(goocanvas.Canvas, Zoomable, Loggable):
             self._timeline.connect("track-added", self._trackAddedCb)
             self._timeline.connect("track-removed", self._trackRemovedCb)
             self._timeline.connect("snapping-started", self._snapCb)
-            self._timeline.connect("snapping-ended", self._snapEndedCb)
+            self._timeline.connect("snapping-ended", self._buttonReleasedCb)
 
         self.zoomChanged()
 
@@ -615,10 +620,11 @@ class TimelineControls(gtk.VBox, Loggable):
             controls[ges.TRACK_TYPE_VIDEO].setSoloState(key == layer)
             controls[ges.TRACK_TYPE_AUDIO].setSoloState(key == layer)
 
-    def selectLayerControl(self, layer, layer_control):
+    def selectLayerControl(self, layer_control):
         """
         Select layer_control and unselect all other controls
         """
+        layer = layer_control._layer
         # if selected layer changed
         if self._selected_layer != layer:
             self._selected_layer = layer
@@ -641,6 +647,24 @@ class TimelineControls(gtk.VBox, Loggable):
     def getSelectedLayer(self):
         return self._selected_layer
 
+    def selectLayerControlForY(self, y):
+        """
+        Check if y is in the bounds of a layer control
+        """
+        current_y = 0
+        # count height
+        for child in self.get_children():
+            # calculate upper bound
+            next_y = current_y + child.getHeight()
+
+            # if y is in bounds, activate control and terminate
+            if y >= current_y and y <= next_y:
+                self.selectLayerControl(child)
+                return
+            # else check next control
+            else:
+                current_y = next_y + LAYER_SPACING
+
 
 class InfoStub(gtk.HBox, Loggable):
     """



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