class Controller(TrackElementController): _cursor = RIGHT_SIDE def drag_start(self, item, target, event): self.debug("Trim end %s" % target) TrackElementController.drag_start(self, item, target, event) if self._view.element.is_locked(): elem = self._view.element.get_clip() else: elem = self._view.element self._context = EditingContext(elem, self._view.timeline, GES.EditMode.EDIT_TRIM, GES.Edge.EDGE_END, set([]), self.app.settings) self._context.connect("clip-trim", self.clipTrimCb) self._context.connect("clip-trim-finished", self.clipTrimFinishedCb) self._view.app.action_log.begin("trim object") def clipTrimCb(self, unused_TrimStartContext, tl_obj, position): # While a clip is being trimmed, ask the viewer to preview it self._view.app.gui.viewer.clipTrimPreview(tl_obj, position) def clipTrimFinishedCb(self, unused_TrimStartContext): # When a clip has finished trimming, tell the viewer to reset itself self._view.app.gui.viewer.clipTrimPreviewFinished()
class TrimHandle(Clutter.Texture): def __init__(self, timelineElement, isLeft): Clutter.Texture.__init__(self) self.isLeft = isLeft self.timelineElement = weakref.proxy(timelineElement) self.dragAction = Clutter.DragAction() self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.set_size(-1, EXPANDED_SIZE) self.hide() self.set_reactive(True) self.add_action(self.dragAction) self.dragAction.connect("drag-begin", self._dragBeginCb) self.dragAction.connect("drag-end", self._dragEndCb) self.dragAction.connect("drag-progress", self._dragProgressCb) self.connect("enter-event", self._enterEventCb) self.connect("leave-event", self._leaveEventCb) self.timelineElement.connect("enter-event", self._elementEnterEventCb) self.timelineElement.connect("leave-event", self._elementLeaveEventCb) def cleanup(self): self.disconnect_by_func(self._enterEventCb) self.disconnect_by_func(self._leaveEventCb) self.timelineElement.disconnect_by_func(self._elementEnterEventCb) self.timelineElement.disconnect_by_func(self._elementLeaveEventCb) # Callbacks def _enterEventCb(self, unused_actor, unused_event): self.timelineElement.set_reactive(False) for elem in self.timelineElement.get_children(): elem.set_reactive(False) self.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-focused.png")) if self.isLeft: self.timelineElement.timeline._container.embed.get_window().set_cursor( DRAG_LEFT_HANDLEBAR_CURSOR) else: self.timelineElement.timeline._container.embed.get_window().set_cursor( DRAG_RIGHT_HANDLEBAR_CURSOR) def _leaveEventCb(self, unused_actor, event): self.timelineElement.set_reactive(True) children = self.timelineElement.get_children() other_actor = self.timelineElement.timeline._container.stage.get_actor_at_pos( Clutter.PickMode.ALL, event.x, event.y) if other_actor not in children: self.timelineElement.hideHandles() for elem in children: elem.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor( NORMAL_CURSOR) def _elementEnterEventCb(self, unused_actor, unused_event): self.show() def _elementLeaveEventCb(self, unused_actor, unused_event): self.hide() def _dragBeginCb(self, unused_action, unused_actor, event_x, event_y, unused_modifiers): self.dragBeginStartX = event_x self.dragBeginStartY = event_y elem = self.timelineElement.bElement.get_parent() self.timelineElement.setDragged(True) if self.isLeft: edge = GES.Edge.EDGE_START self._dragBeginStart = self.timelineElement.bElement.get_parent( ).get_start() else: edge = GES.Edge.EDGE_END self._dragBeginStart = self.timelineElement.bElement.get_parent().get_duration() + \ self.timelineElement.bElement.get_parent().get_start() self._context = EditingContext(elem, self.timelineElement.timeline.bTimeline, GES.EditMode.EDIT_TRIM, edge, None, self.timelineElement.timeline._container.app.action_log) self._context.connect("clip-trim", self.clipTrimCb) self._context.connect("clip-trim-finished", self.clipTrimFinishedCb) def _dragProgressCb(self, unused_action, unused_actor, delta_x, unused_delta_y): # We can't use delta_x here because it fluctuates weirdly. coords = self.dragAction.get_motion_coords() delta_x = coords[0] - self.dragBeginStartX new_start = self._dragBeginStart + Zoomable.pixelToNs(delta_x) self._context.setMode( self.timelineElement.timeline._container.getEditionMode(isAHandle=True)) self._context.editTo( new_start, self.timelineElement.bElement.get_parent().get_layer().get_priority()) return False def _dragEndCb(self, unused_action, unused_actor, unused_event_x, unused_event_y, unused_modifiers): self.timelineElement.setDragged(False) self._context.finish() self.timelineElement.set_reactive(True) for elem in self.timelineElement.get_children(): elem.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor( NORMAL_CURSOR) def clipTrimCb(self, unused_TrimStartContext, tl_obj, position): # While a clip is being trimmed, ask the viewer to preview it self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreview( tl_obj, position) def clipTrimFinishedCb(self, unused_TrimStartContext): # When a clip has finished trimming, tell the viewer to reset itself self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreviewFinished( )
class TrimHandle(Clutter.Texture): def __init__(self, timelineElement, isLeft): Clutter.Texture.__init__(self) self.isLeft = isLeft self.isSelected = False self.timelineElement = timelineElement self.dragAction = Clutter.DragAction() self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.set_size(-1, EXPANDED_SIZE) self.hide() self.set_reactive(True) self.add_action(self.dragAction) self.dragAction.connect("drag-begin", self._dragBeginCb) self.dragAction.connect("drag-end", self._dragEndCb) self.dragAction.connect("drag-progress", self._dragProgressCb) self.connect("enter-event", self._enterEventCb) self.connect("leave-event", self._leaveEventCb) self.timelineElement.connect("enter-event", self._elementEnterEventCb) self.timelineElement.connect("leave-event", self._elementLeaveEventCb) self.timelineElement.bElement.selected.connect("selected-changed", self._selectedChangedCb) #Callbacks def _enterEventCb(self, actor, event): self.timelineElement.set_reactive(False) for elem in self.timelineElement.get_children(): elem.set_reactive(False) self.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-focused.png")) if self.isLeft: self.timelineElement.timeline._container.embed.get_window( ).set_cursor(Gdk.Cursor.new(Gdk.CursorType.LEFT_SIDE)) else: self.timelineElement.timeline._container.embed.get_window( ).set_cursor(Gdk.Cursor.new(Gdk.CursorType.RIGHT_SIDE)) def _leaveEventCb(self, actor, event): self.timelineElement.set_reactive(True) actor = self.timelineElement.timeline._container.stage.get_actor_at_pos( Clutter.PickMode.ALL, event.x, event.y) try: element = actor.bElement if element != self.timelineElement.bELement and not self.isSelected: self.timelineElement.hideHandles() except AttributeError: if not self.isSelected: self.timelineElement.hideHandles() for elem in self.timelineElement.get_children(): elem.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor( Gdk.Cursor.new(Gdk.CursorType.ARROW)) def _elementEnterEventCb(self, actor, event): self.show() def _elementLeaveEventCb(self, actor, event): if not self.isSelected: self.hide() def _selectedChangedCb(self, selected, isSelected): self.isSelected = isSelected self.props.visible = isSelected def _dragBeginCb(self, action, actor, event_x, event_y, modifiers): self.dragBeginStartX = event_x self.dragBeginStartY = event_y elem = self.timelineElement.bElement.get_parent() self.timelineElement.setDragged(True) if self.isLeft: edge = GES.Edge.EDGE_START self._dragBeginStart = self.timelineElement.bElement.get_parent( ).get_start() else: edge = GES.Edge.EDGE_END self._dragBeginStart = self.timelineElement.bElement.get_parent().get_duration() + \ self.timelineElement.bElement.get_parent().get_start() self._context = EditingContext(elem, self.timelineElement.timeline.bTimeline, GES.EditMode.EDIT_TRIM, edge, set([]), None) self._context.connect("clip-trim", self.clipTrimCb) self._context.connect("clip-trim-finished", self.clipTrimFinishedCb) def _dragProgressCb(self, action, actor, delta_x, delta_y): # We can't use delta_x here because it fluctuates weirdly. coords = self.dragAction.get_motion_coords() delta_x = coords[0] - self.dragBeginStartX new_start = self._dragBeginStart + Zoomable.pixelToNs(delta_x) self._context.setMode( self.timelineElement.timeline._container.getEditionMode( isAHandle=True)) self._context.editTo( new_start, self.timelineElement.bElement.get_parent().get_layer(). get_priority()) return False def _dragEndCb(self, action, actor, event_x, event_y, modifiers): self.timelineElement.setDragged(False) self._context.finish() self.timelineElement.set_reactive(True) for elem in self.timelineElement.get_children(): elem.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor( Gdk.Cursor.new(Gdk.CursorType.ARROW)) def clipTrimCb(self, unused_TrimStartContext, tl_obj, position): # While a clip is being trimmed, ask the viewer to preview it self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreview( tl_obj, position) def clipTrimFinishedCb(self, unused_TrimStartContext): # When a clip has finished trimming, tell the viewer to reset itself self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreviewFinished( )
class TrimHandle(Clutter.Texture): def __init__(self, timelineElement, isLeft): Clutter.Texture.__init__(self) self.isLeft = isLeft self.timelineElement = weakref.proxy(timelineElement) self.dragAction = Clutter.DragAction() self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.set_size(-1, EXPANDED_SIZE) self.hide() self.set_reactive(True) self.add_action(self.dragAction) self.dragAction.connect("drag-begin", self._dragBeginCb) self.dragAction.connect("drag-end", self._dragEndCb) self.dragAction.connect("drag-progress", self._dragProgressCb) self.connect("enter-event", self._enterEventCb) self.connect("leave-event", self._leaveEventCb) self.timelineElement.connect("enter-event", self._elementEnterEventCb) self.timelineElement.connect("leave-event", self._elementLeaveEventCb) def cleanup(self): self.disconnect_by_func(self._enterEventCb) self.disconnect_by_func(self._leaveEventCb) self.timelineElement.disconnect_by_func(self._elementEnterEventCb) self.timelineElement.disconnect_by_func(self._elementLeaveEventCb) # Callbacks def _enterEventCb(self, unused_actor, unused_event): self.timelineElement.set_reactive(False) for elem in self.timelineElement.get_children(): elem.set_reactive(False) self.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-focused.png")) if self.isLeft: self.timelineElement.timeline._container.embed.get_window( ).set_cursor(DRAG_LEFT_HANDLEBAR_CURSOR) else: self.timelineElement.timeline._container.embed.get_window( ).set_cursor(DRAG_RIGHT_HANDLEBAR_CURSOR) def _leaveEventCb(self, unused_actor, event): self.timelineElement.set_reactive(True) children = self.timelineElement.get_children() other_actor = self.timelineElement.timeline._container.stage.get_actor_at_pos( Clutter.PickMode.ALL, event.x, event.y) if other_actor not in children: self.timelineElement.hideHandles() for elem in children: elem.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor( NORMAL_CURSOR) def _elementEnterEventCb(self, unused_actor, unused_event): self.show() def _elementLeaveEventCb(self, unused_actor, unused_event): self.hide() def _dragBeginCb(self, unused_action, unused_actor, event_x, event_y, unused_modifiers): self.dragBeginStartX = event_x self.dragBeginStartY = event_y elem = self.timelineElement.bElement.get_parent() self.timelineElement.setDragged(True) if self.isLeft: edge = GES.Edge.EDGE_START self._dragBeginStart = self.timelineElement.bElement.get_parent( ).get_start() else: edge = GES.Edge.EDGE_END self._dragBeginStart = self.timelineElement.bElement.get_parent().get_duration() + \ self.timelineElement.bElement.get_parent().get_start() self._context = EditingContext( elem, self.timelineElement.timeline.bTimeline, GES.EditMode.EDIT_TRIM, edge, None, self.timelineElement.timeline._container.app.action_log) self._context.connect("clip-trim", self.clipTrimCb) self._context.connect("clip-trim-finished", self.clipTrimFinishedCb) def _dragProgressCb(self, unused_action, unused_actor, delta_x, unused_delta_y): # We can't use delta_x here because it fluctuates weirdly. coords = self.dragAction.get_motion_coords() delta_x = coords[0] - self.dragBeginStartX new_start = self._dragBeginStart + Zoomable.pixelToNs(delta_x) self._context.setMode( self.timelineElement.timeline._container.getEditionMode( isAHandle=True)) self._context.editTo( new_start, self.timelineElement.bElement.get_parent().get_layer(). get_priority()) return False def _dragEndCb(self, unused_action, unused_actor, unused_event_x, unused_event_y, unused_modifiers): self.timelineElement.setDragged(False) self._context.finish() self.timelineElement.set_reactive(True) for elem in self.timelineElement.get_children(): elem.set_reactive(True) self.set_from_file( os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor( NORMAL_CURSOR) def clipTrimCb(self, unused_TrimStartContext, tl_obj, position): # While a clip is being trimmed, ask the viewer to preview it self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreview( tl_obj, position) def clipTrimFinishedCb(self, unused_TrimStartContext): # When a clip has finished trimming, tell the viewer to reset itself self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreviewFinished( )
class TrimHandle(Clutter.Texture): def __init__(self, timelineElement, isLeft): Clutter.Texture.__init__(self) self.isLeft = isLeft self.isSelected = False self.timelineElement = timelineElement self.dragAction = Clutter.DragAction() self.set_from_file(os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.set_size(-1, EXPANDED_SIZE) self.hide() self.set_reactive(True) self.add_action(self.dragAction) self.dragAction.connect("drag-begin", self._dragBeginCb) self.dragAction.connect("drag-end", self._dragEndCb) self.dragAction.connect("drag-progress", self._dragProgressCb) self.connect("enter-event", self._enterEventCb) self.connect("leave-event", self._leaveEventCb) self.timelineElement.connect("enter-event", self._elementEnterEventCb) self.timelineElement.connect("leave-event", self._elementLeaveEventCb) self.timelineElement.bElement.selected.connect("selected-changed", self._selectedChangedCb) #Callbacks def _enterEventCb(self, actor, event): self.timelineElement.set_reactive(False) for elem in self.timelineElement.get_children(): elem.set_reactive(False) self.set_reactive(True) self.set_from_file(os.path.join(configure.get_pixmap_dir(), "trimbar-focused.png")) if self.isLeft: self.timelineElement.timeline._container.embed.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.LEFT_SIDE)) else: self.timelineElement.timeline._container.embed.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.RIGHT_SIDE)) def _leaveEventCb(self, actor, event): self.timelineElement.set_reactive(True) actor = self.timelineElement.timeline._container.stage.get_actor_at_pos(Clutter.PickMode.ALL, event.x, event.y) try: element = actor.bElement if element != self.timelineElement.bELement and not self.isSelected: self.timelineElement.hideHandles() except AttributeError: if not self.isSelected: self.timelineElement.hideHandles() for elem in self.timelineElement.get_children(): elem.set_reactive(True) self.set_from_file(os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.ARROW)) def _elementEnterEventCb(self, actor, event): self.show() def _elementLeaveEventCb(self, actor, event): if not self.isSelected: self.hide() def _selectedChangedCb(self, selected, isSelected): self.isSelected = isSelected self.props.visible = isSelected def _dragBeginCb(self, action, actor, event_x, event_y, modifiers): self.dragBeginStartX = event_x self.dragBeginStartY = event_y elem = self.timelineElement.bElement.get_parent() self.timelineElement.setDragged(True) if self.isLeft: edge = GES.Edge.EDGE_START self._dragBeginStart = self.timelineElement.bElement.get_parent().get_start() else: edge = GES.Edge.EDGE_END self._dragBeginStart = self.timelineElement.bElement.get_parent().get_duration() + \ self.timelineElement.bElement.get_parent().get_start() self._context = EditingContext(elem, self.timelineElement.timeline.bTimeline, GES.EditMode.EDIT_TRIM, edge, None) self._context.connect("clip-trim", self.clipTrimCb) self._context.connect("clip-trim-finished", self.clipTrimFinishedCb) def _dragProgressCb(self, action, actor, delta_x, delta_y): # We can't use delta_x here because it fluctuates weirdly. coords = self.dragAction.get_motion_coords() delta_x = coords[0] - self.dragBeginStartX new_start = self._dragBeginStart + Zoomable.pixelToNs(delta_x) self._context.setMode(self.timelineElement.timeline._container.getEditionMode(isAHandle=True)) self._context.editTo(new_start, self.timelineElement.bElement.get_parent().get_layer().get_priority()) return False def _dragEndCb(self, action, actor, event_x, event_y, modifiers): self.timelineElement.setDragged(False) self._context.finish() self.timelineElement.set_reactive(True) for elem in self.timelineElement.get_children(): elem.set_reactive(True) self.set_from_file(os.path.join(configure.get_pixmap_dir(), "trimbar-normal.png")) self.timelineElement.timeline._container.embed.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.ARROW)) def clipTrimCb(self, unused_TrimStartContext, tl_obj, position): # While a clip is being trimmed, ask the viewer to preview it self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreview(tl_obj, position) def clipTrimFinishedCb(self, unused_TrimStartContext): # When a clip has finished trimming, tell the viewer to reset itself self.timelineElement.timeline._container.app.gui.viewer.clipTrimPreviewFinished()