[timeline] fix positionsing

This commit is contained in:
Jan Grewe 2025-01-31 15:32:03 +01:00
parent 7d3e3af498
commit 98b665ec3c
4 changed files with 34 additions and 38 deletions

View File

@ -21,7 +21,7 @@ class DetectionSceneSignals(QObject):
itemsSelected = Signal(list) itemsSelected = Signal(list)
class DetectionTimelineSignals(QObject): class DetectionTimelineSignals(QObject):
windowMoved = Signal((float, float)) windowMoved = Signal()
class DetectionSignals(QObject): class DetectionSignals(QObject):
hover = Signal((int, QPointF)) hover = Signal((int, QPointF))

View File

@ -3,8 +3,8 @@ import numpy as np
import pandas as pd import pandas as pd
from PySide6.QtCore import Qt from PySide6.QtCore import Qt
from PySide6.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QGraphicsView, QGraphicsScene, QGraphicsItem, QGraphicsRectItem, QGraphicsLineItem from PySide6.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QGraphicsView, QGraphicsScene, QGraphicsItem, QGraphicsRectItem, QGraphicsLineItem
from PySide6.QtCore import Qt, QPointF, QRectF, QPointF, QRectF from PySide6.QtCore import Qt, QRectF, QRectF
from PySide6.QtGui import QPixmap, QBrush, QColor, QImage, QPen, QFont, QPainter from PySide6.QtGui import QBrush, QColor, QPen, QFont
from fixtracks.utils.signals import DetectionTimelineSignals from fixtracks.utils.signals import DetectionTimelineSignals
@ -27,26 +27,23 @@ class Window(QGraphicsRectItem):
def setWindowX(self, newx): def setWindowX(self, newx):
logging.debug("timeline.window: set position to %.3f", newx) logging.debug("timeline.window: set position to %.3f", newx)
r = self.rect() self.setX(newx)
self.setRect(newx, r.y(), self._width, r.height()) self.signals.windowMoved.emit()
r = self.rect()
self.signals.windowMoved.emit(r.left(), r.right())
def setWindowWidth(self, newwidth): def setWindowWidth(self, newwidth):
logging.debug("timeline.window: update window widthto %.3f", newwidth) logging.debug("timeline.window: update window width to %.3f", newwidth)
self._width = newwidth self._width = newwidth
r = self.rect() r = self.rect()
self.setRect(r.x(), r.y(), self._width, r.height()) r.setWidth(newwidth)
r = self.rect() self.setRect(r)
self.signals.windowMoved.emit(r.left(), r.right()) self.signals.windowMoved.emit()
def setWindow(self, newx, newwidth): def setWindow(self, newx, newwidth):
logging.debug("timeline.window: update window to range %.3f to %.3f", newx, newwidth) logging.debug("timeline.window: update window to range %.3f to %.3f", newx, newwidth)
self._width = newwidth self._width = newwidth
r = self.rect() r = self.rect()
self.setRect(newx, r.y(), self._width, r.height()) self.setRect(newx, r.y(), self._width, r.height())
r = self.rect() self.signals.windowMoved.emit()
self.signals.windowMoved.emit(r.left(), r.right())
def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
super().mouseMoveEvent(event) super().mouseMoveEvent(event)
@ -56,20 +53,19 @@ class Window(QGraphicsRectItem):
super().mousePressEvent(event) super().mousePressEvent(event)
def mouseReleaseEvent(self, event): def mouseReleaseEvent(self, event):
self.setCursor(Qt.OpenHandCursor) logging.debug("Timeline.Window:MouseRelease event!")
r = self.scenePos() r = self.sceneBoundingRect()
if r.x() < -1000: if r.left() < 0:
self.setPos(-1000., self._y) self.setX(0.)
if r.x() > 1000 - self._width: if r.right() > self.scene().width():
self.setPos(1000 - self._width, self._y) self.setX(self.scene().width() - self._width)
if r.y() != self._y: if r.y() != self._y:
self.setPos(self.scenePos().x(), self._y) self.setY(self._y)
r = self.rect() print(self.sceneBoundingRect())
self.signals.windowMoved.emit(r.left(), r.right())
super().mouseReleaseEvent(event) super().mouseReleaseEvent(event)
self.signals.windowMoved.emit()
def hoverEnterEvent(self, event): def hoverEnterEvent(self, event):
# self.signals.hover.emit(self.data(0), QPointF(event.scenePos().x(), event.scenePos().y()))
super().hoverEnterEvent(event) super().hoverEnterEvent(event)
@ -101,10 +97,10 @@ class DetectionTimeline(QWidget):
font.setPointSize(15) font.setPointSize(15)
font.setBold(False) font.setBold(False)
self._window = Window(self.total_width//2, 0, 100, 60, axis_pen, transparent_brush) self._window = Window(0, 0, 100, 60, axis_pen, transparent_brush)
self._window.signals.windowMoved.connect(self.on_windowMoved) self._window.signals.windowMoved.connect(self.on_windowMoved)
self._scene = QGraphicsScene(QRectF(0, 0, self.total_width+1, 55.)) self._scene = QGraphicsScene(QRectF(0, 0, self.total_width, 55.))
self._scene.setBackgroundBrush(self._bg_brush) self._scene.setBackgroundBrush(self._bg_brush)
self._scene.addItem(self._window) self._scene.addItem(self._window)
@ -186,7 +182,6 @@ class DetectionTimeline(QWidget):
def fit_scene_to_view(self): def fit_scene_to_view(self):
"""Scale the image to fit the QGraphicsView.""" """Scale the image to fit the QGraphicsView."""
logging.debug("Call to fit_scene_to_view")
self._view.fitInView(self._scene.sceneRect(), Qt.KeepAspectRatio) self._view.fitInView(self._scene.sceneRect(), Qt.KeepAspectRatio)
def resizeEvent(self, event): def resizeEvent(self, event):
@ -194,13 +189,12 @@ class DetectionTimeline(QWidget):
super().resizeEvent(event) super().resizeEvent(event)
self.fit_scene_to_view() self.fit_scene_to_view()
def on_windowMoved(self, left, right): def on_windowMoved(self):
logging.debug("Timeline: Window moved to start x-position %.3f and end-x: %.3f", left, right)
scene_width = self._scene.width() scene_width = self._scene.width()
self._rangeStart = np.round(left / scene_width, 3) self._rangeStart = np.round(self._window.sceneBoundingRect().left() / scene_width, 3)
self._rangeStop = np.round(right / scene_width, 3) self._rangeStop = np.round(self._window.sceneBoundingRect().right() / scene_width, 3)
logging.debug("Timeline: Updated positions start: %.3f end: %.3f", self.rangeStart, self.rangeStop) logging.debug("Timeline: WindowUpdated positions start: %.3f end: %.3f", self.rangeStart, self.rangeStop)
self.signals.windowMoved.emit(self._rangeStart, self._rangeStop) self.signals.windowMoved.emit()
def setWindowPos(self, newx: float): def setWindowPos(self, newx: float):
"""Set the x-position of the selection window. """Set the x-position of the selection window.

View File

@ -96,10 +96,12 @@ class DetectionView(QWidget):
self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio) self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio)
def clearDetections(self): def clearDetections(self):
for it in self._scene.items(): items = self._scene.items()
if isinstance(it, Detection): if items is not None:
self._scene.removeItem(it) for it in self._scene.items():
del it if isinstance(it, Detection):
self._scene.removeItem(it)
del it
def addDetections(self, coordinates:np.array, track_ids:np.array, detection_ids:np.array, brush:QBrush): def addDetections(self, coordinates:np.array, track_ids:np.array, detection_ids:np.array, brush:QBrush):
logging.debug("DetectionView: add %i detections with color", coordinates.shape[0]) logging.debug("DetectionView: add %i detections with color", coordinates.shape[0])

View File

@ -516,8 +516,8 @@ class FixTracks(QWidget):
self._timeline.setDetectionData(self._data.data) self._timeline.setDetectionData(self._data.data)
self.update() self.update()
def on_windowChanged(self, start, stop): def on_windowChanged(self):
logging.info("Timeline reports window change to range %f %f percent of data", start, stop) logging.info("Timeline reports window change ")
self.update() self.update()
def on_windowSizeChanged(self, value): def on_windowSizeChanged(self, value):