[pitivi] timelineedges: keep track of which track objects are associated with particular edges
- From: Edward Hervey <edwardrv src gnome org>
- To: svn-commits-list gnome org
- Subject: [pitivi] timelineedges: keep track of which track objects are associated with particular edges
- Date: Fri, 10 Jul 2009 11:40:38 +0000 (UTC)
commit 0cfaf0e2be983786e41b15548beaa84953555862
Author: Brandon Lewis <brandon_lewis berkeley edu>
Date: Tue Apr 21 13:26:41 2009 -0700
timelineedges: keep track of which track objects are associated with particular edges
pitivi/timeline/timeline.py | 64 +++++++++++++++++++++++++-----------------
1 files changed, 38 insertions(+), 26 deletions(-)
---
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index c89ef94..9e67b5c 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -361,6 +361,7 @@ class TimelineObject(Signallable, Loggable):
# if self is not yet in a timeline, the caller needs to add "other"
# as well when it adds self
self.timeline.addTimelineObject(other)
+ self.timeline.rebuildEdges()
self.emit('duration-changed', self.duration)
@@ -655,6 +656,9 @@ class TimelineEdges(object):
"""
def __init__(self):
self.edges = []
+ self.by_start = {}
+ self.by_end = {}
+ self.by_either = {}
def addTimelineObject(self, timeline_object):
"""
@@ -678,34 +682,43 @@ class TimelineEdges(object):
self.removeTrackObject(obj)
def addTrackObject(self, track_object):
- self.addStartEnd(track_object.start,
- track_object.start + track_object.duration)
+ start = track_object.start
+ end = track_object.start + track_object.duration
+ self.addStart(start)
+ self.addEnd(end)
+ self.by_start[start].append(track_object)
+ self.by_end[end].append(track_object)
+ self.by_either[start].append(track_object)
+ self.by_either[end].append(track_object)
def removeTrackObject(self, track_object):
- self.removeStartEnd(track_object.start,
- track_object.start + track_object.duration)
+ start = track_object.start
+ end = track_object.start + track_object.duration
+
+ self.by_start[start].remove(track_object)
+ self.by_end[end].remove(track_object)
+ if not self.by_start[start]:
+ if not self.by_end[end]:
+ self.removeStartEnd(start, end)
+ else:
+ self.removeStartEnd(start)
- def addStartEnd(self, start, end=None):
- """
- Add the given start/end values to the list of edges being tracked.
+ def addStart(self, start):
+ self.addEdge(start)
+ if start not in self.by_start:
+ self.by_start[start] = []
+
+ def addEnd(self, end):
+ if end not in self.by_end:
+ self.addEdge(end)
+ self.by_end[end] = []
+
+ def addEdge(self, edge):
+ if edge not in self.by_either:
+ index = bisect_right(self.edges, edge)
+ self.edges.insert(index, edge)
+ self.by_either[edge] = []
- @param start: A start position to track.
- @type start: L{long}
- @param end: A stop position to track.
- @type end: L{long}
- """
- # Only allow one instance of any particular edge. Since bisect right
- # returns the index *after* any previous element in the list, we check
- # to see whether the previous index already contains the item we are
- # looking for.
- index = bisect_right(self.edges, start)
- if (len(self.edges) == 0) or (self.edges[index - 1] != start):
- self.edges.insert(index, start)
- if end is not None:
- index = bisect_right(self.edges, end, index)
- if (len(self.edges) == 0) or (self.edges[index - 1] != end):
- self.edges.insert(index, end)
-
def removeStartEnd(self, start, end=None):
"""
Remove the given start/end values from the list of edges being tracked.
@@ -907,7 +920,6 @@ class Timeline(Signallable, Loggable):
obj.timeline = None
self.rebuildEdges()
- #self.edges.removeTimelineObject(obj)
self.emit("timeline-object-removed", obj)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]