1
# PiTiVi , Non-linear video editor
3
# pitivi/ui/complextimeline.py
5
# Copyright (c) 2006, Edward Hervey <bilboed@bilboed.com>
7
# This program is free software; you can redistribute it and/or
8
# modify it under the terms of the GNU Lesser General Public
9
# License as published by the Free Software Foundation; either
10
# version 2.1 of the License, or (at your option) any later version.
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
# Lesser General Public License for more details.
17
# You should have received a copy of the GNU Lesser General Public
18
# License along with this program; if not, write to the
19
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
# Boston, MA 02111-1307, USA.
23
Timeline widgets for the complex view
29
import pitivi.instance as instance
31
from pitivi.bin import SmartTimelineBin
32
from complexlayer import LayerInfoList
33
from layerwidgets import TopLayer, CompositionLayer
34
from complexinterface import ZoomableWidgetInterface
36
class CompositionLayers(gtk.VBox, ZoomableWidgetInterface):
37
""" Souped-up VBox that contains the timeline's CompositionLayer """
39
def __init__(self, leftsizegroup, hadj, layerinfolist):
40
gtk.VBox.__init__(self)
41
self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(1,0,0))
42
self.leftSizeGroup = leftsizegroup
44
self.layerInfoList = layerinfolist
45
self.layerInfoList.connect('layer-added', self._layerAddedCb)
46
self.layerInfoList.connect('layer-removed', self._layerRemovedCb)
51
self.set_border_width(2)
53
for layerinfo in self.layerInfoList:
54
complayer = CompositionLayer(self.leftSizeGroup, self.hadj,
56
self.layers.append(complayer)
57
self.pack_start(complayer, expand=False)
60
## ZoomableWidgetInterface overrides
62
def getDuration(self):
63
return max([layer.getDuration() for layer in self.layers])
65
def getStartTime(self):
66
# the start time is always 0 (for display reason)
69
def zoomChanged(self):
70
for layer in self.layers:
73
## LayerInfoList callbacks
75
def _layerAddedCb(self, layerInfoList, position):
76
complayer = CompositionLayer(self.leftSizeGroup, self.hadj,
77
layerInfoList[position])
78
self.layers.insert(position, complayer)
79
self.pack_start(complayer, expand=False)
80
self.reorder_child(complayer, position)
82
def _layerRemovedCb(self, unused_layerInfoList, position):
83
# find the proper child
84
child = self.layers[position]
89
# Complex Timeline Design v2 (08 Feb 2006)
92
# Tree of contents (ClassName(ParentClass))
93
# -----------------------------------------
95
# ComplexTimelineWidget(gtk.VBox)
98
# +--TopLayer (TimelineLayer (gtk.HBox))
100
# | +--TopLeftTimelineWidget(?)
102
# | +--ScaleRuler(gtk.Layout)
104
# +--gtk.ScrolledWindow
106
# +--CompositionsLayer(gtk.VBox)
108
# +--CompositionLayer(TimelineLayer(gtk.HBox))
110
# +--InfoLayer(gtk.Expander)
112
# +--TrackLayer(gtk.Layout)
114
class ComplexTimelineWidget(gtk.VBox, ZoomableWidgetInterface):
116
def __init__(self, topwidget):
117
gst.log("Creating ComplexTimelineWidget")
118
gtk.VBox.__init__(self)
120
self.zoomratio = 10.0
122
self.hadj = topwidget.hadjustment
123
self.vadj = topwidget.vadjustment
125
# common LayerInfoList
126
self.layerInfoList = LayerInfoList(instance.PiTiVi.current.timeline)
127
instance.PiTiVi.playground.connect('position', self._playgroundPositionCb)
128
for layer in self.layerInfoList:
129
layer.composition.connect('start-duration-changed',
130
self._layerStartDurationChangedCb)
135
self.set_border_width(4)
136
self.leftSizeGroup = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
138
# top layer (TopLayer)
139
self.topLayer = TopLayer(self.leftSizeGroup, self.hadj)
140
# overriding topLayer's ZoomableWidgetInterface methods
141
self.topLayer.getDuration = self.getDuration
142
self.topLayer.getStartTime = self.getStartTime
143
self.topLayer.overrideZoomableWidgetInterfaceMethods()
144
self.pack_start(self.topLayer, expand=False)
146
# List of CompositionLayers
147
self.compositionLayers = CompositionLayers(self.leftSizeGroup,
148
self.hadj, self.layerInfoList)
150
# ... in a scrolled window
151
self.scrolledWindow = gtk.ScrolledWindow()
152
self.scrolledWindow.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
153
self.scrolledWindow.add_with_viewport(self.compositionLayers)
154
self.pack_start(self.scrolledWindow, expand=True)
156
def _layerStartDurationChangedCb(self, unused_composition, unused_start,
158
# Force resize of ruler
159
self.topLayer.startDurationChanged()
161
## ZoomableWidgetInterface overrides
162
## * we send everything to self.compositionLayers
163
## * topLayer's function calls will also go there
165
def getDuration(self):
166
return self.compositionLayers.getDuration()
168
def getStartTime(self):
169
return self.compositionLayers.getStartTime()
171
def zoomChanged(self):
172
self.topLayer.rightWidget.zoomChanged()
173
self.compositionLayers.zoomChanged()
178
def toolBarZoomChangedCb(self, unused_toolbar, zoomratio):
179
self.setZoomRatio(zoomratio)
181
## PlayGround timeline position callback
183
def _playgroundPositionCb(self, unused_playground, smartbin, value):
184
if isinstance(smartbin, SmartTimelineBin):
185
# for the time being we only inform the ruler
186
self.topLayer.timelinePositionChanged(value, 0)