[tracks, timeline] enable navigation by keyboard
This commit is contained in:
parent
5db069b14e
commit
17953355ba
@ -34,13 +34,20 @@ class Window(QGraphicsRectItem):
|
|||||||
|
|
||||||
def setWindowWidth(self, newwidth):
|
def setWindowWidth(self, newwidth):
|
||||||
logging.debug("timeline.window: update window widthto %.3f", newwidth)
|
logging.debug("timeline.window: update window widthto %.3f", newwidth)
|
||||||
|
|
||||||
self._width = newwidth
|
self._width = newwidth
|
||||||
r = self.rect()
|
r = self.rect()
|
||||||
self.setRect(r.x(), r.y(), self._width, r.height())
|
self.setRect(r.x(), r.y(), self._width, r.height())
|
||||||
r = self.rect()
|
r = self.rect()
|
||||||
self.signals.windowMoved.emit(r.left(), r.right())
|
self.signals.windowMoved.emit(r.left(), r.right())
|
||||||
|
|
||||||
|
def setWindow(self, newx, newwidth):
|
||||||
|
logging.debug("timeline.window: update window to range %.3f to %.3f", newx, newwidth)
|
||||||
|
self._width = newwidth
|
||||||
|
r = self.rect()
|
||||||
|
self.setRect(newx, r.y(), self._width, r.height())
|
||||||
|
r = self.rect()
|
||||||
|
self.signals.windowMoved.emit(r.left(), r.right())
|
||||||
|
|
||||||
def mouseMoveEvent(self, event):
|
def mouseMoveEvent(self, event):
|
||||||
super().mouseMoveEvent(event)
|
super().mouseMoveEvent(event)
|
||||||
|
|
||||||
@ -223,6 +230,15 @@ class DetectionTimeline(QWidget):
|
|||||||
span = np.round(width * self.total_width)
|
span = np.round(width * self.total_width)
|
||||||
self._window.setWindowWidth(span)
|
self._window.setWindowWidth(span)
|
||||||
|
|
||||||
|
def setWindow(self, xpos, width):
|
||||||
|
span = np.round(width * self.total_width)
|
||||||
|
if xpos < 0.0:
|
||||||
|
xpos = 0.0
|
||||||
|
elif xpos > 1.0:
|
||||||
|
xpos = 1.0
|
||||||
|
xstart = np.round(xpos * self.total_width)
|
||||||
|
self._window.setWindow(xstart, span)
|
||||||
|
|
||||||
def windowBounds(self):
|
def windowBounds(self):
|
||||||
return self._rangeStart, self._rangeStop
|
return self._rangeStart, self._rangeStop
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ class SelectionControls(QWidget):
|
|||||||
quarterstepBackBtn.setFont(font)
|
quarterstepBackBtn.setFont(font)
|
||||||
quarterstepBackBtn.setShortcut(Qt.KeyboardModifier.ShiftModifier | Qt.Key.Key_Left)
|
quarterstepBackBtn.setShortcut(Qt.KeyboardModifier.ShiftModifier | Qt.Key.Key_Left)
|
||||||
quarterstepBackBtn.setToolTip(f"Go back by a quarter window ({quarterstepBackBtn.shortcut().toString()})")
|
quarterstepBackBtn.setToolTip(f"Go back by a quarter window ({quarterstepBackBtn.shortcut().toString()})")
|
||||||
quarterstepBackBtn.clicked.connect(lambda: self.on_Fwd(quarterstep))
|
quarterstepBackBtn.clicked.connect(lambda: self.on_Back(quarterstep))
|
||||||
|
|
||||||
fwdBtn = QPushButton(">>|")
|
fwdBtn = QPushButton(">>|")
|
||||||
fwdBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
|
fwdBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
|
||||||
@ -306,6 +306,7 @@ class FixTracks(QWidget):
|
|||||||
self._threadpool = QThreadPool()
|
self._threadpool = QThreadPool()
|
||||||
self._reader = None
|
self._reader = None
|
||||||
self._image = None
|
self._image = None
|
||||||
|
self._clear_detections = True
|
||||||
self._data = DataController()
|
self._data = DataController()
|
||||||
self._brushes = {"assigned_left": QBrush(QColor.fromString("orange")),
|
self._brushes = {"assigned_left": QBrush(QColor.fromString("orange")),
|
||||||
"assigned_right": QBrush(QColor.fromString("green")),
|
"assigned_right": QBrush(QColor.fromString("green")),
|
||||||
@ -431,7 +432,8 @@ class FixTracks(QWidget):
|
|||||||
assigned_right = df[(df.track == self.tracktwo_id)]
|
assigned_right = df[(df.track == self.tracktwo_id)]
|
||||||
unassigned = df[(df.track != self.trackone_id) & (df.track != self.tracktwo_id)]
|
unassigned = df[(df.track != self.trackone_id) & (df.track != self.tracktwo_id)]
|
||||||
|
|
||||||
self._detectionView.clearDetections()
|
if self._clear_detections:
|
||||||
|
self._detectionView.clearDetections()
|
||||||
update_detectionView(unassigned, "unassigned")
|
update_detectionView(unassigned, "unassigned")
|
||||||
update_detectionView(assigned_left, "assigned_left")
|
update_detectionView(assigned_left, "assigned_left")
|
||||||
update_detectionView(assigned_right, "assigned_right")
|
update_detectionView(assigned_right, "assigned_right")
|
||||||
@ -467,7 +469,7 @@ class FixTracks(QWidget):
|
|||||||
self._data.setData(self._reader.asdict)
|
self._data.setData(self._reader.asdict)
|
||||||
self._timeline.setDetectionData(self._data.data)
|
self._timeline.setDetectionData(self._data.data)
|
||||||
maxframes = self._data.max("frame")
|
maxframes = self._data.max("frame")
|
||||||
rel_width = self._windowspinner.value / maxframes
|
rel_width = self._windowspinner.value() / maxframes
|
||||||
self._timeline.setWindowWidth(rel_width)
|
self._timeline.setWindowWidth(rel_width)
|
||||||
self.update()
|
self.update()
|
||||||
self._saveBtn.setEnabled(True)
|
self._saveBtn.setEnabled(True)
|
||||||
@ -543,9 +545,35 @@ class FixTracks(QWidget):
|
|||||||
|
|
||||||
def on_forward(self, stepsize):
|
def on_forward(self, stepsize):
|
||||||
logging.debug("Tracks: receive forward command with step-size: %.2f", stepsize)
|
logging.debug("Tracks: receive forward command with step-size: %.2f", stepsize)
|
||||||
|
max_frames = self._data.max("frame")
|
||||||
|
if stepsize >= 1.0:
|
||||||
|
self._clear_detections = True
|
||||||
|
newx = self._timeline.rangeStart + self._windowspinner.value() / max_frames
|
||||||
|
self._timeline.setWindowPos(newx)
|
||||||
|
else:
|
||||||
|
self._clear_detections = True
|
||||||
|
step = stepsize * (self._windowspinner.value() / max_frames)
|
||||||
|
stop_pos = self._timeline.rangeStop + step
|
||||||
|
self._timeline.setWindowWidth(stop_pos - self._timeline.rangeStart)
|
||||||
|
self._windowspinner.setValue(int(self._windowspinner.value() + int(step * max_frames)))
|
||||||
|
self.update()
|
||||||
|
|
||||||
def on_backward(self, stepsize):
|
def on_backward(self, stepsize):
|
||||||
logging.debug("Tracks: receive backward command with step-size: %.2f", stepsize)
|
logging.debug("Tracks: receive backward command with step-size: %.2f", stepsize)
|
||||||
|
max_frames = self._data.max("frame")
|
||||||
|
if stepsize >= 1.0:
|
||||||
|
self._clear_detections = True
|
||||||
|
newx = self._timeline.rangeStart - self._windowspinner.value() / max_frames
|
||||||
|
self._timeline.setWindowPos(newx)
|
||||||
|
else:
|
||||||
|
self._clear_detections = True
|
||||||
|
step = stepsize * (self._windowspinner.value() / max_frames)
|
||||||
|
start_pos = self._timeline.rangeStart - step
|
||||||
|
newwindowwidth = (self._timeline.rangeStop - self._timeline.rangeStart) + step
|
||||||
|
self._timeline.setWindow(start_pos, newwindowwidth)
|
||||||
|
self._windowspinner.setValue(int(newwindowwidth *max_frames))
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
from PySide6.QtWidgets import QApplication
|
from PySide6.QtWidgets import QApplication
|
||||||
|
Loading…
Reference in New Issue
Block a user