def __init__(self, element, composition, timeline): goocanvas.Group.__init__(self) View.__init__(self) Zoomable.__init__(self) self.element = element self.comp = composition self.timeline = timeline self.bg = goocanvas.Rect(height=self.__HEIGHT__, fill_color_rgba=self.__NORMAL__, line_width=0) self.content = Preview(self.element) self.name = goocanvas.Text(x=10, text=os.path.basename( unquote(element.factory.name)), font="Sans 9", fill_color_rgba=0x000000FF, alignment=pango.ALIGN_LEFT) self.start_handle = StartHandle(element, timeline, height=self.__HEIGHT__) self.end_handle = EndHandle(element, timeline, height=self.__HEIGHT__) for thing in (self.bg, self.content, self.start_handle, self.end_handle, self.name): self.add_child(thing) if element: self.zoomChanged() self.normal()
def __init__(self, element, composition, timeline): goocanvas.Group.__init__(self) View.__init__(self) Zoomable.__init__(self) self.element = element self.comp = composition self.timeline = timeline self.bg = goocanvas.Rect( height=self.__HEIGHT__, fill_color_rgba=self.__NORMAL__, line_width=0) self.content = Preview(self.element) self.name = goocanvas.Text( x=10, text=os.path.basename(unquote(element.factory.name)), font="Sans 9", fill_color_rgba=0x000000FF, alignment=pango.ALIGN_LEFT) self.start_handle = StartHandle(element, timeline, height=self.__HEIGHT__) self.end_handle = EndHandle(element, timeline, height=self.__HEIGHT__) for thing in (self.bg, self.content, self.start_handle, self.end_handle, self.name): self.add_child(thing) if element: self.zoomChanged() self.normal()
def __init__(self, element, timeline, **kwargs): self.element = element self.timeline = timeline goocanvas.Rect.__init__(self, width=5, fill_color_rgba=0x00000022, line_width=0, **kwargs) View.__init__(self) Zoomable.__init__(self)
def __init__(self, instance, element, timeline, **kwargs): self.app = instance self.element = element self.timeline = timeline goocanvas.Image.__init__(self, pixbuf=TRIMBAR_PIXBUF, line_width=0, **kwargs) View.__init__(self) Zoomable.__init__(self)
def __init__(self, element, timeline, **kwargs): self.element = element self.timeline = timeline goocanvas.Rect.__init__(self, width=5, fill_color_rgba=0x00000022, line_width=0, **kwargs ) View.__init__(self) Zoomable.__init__(self)
def __init__(self, instance, element, timeline, **kwargs): self.app = instance self.element = element self.timeline = timeline goocanvas.Image.__init__(self, pixbuf = TRIMBAR_PIXBUF, line_width=0, pointer_events=goocanvas.EVENTS_FILL, **kwargs ) View.__init__(self) Zoomable.__init__(self)
def __init__(self, instance, element, track, timeline): goocanvas.Group.__init__(self) View.__init__(self) Zoomable.__init__(self) self.app = instance self.track = track self.timeline = timeline self.namewidth = 0 self.nameheight = 0 self.bg = goocanvas.Rect(height=self.height, line_width=0) self.content = Preview(element) self.name = goocanvas.Text(x=NAME_HOFFSET + NAME_PADDING, y=NAME_VOFFSET + NAME_PADDING, operator=cairo.OPERATOR_ADD, alignment=pango.ALIGN_LEFT) self.namebg = goocanvas.Rect(radius_x=2, radius_y=2, x=NAME_HOFFSET, y=NAME_VOFFSET, line_width=0) self.start_handle = StartHandle(self.app, element, timeline, height=self.height) self.end_handle = EndHandle(self.app, element, timeline, height=self.height) self.selection_indicator = goocanvas.Rect( visibility=goocanvas.ITEM_INVISIBLE, line_width=0.0, height=self.height) for thing in (self.bg, self.content, self.selection_indicator, self.start_handle, self.end_handle, self.namebg, self.name): self.add_child(thing) for prop, interpolator in element.getInterpolators().itervalues(): self.add_child(Curve(instance, element, interpolator, 50)) self.element = element self.settings = instance.settings self.normal()
def __init__(self, instance, element, track, timeline): goocanvas.Group.__init__(self) View.__init__(self) Zoomable.__init__(self) self.app = instance self.track = track self.timeline = timeline self.namewidth = 0 self.nameheight = 0 self.bg = goocanvas.Rect( height=self.height, line_width=1) self.content = Preview(self.app, element) self.name = goocanvas.Text( x= NAME_HOFFSET + NAME_PADDING, y= NAME_VOFFSET + NAME_PADDING, operator = cairo.OPERATOR_ADD, alignment=pango.ALIGN_LEFT) self.namebg = goocanvas.Rect( radius_x = 2, radius_y = 2, x = NAME_HOFFSET, y = NAME_VOFFSET, line_width = 0) self.start_handle = StartHandle(self.app, element, timeline, height=self.height) self.end_handle = EndHandle(self.app, element, timeline, height=self.height) self.selection_indicator = goocanvas.Rect( visibility=goocanvas.ITEM_INVISIBLE, line_width = 0.0, height=self.height) for thing in (self.bg, self.content, self.selection_indicator, self.start_handle, self.end_handle, self.namebg, self.name): self.add_child(thing) for prop, interpolator in element.getInterpolators().itervalues(): self.add_child(Curve(instance, element, interpolator)) self.element = element self.settings = instance.settings self.unfocus()
def _move_temp_source(self, x, y): x1, y1, x2, y2 = self._controls.get_allocation() offset = 10 + (x2 - x1) x, y = self._canvas.convert_from_pixels(x - offset, y) priority = int((y // (LAYER_HEIGHT_EXPANDED + LAYER_SPACING))) delta = Zoomable.pixelToNs(x) self._move_context.editTo(delta, priority)
def set_pos(self, item, pos): x, y = pos position = Zoomable.pixelToNs(x + self._hadj.get_value()) priority = int((y - self._y_offset + self._vadj.get_value()) // (LAYER_HEIGHT_EXPANDED + LAYER_SPACING)) self._context.setMode(self._getMode()) self._context.editTo(position, priority)
def set_pos(self, item, pos): x, y = pos position = Zoomable.pixelToNs(x) priority = int( (y - self._y_offset) // (LAYER_HEIGHT_EXPANDED + LAYER_SPACING)) self._context.setMode(self._getMode()) self._context.editTo(position, priority)
def scrollToPlayhead(self): width = self.get_allocation().width new_pos = Zoomable.nsToPixel(self._position) scroll_pos = self.hadj.get_value() if (new_pos < scroll_pos) or (new_pos > scroll_pos + width): self.scrollToPosition(new_pos - width / 2) return False
def _updateScrollAdjustments(self): a = self.get_allocation() size = Zoomable.nsToPixel(self.timeline.duration) self.hadj.props.lower = 0 self.hadj.props.upper = size + 200 # why is this necessary??? self.hadj.props.page_size = a.width self.hadj.props.page_increment = size * 0.9 self.hadj.props.step_increment = size * 0.1
def __init__(self, instance, ui_manager): gtk.Table.__init__(self, rows=2, columns=1, homogeneous=False) Loggable.__init__(self) Zoomable.__init__(self) self.log("Creating Timeline") self._updateZoom = True self.project = None self.ui_manager = ui_manager self.app = instance self._temp_objects = None self._factories = None self._finish_drag = False self._position = 0 self._state = gst.STATE_NULL self._createUI() self._prev_duration = 0 self.rate = gst.Fraction(1, 1)
def scrollToPlayhead(self): """ Scroll the current position as close to the center of the view as possible (as close as the timeline canvas allows). """ page_size = self.hadj.get_page_size() new_pos = Zoomable.nsToPixel(self._position) scroll_pos = self.hadj.get_value() if (new_pos > scroll_pos + page_size) or (new_pos < scroll_pos): self.scrollToPosition(min(new_pos - page_size / 2, self.hadj.upper - page_size - 1)) return False
def zoomChanged(self): if self._updateZoom: self._zoomAdjustment.set_value(self.getCurrentZoomLevel()) # the new scroll position should preserve the current horizontal # position of the playhead in the window cur_playhead_offset = self._canvas._playhead.props.x - self.hadj.props.value new_pos = Zoomable.nsToPixel(self._position) - cur_playhead_offset self._updateScrollAdjustments() self._scrollToPosition(new_pos) self.ruler.queue_resize() self.ruler.queue_draw()
def zoomChanged(self): if self._updateZoom: self._zoomAdjustment.set_value(self.getCurrentZoomLevel()) # the new scroll position should preserve the current horizontal # position of the playhead in the window cur_playhead_offset = self._canvas._playhead.props.x -\ self.hadj.props.value new_pos = Zoomable.nsToPixel(self._position) - cur_playhead_offset self._updateScrollAdjustments() self._scrollToPosition(new_pos) self.ruler.queue_resize() self.ruler.queue_draw()
def _scrollEventCb(self, canvas, event): if event.state & gtk.gdk.SHIFT_MASK: # shift + scroll => vertical (up/down) scroll if event.direction == gtk.gdk.SCROLL_UP: self.scroll_up() elif event.direction == gtk.gdk.SCROLL_DOWN: self.scroll_down() event.state &= ~gtk.gdk.SHIFT_MASK elif event.state & gtk.gdk.CONTROL_MASK: # zoom + scroll => zooming (up: zoom in) if event.direction == gtk.gdk.SCROLL_UP: Zoomable.zoomIn() return True elif event.direction == gtk.gdk.SCROLL_DOWN: Zoomable.zoomOut() return True return False else: if event.direction == gtk.gdk.SCROLL_UP: self.scroll_left() elif event.direction == gtk.gdk.SCROLL_DOWN: self.scroll_right() return True
def click(self, pos): timeline = self._view.timeline element = self._view.element element_end = element.start + element.duration if self._last_event.get_state() & gtk.gdk.SHIFT_MASK: timeline.setSelectionToObj(element, SELECT_BETWEEN) elif self._last_event.get_state() & gtk.gdk.CONTROL_MASK: if element.selected: mode = UNSELECT else: mode = SELECT_ADD timeline.setSelectionToObj(element, mode) else: self._view.app.current.seeker.seek(Zoomable.pixelToNs(pos[0])) timeline.setSelectionToObj(element, SELECT)
def click(self, pos): timeline = self._view.timeline element = self._view.element element_end = element.start + element.duration if self._last_event.get_state() & gtk.gdk.SHIFT_MASK: timeline.setSelectionToObj(element, SELECT_BETWEEN) elif self._last_event.get_state() & gtk.gdk.CONTROL_MASK: if element.selected: mode = UNSELECT else: mode = SELECT_ADD timeline.setSelectionToObj(element, mode) else: self._view.app.current.seeker.seek( Zoomable.pixelToNs(pos[0])) timeline.setSelectionToObj(element, SELECT)
def _zoomAdjustmentChangedCb(self, adjustment): # GTK crack self._updateZoom = False Zoomable.setZoomLevel(int(adjustment.get_value())) self._updateZoom = True
def _updateScrollPosition(self, adjustment): self._scroll_pos_ns = Zoomable.pixelToNs(self.hadj.get_value()) self._root_item.set_simple_transform(-self.hadj.get_value(), -self.vadj.get_value(), 1.0, 0)
def _createUI(self): self.leftSizeGroup = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) self.props.row_spacing = 2 self.props.column_spacing = 2 self.hadj = gtk.Adjustment() self.vadj = gtk.Adjustment() # zooming slider self._zoomAdjustment = gtk.Adjustment() self._zoomAdjustment.set_value(Zoomable.getCurrentZoomLevel()) self._zoomAdjustment.connect("value-changed", self._zoomAdjustmentChangedCb) self._zoomAdjustment.props.lower = 0 self._zoomAdjustment.props.upper = Zoomable.zoom_steps zoomslider = gtk.HScale(self._zoomAdjustment) zoomslider.props.draw_value = False zoomslider.set_tooltip_text(_("Zoom Timeline")) self.attach(zoomslider, 0, 1, 0, 1, yoptions=0, xoptions=gtk.FILL) # controls for tracks and layers self._controls = TimelineControls() controlwindow = gtk.Viewport(None, self.vadj) controlwindow.add(self._controls) controlwindow.set_size_request(-1, 1) controlwindow.set_shadow_type(gtk.SHADOW_OUT) self.attach(controlwindow, 0, 1, 1, 2, xoptions=0) # timeline ruler self.ruler = ruler.ScaleRuler(self.app, self.hadj) self.ruler.set_size_request(0, 25) self.ruler.set_border_width(2) self.ruler.connect("key-press-event", self._keyPressEventCb) self.ruler.connect("size-allocate", self._rulerSizeAllocateCb) rulerframe = gtk.Frame() rulerframe.set_shadow_type(gtk.SHADOW_OUT) rulerframe.add(self.ruler) self.attach(rulerframe, 1, 2, 0, 1, yoptions=0) # proportional timeline self._canvas = TimelineCanvas(self.app) self._root_item = self._canvas.get_root_item() self.attach(self._canvas, 1, 2, 1, 2) # scrollbar self._hscrollbar = gtk.HScrollbar(self.hadj) self._vscrollbar = gtk.VScrollbar(self.vadj) self.attach(self._hscrollbar, 1, 2, 2, 3, yoptions=0) self.attach(self._vscrollbar, 2, 3, 1, 2, xoptions=0) self.hadj.connect("value-changed", self._updateScrollPosition) self.vadj.connect("value-changed", self._updateScrollPosition) # error infostub self.infostub = InfoStub() self.attach(self.infostub, 1, 2, 4, 5, yoptions=0) self.show_all() self.infostub.hide() # toolbar actions actions = ( ("ZoomIn", gtk.STOCK_ZOOM_IN, None, "<Control>plus", ZOOM_IN, self._zoomInCb), ("ZoomOut", gtk.STOCK_ZOOM_OUT, None, "<Control>minus", ZOOM_OUT, self._zoomOutCb), # actions for adding additional accelerators ("ControlEqualAccel", gtk.STOCK_ZOOM_IN, None, "<Control>equal", ZOOM_IN, self._zoomInCb), ("ControlKPAddAccel", gtk.STOCK_ZOOM_IN, None, "<Control>KP_Add", ZOOM_IN, self._zoomInCb), ("ControlKPSubtractAccel", gtk.STOCK_ZOOM_OUT, None, "<Control>KP_Subtract", ZOOM_OUT, self._zoomOutCb), ) selection_actions = ( ("DeleteObj", gtk.STOCK_DELETE, None, "Delete", DELETE, self.deleteSelected), ("UnlinkObj", "pitivi-unlink", None, "<Shift><Control>L", UNLINK, self.unlinkSelected), ("LinkObj", "pitivi-link", None, "<Control>L", LINK, self.linkSelected), ("UngroupObj", "pitivi-ungroup", None, "<Shift><Control>G", UNGROUP, self.ungroupSelected), ("GroupObj", "pitivi-group", None, "<Control>G", GROUP, self.groupSelected), ) self.playhead_actions = ( ("Split", "pitivi-split", _("Split"), "S", SPLIT, self.split), ("Keyframe", "pitivi-keyframe", _("Add a keyframe"), "K", KEYFRAME, self.keyframe), ("Prevframe", "pitivi-prevframe", _("_Prevframe"), "E", PREVFRAME, self.prevframe), ("Nextframe", "pitivi-nextframe", _("_Nextframe"), "R", NEXTFRAME, self.nextframe), ) actiongroup = gtk.ActionGroup("timelinepermanent") actiongroup.add_actions(actions) self.ui_manager.insert_action_group(actiongroup, 0) actiongroup = gtk.ActionGroup("timelineselection") actiongroup.add_actions(selection_actions) actiongroup.add_actions(self.playhead_actions) self.link_action = actiongroup.get_action("LinkObj") self.unlink_action = actiongroup.get_action("UnlinkObj") self.group_action = actiongroup.get_action("GroupObj") self.ungroup_action = actiongroup.get_action("UngroupObj") self.delete_action = actiongroup.get_action("DeleteObj") self.split_action = actiongroup.get_action("Split") self.keyframe_action = actiongroup.get_action("Keyframe") self.prevframe_action = actiongroup.get_action("Prevframe") self.nextframe_action = actiongroup.get_action("Nextframe") self.ui_manager.insert_action_group(actiongroup, -1) self.ui_manager.add_ui_from_string(ui) # drag and drop self.drag_dest_set(gtk.DEST_DEFAULT_MOTION, [dnd.FILESOURCE_TUPLE, dnd.EFFECT_TUPLE], gtk.gdk.ACTION_COPY) self.connect("drag-data-received", self._dragDataReceivedCb) self.connect("drag-leave", self._dragLeaveCb) self.connect("drag-drop", self._dragDropCb) self.connect("drag-motion", self._dragMotionCb) self._canvas.connect("button-press-event", self._buttonPress) self._canvas.connect("button-release-event", self._buttonRelease) self._canvas.connect("key-press-event", self._keyPressEventCb)
def _zoomInCb(self, unused_action): Zoomable.zoomIn()
def _createUI(self): self.leftSizeGroup = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) self.props.row_spacing = 2 self.props.column_spacing = 2 self.hadj = gtk.Adjustment() self.vadj = gtk.Adjustment() # zooming slider self._zoomAdjustment = gtk.Adjustment() self._zoomAdjustment.set_value(Zoomable.getCurrentZoomLevel()) self._zoomAdjustment.connect("value-changed", self._zoomAdjustmentChangedCb) self._zoomAdjustment.props.lower = 0 self._zoomAdjustment.props.upper = Zoomable.zoom_steps zoomslider = gtk.HScale(self._zoomAdjustment) zoomslider.props.draw_value = False zoomslider.set_tooltip_text(_("Zoom Timeline")) self.attach(zoomslider, 0, 1, 0, 1, yoptions=0, xoptions=gtk.FILL) # controls for tracks and layers self._controls = TimelineControls() controlwindow = gtk.Viewport(None, self.vadj) controlwindow.add(self._controls) controlwindow.set_size_request(-1, 1) controlwindow.set_shadow_type(gtk.SHADOW_OUT) self.attach(controlwindow, 0, 1, 1, 2, xoptions=0) # timeline ruler self.ruler = ruler.ScaleRuler(self.app, self.hadj) self.ruler.set_size_request(0, 25) self.ruler.set_border_width(2) self.ruler.connect("key-press-event", self._keyPressEventCb) self.ruler.connect("size-allocate", self._rulerSizeAllocateCb) rulerframe = gtk.Frame() rulerframe.set_shadow_type(gtk.SHADOW_OUT) rulerframe.add(self.ruler) self.attach(rulerframe, 1, 2, 0, 1, yoptions=0) # proportional timeline self._canvas = TimelineCanvas(self.app) timelinewindow = gtk.ScrolledWindow(self.hadj, self.vadj) timelinewindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) timelinewindow.add(self._canvas) timelinewindow.set_shadow_type(gtk.SHADOW_IN) timelinewindow.set_name("timelinewindow") # temp fix for padding between scrollbar and scrolled window #FIXME: should be set at an global position for easy editing? gtk.rc_parse_string(""" style 'timelinewindow' { GtkScrolledWindow::scrollbar-spacing = 0 } widget '*.timelinewindow' style 'timelinewindow' """) self.attach(timelinewindow, 1, 2, 1, 2) # error infostub self.infostub = InfoStub() self.attach(self.infostub, 1, 2, 2, 3, yoptions=0) self.show_all() self.infostub.hide() # toolbar actions actions = ( ("ZoomIn", gtk.STOCK_ZOOM_IN, None, "<Control>equal", ZOOM_IN, self._zoomInCb), ("ZoomOut", gtk.STOCK_ZOOM_OUT, None, "<Control>minus", ZOOM_OUT, self._zoomOutCb), ) selection_actions = ( ("DeleteObj", gtk.STOCK_DELETE, None, "Delete", DELETE, self.deleteSelected), ("UnlinkObj", "pitivi-unlink", None, "<Shift><Control>L", UNLINK, self.unlinkSelected), ("LinkObj", "pitivi-link", None, "<Control>L", LINK, self.linkSelected), ("UngroupObj", "pitivi-ungroup", None, "<Shift><Control>G", UNGROUP, self.ungroupSelected), ("GroupObj", "pitivi-group", None, "<Control>G", GROUP, self.groupSelected), ) playhead_actions = ( ("Split", "pitivi-split", _("Split"), "S", SPLIT, self.split), ) actiongroup = gtk.ActionGroup("timelinepermanent") actiongroup.add_actions(actions) actiongroup.add_actions(playhead_actions) self.ui_manager.insert_action_group(actiongroup, 0) actiongroup = gtk.ActionGroup("timelineselection") actiongroup.add_actions(selection_actions) self.link_action = actiongroup.get_action("LinkObj") self.unlink_action = actiongroup.get_action("UnlinkObj") self.group_action = actiongroup.get_action("GroupObj") self.ungroup_action = actiongroup.get_action("UngroupObj") self.delete_action = actiongroup.get_action("DeleteObj") self.ui_manager.insert_action_group(actiongroup, -1) self.ui_manager.add_ui_from_string(ui) # drag and drop self.drag_dest_set(gtk.DEST_DEFAULT_MOTION, [dnd.FILESOURCE_TUPLE], gtk.gdk.ACTION_COPY) self.connect("drag-data-received", self._dragDataReceivedCb) self.connect("drag-leave", self._dragLeaveCb) self.connect("drag-drop", self._dragDropCb) self.connect("drag-motion", self._dragMotionCb) self._canvas.connect("button-press-event", self._buttonPress) self._canvas.connect("button-release-event", self._buttonRelease) self._canvas.connect("key-press-event", self._keyPressEventCb)
def _zoomOutCb(self, unused_action): Zoomable.zoomOut()