fix: training cancel button re-enable, waveform worker cleanup, stats table sort
- Training cancel: connect finished signal to re-enable button (was stuck disabled) - Waveform worker: disconnect stale signal and wait on file switch, clean up on close - DatasetStatsDialog: numeric sort via DisplayRole, remove dead widget allocation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -250,10 +250,6 @@ class DatasetStatsDialog(QDialog):
|
|||||||
|
|
||||||
# ── Class balance bar ─────────────────────────────────
|
# ── Class balance bar ─────────────────────────────────
|
||||||
if n_total > 0:
|
if n_total > 0:
|
||||||
bar = QWidget()
|
|
||||||
bar.setFixedHeight(20)
|
|
||||||
bar.setStyleSheet("background: #222;")
|
|
||||||
|
|
||||||
class _BalanceBar(QWidget):
|
class _BalanceBar(QWidget):
|
||||||
def __init__(self, pos, soft, neg, total):
|
def __init__(self, pos, soft, neg, total):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -290,10 +286,12 @@ class DatasetStatsDialog(QDialog):
|
|||||||
table.setItem(row, 0, QTableWidgetItem(name))
|
table.setItem(row, 0, QTableWidgetItem(name))
|
||||||
for col, val in enumerate([len(pos), len(soft), len(neg),
|
for col, val in enumerate([len(pos), len(soft), len(neg),
|
||||||
len(pos) + len(soft) + len(neg)], 1):
|
len(pos) + len(soft) + len(neg)], 1):
|
||||||
item = QTableWidgetItem(str(val))
|
item = QTableWidgetItem()
|
||||||
|
item.setData(Qt.ItemDataRole.DisplayRole, val)
|
||||||
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
|
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||||
table.setItem(row, col, item)
|
table.setItem(row, col, item)
|
||||||
|
|
||||||
|
table.setSortingEnabled(True)
|
||||||
table.sortItems(1, Qt.SortOrder.DescendingOrder)
|
table.sortItems(1, Qt.SortOrder.DescendingOrder)
|
||||||
layout.addWidget(table)
|
layout.addWidget(table)
|
||||||
|
|
||||||
@@ -3193,7 +3191,9 @@ class MainWindow(QMainWindow):
|
|||||||
# Start waveform extraction in background
|
# Start waveform extraction in background
|
||||||
self._timeline.set_waveform(None)
|
self._timeline.set_waveform(None)
|
||||||
if hasattr(self, '_waveform_worker') and self._waveform_worker is not None:
|
if hasattr(self, '_waveform_worker') and self._waveform_worker is not None:
|
||||||
|
self._safe_disconnect(self._waveform_worker.done)
|
||||||
self._waveform_worker.quit()
|
self._waveform_worker.quit()
|
||||||
|
self._waveform_worker.wait(1000)
|
||||||
self._waveform_worker = WaveformWorker(self._file_path)
|
self._waveform_worker = WaveformWorker(self._file_path)
|
||||||
self._waveform_worker.done.connect(self._timeline.set_waveform)
|
self._waveform_worker.done.connect(self._timeline.set_waveform)
|
||||||
self._waveform_worker.start()
|
self._waveform_worker.start()
|
||||||
@@ -4089,6 +4089,8 @@ class MainWindow(QMainWindow):
|
|||||||
self._btn_train.setText("Train")
|
self._btn_train.setText("Train")
|
||||||
self._btn_train.setEnabled(False)
|
self._btn_train.setEnabled(False)
|
||||||
self._show_status("Cancelling training…")
|
self._show_status("Cancelling training…")
|
||||||
|
self._train_worker.finished.connect(
|
||||||
|
lambda: self._btn_train.setEnabled(True))
|
||||||
return
|
return
|
||||||
|
|
||||||
# Default video dir: parent of currently loaded file, or saved setting
|
# Default video dir: parent of currently loaded file, or saved setting
|
||||||
@@ -4690,6 +4692,10 @@ class MainWindow(QMainWindow):
|
|||||||
# Cancel background workers to prevent callbacks into dead objects.
|
# Cancel background workers to prevent callbacks into dead objects.
|
||||||
self._cleanup_scan_worker()
|
self._cleanup_scan_worker()
|
||||||
self._cleanup_train_worker()
|
self._cleanup_train_worker()
|
||||||
|
if hasattr(self, '_waveform_worker') and self._waveform_worker is not None:
|
||||||
|
self._safe_disconnect(self._waveform_worker.done)
|
||||||
|
self._waveform_worker.quit()
|
||||||
|
self._waveform_worker.wait(2000)
|
||||||
if self._export_worker and self._export_worker.isRunning():
|
if self._export_worker and self._export_worker.isRunning():
|
||||||
self._export_worker.cancel()
|
self._export_worker.cancel()
|
||||||
self._export_worker.wait(3000)
|
self._export_worker.wait(3000)
|
||||||
|
|||||||
Reference in New Issue
Block a user