diff --git a/fixtracks/widgets/tracks.py b/fixtracks/widgets/tracks.py index a9e8244..b4b4501 100644 --- a/fixtracks/widgets/tracks.py +++ b/fixtracks/widgets/tracks.py @@ -3,10 +3,10 @@ import pathlib import numpy as np import pandas as pd -from PySide6.QtCore import Qt, QThreadPool, Signal, QAbstractTableModel, QSortFilterProxyModel, QItemSelectionModel +from PySide6.QtCore import Qt, QThreadPool, Signal, QAbstractTableModel, QSortFilterProxyModel, QItemSelectionModel, QSize from PySide6.QtGui import QImage, QBrush, QColor, QFont from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QComboBox -from PySide6.QtWidgets import QSpinBox, QSpacerItem, QProgressBar, QTableView, QSplitter +from PySide6.QtWidgets import QSpinBox, QSpacerItem, QProgressBar, QTableView, QSplitter, QGridLayout from fixtracks.utils.reader import PickleLoader from fixtracks.widgets.detectionview import DetectionView @@ -81,6 +81,93 @@ class FilterProxyModel(QSortFilterProxyModel): def filterAcceptsColumn(self, source_column, source_parent): return True + +class SelectionControls(QWidget): + next = Signal() + previous = Signal() + assignOne = Signal() + assignTwo = Signal() + assignOther = Signal() + + def __init__(self, parent = None,): + super().__init__(parent) + font = QFont() + font.setBold(True) + font.setPointSize(10) + + previousBtn = QPushButton("previous") + previousBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + previousBtn.setToolTip("Go back to previous window (right-arrow)") + previousBtn.setEnabled(False) + previousBtn.setShortcut(Qt.Key.Key_Right) + previousBtn.clicked.connect(self.on_Previous) + previousBtn.setFont(font) + nextBtn = QPushButton("next") + nextBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + nextBtn.setToolTip("Proceed to next window (left-arrow)") + nextBtn.setEnabled(False) + nextBtn.clicked.connect(self.on_Next) + nextBtn.setShortcut(Qt.Key.Key_Left) + nextBtn.setFont(font) + + assignOneBtn = QPushButton("Track One") + assignOneBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + assignOneBtn.setStyleSheet("QPushButton { background-color: orange; }") + assignOneBtn.setShortcut("Ctrl+1") + assignOneBtn.setToolTip("Assign current selection to Track One (Ctrl+1)") + assignOneBtn.setFont(font) + assignOneBtn.clicked.connect(self.on_TrackOne) + + assignTwoBtn = QPushButton("Track Two") + assignTwoBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + assignTwoBtn.setStyleSheet("QPushButton { background-color: green; }") + assignTwoBtn.setToolTip("Assign current selection to Track Two (Ctrl+2)") + assignTwoBtn.setFont(font) + assignTwoBtn.setShortcut("Ctrl+2") + assignTwoBtn.clicked.connect(self.on_TrackTwo) + + assignOtherBtn = QPushButton("Other") + assignOtherBtn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + assignOtherBtn.setStyleSheet("QPushButton { background-color: red; }") + assignOtherBtn.setToolTip("Assign current selection to Unassigned (Ctrl+0)") + assignOtherBtn.setFont(font) + assignOtherBtn.setShortcut("Ctrl+0") + assignOtherBtn.clicked.connect(self.on_TrackOther) + + grid = QGridLayout() + grid.addWidget(previousBtn, 0, 0, 4, 2) + grid.addWidget(QLabel("Current selection:"), 0, 2, 1, 4) + grid.addWidget(QLabel("Track One:"), 1, 2, 1, 4) + grid.addWidget(QLabel("Track Two:"), 2, 2, 1, 4) + grid.addWidget(QLabel("Unassigned:"), 3, 2, 1, 4) + grid.addWidget(nextBtn, 0, 5, 4, 2) + + grid.addWidget(assignOneBtn, 4, 0, 4, 3) + grid.addWidget(assignOtherBtn, 4, 3, 4, 2) + grid.addWidget(assignTwoBtn, 4, 5, 4, 3) + + self.setLayout(grid) + self.setMaximumSize(QSize(400, 200)) + + def on_Next(self): + self.next.emit() + + def on_Previous(self): + self.previous.emit() + + def on_TrackOne(self): + self.assignOne.emit() + + def on_TrackTwo(self): + self.assignTwo.emit() + + def on_TrackOther(self): + self.assignOther.emit() + + def setSelection(self, selection): + pass + + class FixTracks(QWidget): back = Signal() @@ -120,6 +207,8 @@ class FixTracks(QWidget): timelinebox.addWidget(QLabel("Window")) timelinebox.addWidget(self._windowspinner) + # self._controls_widget = SelectionControls() + self._trackone_table = QTableView() font = QFont() font.setBold(True) @@ -141,7 +230,7 @@ class FixTracks(QWidget): track1_box = QVBoxLayout() track1_box.addWidget(trackone_label) track1_box.addWidget(self._trackone_table) - + tracktwo_label = QLabel("Track 2") tracktwo_label.setStyleSheet("QLabel { color : green; }") tracktwo_box = QVBoxLayout() @@ -207,6 +296,7 @@ class FixTracks(QWidget): layout.addWidget(splitter) self.setLayout(layout) + def on_dataSelection(self): filename = self._data_combo.currentText() if "please select" in filename.lower(): @@ -290,8 +380,8 @@ class FixTracks(QWidget): self._data_combo.addItems(self.fileList) self._data_combo.setCurrentIndex(0) - self._data_combo.currentIndexChanged.connect(self.on_rightDataSelection) - self._image_combo.currentIndexChanged.connect(self.on_rightvideoSelection) + # self._data_combo.currentIndexChanged.connect(self.on_dataSelection) + # self._image_combo.currentIndexChanged.connect(self.on_imageSelection) def _on_dataOpenend(self, state): logging.info("Finished loading data with state %s", state) @@ -340,9 +430,10 @@ class FixTracks(QWidget): self._timeline.setWindowWidth(value) def on_detectionsSelected(self, detections): + logging.debug("Tracks: Detections selected") selection_model = self._unassigned_table.selectionModel() selection = selection_model.selection() - + logging.debug("Tracks: Get selection model") for d in detections: id = d.data(1) row = self._unassignedmodel.mapIdToRow(id) @@ -350,6 +441,23 @@ class FixTracks(QWidget): continue index = self._unassigned_table.model().index(row, 0) selection.select(index, index) - + logging.debug("Tracks: Detections selected") mode = QItemSelectionModel.Select | QItemSelectionModel.Rows selection_model.select(selection, mode) + + +def main(): + from PySide6.QtWidgets import QApplication + + app = QApplication([]) + window = QWidget() + window.setMinimumSize(200, 200) + layout = QVBoxLayout() + controls = SelectionControls() + layout.addWidget(controls) + window.setLayout(layout) + window.show() + app.exec() + +if __name__ == "__main__": + main() \ No newline at end of file