Skip to content

Commit ba5c9f2

Browse files
Switched to a Qt6 Model/View framework to store data once only
1 parent 06e59e7 commit ba5c9f2

5 files changed

Lines changed: 257 additions & 285 deletions

File tree

osl_visualizer/dialogs.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import os
2+
from PyQt6 import uic
3+
from PyQt6.QtWidgets import QDialog
4+
5+
class ConfigDialog(QDialog):
6+
"""Configuration dialog for user settings."""
7+
def __init__(self, parent=None, current_jump_before=5000):
8+
super().__init__(parent)
9+
uic.loadUi(os.path.join(os.path.dirname(__file__), "ui/configdialog.ui"), self)
10+
self.jumpBeforeSpinBox.setValue(current_jump_before)
11+
self.okButton.clicked.connect(self.accept)
12+
self.cancelButton.clicked.connect(self.reject)
13+
14+
def get_jump_before(self):
15+
"""Return the currently set 'jump before annotation' value."""
16+
return self.jumpBeforeSpinBox.value()

osl_visualizer/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@
1616

1717
viewer.show()
1818
sys.exit(app.exec())
19+
#

osl_visualizer/models.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from PyQt6.QtCore import Qt, QAbstractListModel, QModelIndex
2+
from utils import ms_to_hms_ms
3+
4+
class VideoListModel(QAbstractListModel):
5+
def __init__(self, videos=None):
6+
super().__init__()
7+
self.videos = videos or []
8+
9+
def rowCount(self, parent=QModelIndex()):
10+
return len(self.videos)
11+
12+
def data(self, index, role):
13+
if not index.isValid() or not (0 <= index.row() < len(self.videos)):
14+
return None
15+
video = self.videos[index.row()]
16+
if role == Qt.ItemDataRole.DisplayRole:
17+
path = video.get("path", "unknown")
18+
n_events = len(video.get("annotations", []))
19+
return f"{path} ({n_events} events)"
20+
if role == Qt.ItemDataRole.UserRole:
21+
return video
22+
return None
23+
24+
def set_videos(self, videos):
25+
self.beginResetModel()
26+
self.videos = videos or []
27+
self.endResetModel()
28+
29+
class AnnotationListModel(QAbstractListModel):
30+
def __init__(self, annotations=None):
31+
super().__init__()
32+
self.annotations = annotations or []
33+
34+
def rowCount(self, parent=QModelIndex()):
35+
return len(self.annotations)
36+
37+
def data(self, index, role):
38+
if not index.isValid() or not (0 <= index.row() < len(self.annotations)):
39+
return None
40+
ann = self.annotations[index.row()]
41+
if role == Qt.ItemDataRole.DisplayRole:
42+
return f"[{ms_to_hms_ms(ann['position'])}] {ann['label']}"
43+
if role == Qt.ItemDataRole.UserRole:
44+
return ann
45+
return None
46+
47+
def set_annotations(self, annotations):
48+
self.beginResetModel()
49+
self.annotations = annotations or []
50+
self.endResetModel()
51+
52+
def add_annotation(self, annotation):
53+
idx = 0
54+
while idx < len(self.annotations) and annotation["position"] > self.annotations[idx]["position"]:
55+
idx += 1
56+
self.beginInsertRows(QModelIndex(), idx, idx)
57+
self.annotations.insert(idx, annotation)
58+
self.endInsertRows()
59+
return idx
60+
61+
def remove_annotation(self, idx):
62+
self.beginRemoveRows(QModelIndex(), idx, idx)
63+
del self.annotations[idx]
64+
self.endRemoveRows()

osl_visualizer/ui/mainwindow.ui

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</widget>
4545
</item>
4646
<item>
47-
<widget class="QListWidget" name="videoListWidget"/>
47+
<widget class="QListView" name="videoListView"/>
4848
</item>
4949
</layout>
5050
</widget>
@@ -113,7 +113,7 @@
113113
</widget>
114114
</item>
115115
<item>
116-
<widget class="QListWidget" name="annotationListWidget"/>
116+
<widget class="QListView" name="annotationListView"/>
117117
</item>
118118
<item>
119119
<widget class="QLabel" name="editLabel">

0 commit comments

Comments
 (0)