diff --git a/src/opentimelineview/ruler_widget.py b/src/opentimelineview/ruler_widget.py index 023deb5149..1a1f725a86 100644 --- a/src/opentimelineview/ruler_widget.py +++ b/src/opentimelineview/ruler_widget.py @@ -134,7 +134,8 @@ def set_time_space_callback(self, time_space): def mouseMoveEvent(self, mouse_event): pos = self.mapToScene(mouse_event.pos()) - self.setPos(QtCore.QPointF(pos.x(), + self.setPos(QtCore.QPointF(max(pos.x() - track_widgets.CURRENT_ZOOM_LEVEL * + track_widgets.TRACK_NAME_WIDGET_WIDTH, 0), track_widgets.TIME_SLIDER_HEIGHT - track_widgets.MARKER_SIZE)) self.update_frame() @@ -192,7 +193,9 @@ def map_to_time_space(self, item): is_tail = False f = "-?-" - ratio = (self.x() - item.x()) / float(item.rect().width()) + ratio = (self.x() - item.x() + + track_widgets.CURRENT_ZOOM_LEVEL * + track_widgets.TRACK_NAME_WIDGET_WIDTH) / float(item.rect().width()) # The 'if' condition should be : ratio < 0 or ration >= 1 # However, we are cheating in order to display the last frame of diff --git a/src/opentimelineview/timeline_widget.py b/src/opentimelineview/timeline_widget.py index 2f7d57fce7..1c7c660977 100644 --- a/src/opentimelineview/timeline_widget.py +++ b/src/opentimelineview/timeline_widget.py @@ -205,11 +205,11 @@ def _add_tracks(self): if isinstance(self.composition, otio.schema.Stack): video_tracks = [ t for t in self.composition - if t.kind == otio.schema.TrackKind.Video and list(t) + if t.kind == otio.schema.TrackKind.Video ] audio_tracks = [ t for t in self.composition - if t.kind == otio.schema.TrackKind.Audio and list(t) + if t.kind == otio.schema.TrackKind.Audio ] video_tracks.reverse() @@ -219,8 +219,7 @@ def _add_tracks(self): t.kind not in ( otio.schema.TrackKind.Video, otio.schema.TrackKind.Audio - ) and - list(t) + ) ) ] else: @@ -463,14 +462,14 @@ def wheelEvent(self, event): scale_by = 1.0 + float(event.delta()) / 1000 self.scale(scale_by, 1) zoom_level = 1.0 / self.matrix().m11() + track_widgets.CURRENT_ZOOM_LEVEL = zoom_level # some items we do want to keep the same visual size. So we need to # inverse the effect of the zoom items_to_scale = [ i for i in self.scene().items() - if isinstance(i, track_widgets.BaseItem) or - isinstance(i, track_widgets.Marker) or - isinstance(i, ruler_widget.Ruler) + if (isinstance(i, (track_widgets.BaseItem, track_widgets.Marker, + ruler_widget.Ruler, track_widgets.TimeSlider))) ] for item in items_to_scale: @@ -712,14 +711,11 @@ def frame_all(self): scaleFactor = self.size().width() / self.sceneRect().width() self.scale(scaleFactor * zoom_level, 1) zoom_level = 1.0 / self.matrix().m11() - + track_widgets.CURRENT_ZOOM_LEVEL = zoom_level items_to_scale = [ i for i in self.scene().items() - if ( - isinstance(i, track_widgets.BaseItem) or - isinstance(i, track_widgets.Marker) or - isinstance(i, ruler_widget.Ruler) - ) + if (isinstance(i, (track_widgets.BaseItem, track_widgets.Marker, + ruler_widget.Ruler, track_widgets.TimeSlider))) ] # some items we do want to keep the same visual size. So we need to # inverse the effect of the zoom diff --git a/src/opentimelineview/track_widgets.py b/src/opentimelineview/track_widgets.py index a0b63cf4a7..92030610f4 100644 --- a/src/opentimelineview/track_widgets.py +++ b/src/opentimelineview/track_widgets.py @@ -25,7 +25,6 @@ from PySide2 import QtGui, QtCore, QtWidgets import opentimelineio as otio - TIME_SLIDER_HEIGHT = 20 MEDIA_TYPE_SEPARATOR_HEIGHT = 5 TRACK_HEIGHT = 45 @@ -35,6 +34,8 @@ MARKER_SIZE = 10 EFFECT_HEIGHT = (1.0 / 3.0) * TRACK_HEIGHT HIGHLIGHT_WIDTH = 5 +TRACK_NAME_WIDGET_WIDTH = 100.0 +CURRENT_ZOOM_LEVEL = 1.0 class BaseItem(QtWidgets.QGraphicsRectItem): @@ -67,6 +68,8 @@ def __init__(self, item, timeline_range, *args, **kwargs): self._set_labels() self._set_tooltip() + self.x_value = 0.0 + def paint(self, *args, **kwargs): new_args = [args[0], QtWidgets.QStyleOptionGraphicsItem()] + list(args[2:]) @@ -185,10 +188,11 @@ def _set_tooltip(self): self.setToolTip(self.item.name) def counteract_zoom(self, zoom_level=1.0): + self.setX(self.x_value + TRACK_NAME_WIDGET_WIDTH * zoom_level) for label in ( - self.source_name_label, - self.source_in_label, - self.source_out_label + self.source_name_label, + self.source_in_label, + self.source_out_label ): label.setTransform(QtGui.QTransform.fromScale(zoom_level, 1.0)) @@ -230,6 +234,39 @@ def __init__(self, *args, **kwargs): self.source_name_label.setText('GAP') +class TrackNameItem(BaseItem): + + def __init__(self, track, rect, *args, **kwargs): + super(TrackNameItem, self).__init__(None, None, rect, + *args, **kwargs) + track_name = 'Track' if track.name == '' else track.name + if len(track_name) > 7: + track_name = track_name[:7] + '...' + self.source_name_label.setText(track_name + '\n({})'.format(track.kind)) + self.source_name_label.setY( + (TRACK_HEIGHT - + self.source_name_label.boundingRect().height()) / 2.0 + ) + self.setToolTip('{} items'.format(len(track))) + + def itemChange(self, change, value): + return super(BaseItem, self).itemChange(change, value) + + def _add_markers(self): + return + + def _set_labels(self): + return + + def _set_tooltip(self): + return + + def counteract_zoom(self, zoom_level=1.0): + name_width = self.source_name_label.boundingRect().width() + self.source_name_label.setX(0.5 * (self.boundingRect().width() - name_width)) + self.setTransform(QtGui.QTransform.fromScale(zoom_level, 1.0)) + + class EffectItem(QtWidgets.QGraphicsRectItem): def __init__(self, item, rect, *args, **kwargs): @@ -370,6 +407,16 @@ def __init__(self, track, *args, **kwargs): def _populate(self): track_map = self.track.range_of_all_children() + track_name_rect = QtCore.QRectF( + 0, + 0, + TRACK_NAME_WIDGET_WIDTH, + TRACK_HEIGHT + ) + track_name_item = TrackNameItem(self.track, track_name_rect) + track_name_item.setParentItem(self) + track_name_item.setX(0) + track_name_item.counteract_zoom() for n, item in enumerate(self.track): timeline_range = track_map[item] @@ -396,6 +443,8 @@ def _populate(self): continue new_item.setParentItem(self) + new_item.x_value = otio.opentime.to_seconds( + timeline_range.start_time) * TIME_MULTIPLIER new_item.setX( otio.opentime.to_seconds(timeline_range.start_time) * TIME_MULTIPLIER @@ -450,12 +499,16 @@ def __init__(self, *args, **kwargs): def mousePressEvent(self, mouse_event): pos = self.mapToScene(mouse_event.pos()) - self._ruler.setPos(QtCore.QPointF(pos.x(), - TIME_SLIDER_HEIGHT - - MARKER_SIZE)) + self._ruler.setPos(QtCore.QPointF( + max(pos.x() - TRACK_NAME_WIDGET_WIDTH * CURRENT_ZOOM_LEVEL, 0), + TIME_SLIDER_HEIGHT - + MARKER_SIZE)) self._ruler.update_frame() super(TimeSlider, self).mousePressEvent(mouse_event) def add_ruler(self, ruler): self._ruler = ruler + + def counteract_zoom(self, zoom_level=1.0): + self.setX(zoom_level * TRACK_NAME_WIDGET_WIDTH)