diff --git a/fixtracks/widgets/detectiontimeline.py b/fixtracks/widgets/detectiontimeline.py index f628312..aa498f8 100644 --- a/fixtracks/widgets/detectiontimeline.py +++ b/fixtracks/widgets/detectiontimeline.py @@ -58,6 +58,8 @@ class DetectionTimeline(QWidget): self._trackone = trackone_id self._tracktwo = tracktwo_id self._data = detectiondata + self._rangeStart = 0.0 + self._rangeStop = 1.0 self._width = 2000 self._stepCount = 200 self._bg_brush = QBrush(QColor(20, 20, 20, 255)) @@ -76,12 +78,13 @@ class DetectionTimeline(QWidget): font.setPointSize(15) font.setBold(False) + self._scene = QGraphicsScene(QRectF(0, 0, self._width, 50.)) + self._scene.setBackgroundBrush(self._bg_brush) + self._view = QGraphicsView() self._view.setRenderHints(QPainter.RenderHint.Antialiasing | QPainter.RenderHint.SmoothPixmapTransform); self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio) - self._scene = QGraphicsScene(QRectF(0, 0, self._width, 50.)) - self._scene.setBackgroundBrush(self._bg_brush) t1_label = self._scene.addText("track 1", font) t1_label.setDefaultTextColor(self._t1_pen.color()) @@ -133,6 +136,14 @@ class DetectionTimeline(QWidget): if t2_coverage[i]: self._scene.addLine(pos[i], 17, pos[i], 32., pen=self._t2_pen) if other_coverage[i]: self._scene.addLine(pos[i], 34, pos[i], 49., pen=self._other_pen) + @property + def rangeStart(self): + return self._rangeStart + + @property + def rangeStop(self): + return self._rangeStop + def fit_scene_to_view(self): """Scale the image to fit the QGraphicsView.""" self._view.fitInView(self._scene.sceneRect(), Qt.KeepAspectRatio) @@ -147,9 +158,9 @@ class DetectionTimeline(QWidget): start_pos = x - w/2 + scene_width/2 end_pos = x + w/2 + scene_width/2 - range_start = np.round(start_pos / scene_width, 3) - range_end = np.round(end_pos / scene_width, 3) - self.signals.windowMoved.emit(range_start, range_end) + self._rangeStart = np.round(start_pos / scene_width, 3) + self._rangeStop = np.round(end_pos / scene_width, 3) + self.signals.windowMoved.emit(self._rangeStart, self._rangeStop) # TODO add method to change window size diff --git a/fixtracks/widgets/tracks.py b/fixtracks/widgets/tracks.py index 7ec07e8..4c262d3 100644 --- a/fixtracks/widgets/tracks.py +++ b/fixtracks/widgets/tracks.py @@ -11,7 +11,7 @@ from PySide6.QtWidgets import QSpinBox, QSpacerItem, QFileDialog, QProgressBar, from fixtracks.utils.reader import PickleLoader from fixtracks.widgets.detectionview import DetectionView from fixtracks.widgets.timeline import Timeline - +from fixtracks.widgets.detectiontimeline import DetectionTimeline class PoseTableModel(QAbstractTableModel): column_header = ["frame", "track"] @@ -108,8 +108,8 @@ class FixTracks(QWidget): self._progress_bar.setValue(0) self._tasklabel = QLabel() - self._timeline = Timeline() - self._timeline.signals.changed.connect(self.on_windowChanged) + self._timeline = DetectionTimeline() + self._timeline.signals.windowMoved.connect(self.on_windowChanged) self._windowspinner = QSpinBox() self._windowspinner.setRange(100, 10000) self._windowspinner.setSingleStep(100) @@ -208,8 +208,11 @@ class FixTracks(QWidget): left_trackid = 1 right_trackid = 2 - start_frame = self._timeline.sliderPosition - self._windowspinner.value() // 2 - stop_frame = self._timeline.sliderPosition + self._windowspinner.value() // 2 + max_frames = np.max(self._dataframe.frame.values) + start = self._timeline.rangeStart + stop = self._timeline._rangeStop + start_frame = np.floor(start * max_frames) + stop_frame = np.ceil(stop * max_frames) df = self._dataframe[(self._dataframe.frame >= start_frame) & (self._dataframe.frame < stop_frame)] assigned_left = df[(df.track == left_trackid)] @@ -235,7 +238,7 @@ class FixTracks(QWidget): self._progress_bar.setValue(0) if state and self._reader is not None: self._dataframe = self._reader.data - self._timeline.setRange(np.max(self._dataframe.frame.values), self._windowspinner.value()) + self._timeline.setDetectionData(self._dataframe) self.populateTables() def on_save(self): @@ -251,8 +254,8 @@ class FixTracks(QWidget): def on_assignRight(self): pass - def on_windowChanged(self, value): - logging.info("Timeline reports window change") + def on_windowChanged(self, start, stop): + logging.info("Timeline reports window change to range %f %f percent of data", start, stop) self.populateTables()