From c836717aa91836b1d41ec4081b3d8b51c5dc56f1 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Thu, 30 Jan 2025 09:18:21 +0100 Subject: [PATCH] [timeline] set window x pos and width --- fixtracks/widgets/detectiontimeline.py | 94 ++++++++++++++++++-------- 1 file changed, 65 insertions(+), 29 deletions(-) diff --git a/fixtracks/widgets/detectiontimeline.py b/fixtracks/widgets/detectiontimeline.py index 3e573de..2bd9354 100644 --- a/fixtracks/widgets/detectiontimeline.py +++ b/fixtracks/widgets/detectiontimeline.py @@ -1,5 +1,4 @@ import logging -import pathlib import numpy as np import pandas as pd from PySide6.QtCore import Qt @@ -26,10 +25,16 @@ class Window(QGraphicsRectItem): ) self._y = y + def setWindowX(self, newx): + r = self.rect() + self.setRect(newx, r.y(), self._width, r.height()) + self.signals.windowMoved.emit(self.scenePos().x() + self.rect().width() /2, self._width) + def setWindowWidth(self, newwidth): self._width = newwidth r = self.rect() - self.setRect(r.x(), r.y(), newwidth, r.height()) + self.setRect(r.x(), r.y(), self._width, r.height()) + self.signals.windowMoved.emit(self.scenePos().x() + self.rect().width() /2, self._width) def mouseMoveEvent(self, event): # print(event.scenePos()) @@ -66,7 +71,7 @@ class DetectionTimeline(QWidget): self._data = detectiondata self._rangeStart = 0.0 self._rangeStop = 0.005 - self._width = 2000 + self.total_width = 2000 self._stepCount = 200 self._bg_brush = QBrush(QColor(20, 20, 20, 255)) transparent_brush = QBrush(QColor(200, 200, 200, 64)) @@ -84,10 +89,10 @@ class DetectionTimeline(QWidget): font.setPointSize(15) font.setBold(False) - self._window = Window(self._width//2, 0, 100, 60, axis_pen, transparent_brush) + self._window = Window(self.total_width//2, 0, 100, 60, axis_pen, transparent_brush) self._window.signals.windowMoved.connect(self.on_windowMoved) - self._scene = QGraphicsScene(QRectF(0, 0, self._width+1, 55.)) + self._scene = QGraphicsScene(QRectF(0, 0, self.total_width+1, 55.)) self._scene.setBackgroundBrush(self._bg_brush) self._scene.addItem(self._window) @@ -186,45 +191,76 @@ class DetectionTimeline(QWidget): self._rangeStop = np.round(end_pos / scene_width, 3) self.signals.windowMoved.emit(self._rangeStart, self._rangeStop) - def setWindowWidth(self, width): - self._window.setWindowWidth(width) - -# TODO add method to change window size - + def setWindowPos(self, newx: float): + """Set the x-position of the selection window. + + Parameters + ---------- + newx : float + The new x position of the selection window given in percent of the data. + """ + if newx < 0.0: + newx = 0.0 + elif newx > 1.0: + newx = 1.0 + logging.debug("Set window x tp new position %.3f", newx) + x_rel = np.round(newx * self.total_width) + self._window.setWindowX(x_rel) + + def setWindowWidth(self, width: float): + """Set the width of the selection window. + + Parameters + ---------- + width : float + The width in a range 0.0 to 1.0 (aka 0% to 100% of the span.) + """ + logging.debug("Set window width to new value %.3f of %i total width", width, self.total_width) + span = np.round(width * self.total_width) + self._window.setWindowWidth(span) + def main(): + def back(start_x): + view.setWindowPos(start_x) + + def fwd(start_x): + view.setWindowPos(start_x) + + def zero(): + view.setWindowPos(0.0) + import pickle import numpy as np from IPython import embed - from PySide6.QtWidgets import QApplication + from PySide6.QtWidgets import QApplication, QPushButton, QHBoxLayout from fixtracks.info import PACKAGE_ROOT datafile = PACKAGE_ROOT / "data/merged_small.pkl" with open(datafile, "rb") as f: df = pickle.load(f) - - bg_coords = np.stack(df.keypoints[(df.track != 1) & (df.track != 2)].values,).astype(np.float32)[:,0,:] - bg_tracks = df.track[(df.track != 1) & (df.track != 2)].values - bg_ids = df.track[(df.track != 1) & (df.track != 2)].index.values - - scnd_coords = np.stack(df.keypoints[(df.track == 2)].values,).astype(np.float32)[:,0,:] - scnd_tracks = df.track[df.track == 2].values - scnd_ids = df.track[(df.track == 2)].index.values - - focus_coords = np.stack(df.keypoints[df.track == 1].values,).astype(np.float32)[:,0,:] - focus_tracks = df.track[df.track == 1].values - focus_ids = df.track[(df.track == 2)].index.values - + + start_x = 0.1 app = QApplication([]) window = QWidget() window.setMinimumSize(200, 75) - layout = QVBoxLayout() view = DetectionTimeline(df) + fwdBtn = QPushButton(">>") + fwdBtn.clicked.connect(lambda: fwd(0.5)) + zeroBtn = QPushButton("0->|") + zeroBtn.clicked.connect(zero) + backBtn = QPushButton("<<") + backBtn.clicked.connect(lambda: back(0.2)) + + btnLyt = QHBoxLayout() + btnLyt.addWidget(backBtn) + btnLyt.addWidget(zeroBtn) + btnLyt.addWidget(fwdBtn) + + view.setWindowPos(start_x) + layout = QVBoxLayout() layout.addWidget(view) - # view.setImage(img) - # view.addDetections(bg_coords, bg_tracks, bg_ids, background_brush) - # view.addDetections(focus_coords, focus_tracks, focus_ids, focus_brush) - # view.addDetections(scnd_coords, scnd_tracks, scnd_ids, second_brush) + layout.addLayout(btnLyt) window.setLayout(layout) window.show() app.exec()