Release v1.0.14: stop passing match results through Qt signals.

Store worker results on the thread object, defer preview refresh, and log Python errors to crash.log to prevent native Qt crashes after TheTVDB match.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Bulk Renamer
2026-07-03 20:51:20 -05:00
co-authored by Cursor
parent 64d7a30328
commit 87282b0259
5 changed files with 70 additions and 16 deletions
+16 -2
View File
@@ -25,7 +25,7 @@ from PyQt6.QtWidgets import (
QCheckBox,
QComboBox,
)
from PyQt6.QtCore import Qt, QDir, QItemSelectionModel, QSettings
from PyQt6.QtCore import Qt, QDir, QItemSelectionModel, QSettings, QTimer
from PyQt6.QtGui import QFont, QColor
from engine.pipeline import compute_preview, perform_renames, save_undo_log, load_undo_log, perform_undo
@@ -54,6 +54,7 @@ class MainWindow(QMainWindow):
self._file_names: list[str] = []
self._preview_by_orig: dict[str, str] = {} # original name -> new name for selection preview
self._split: QSplitter | None = None
self._preview_refresh_scheduled = False
self._setup_ui()
self._restore_layout()
self._refresh_preview()
@@ -129,7 +130,7 @@ class MainWindow(QMainWindow):
if hasattr(w, "set_file_names"):
w.set_file_names(self._file_names)
if hasattr(w, "matchCompleted"):
w.matchCompleted.connect(self._refresh_preview)
w.matchCompleted.connect(self._schedule_refresh_preview)
g = QGroupBox(title)
g_layout = QVBoxLayout(g)
g_layout.setContentsMargins(8, 12, 8, 8)
@@ -274,6 +275,19 @@ class MainWindow(QMainWindow):
display_name = self._preview_by_orig.get(orig, orig) if row in selected_rows else orig
self.preview_table.setItem(row, 1, QTableWidgetItem(display_name))
def _schedule_refresh_preview(self):
if self._preview_refresh_scheduled:
return
self._preview_refresh_scheduled = True
QTimer.singleShot(0, self._run_scheduled_refresh)
def _run_scheduled_refresh(self):
self._preview_refresh_scheduled = False
try:
self._refresh_preview()
except Exception as exc:
self.preview_status.setText(f"Preview error: {exc}")
def _refresh_preview(self):
rules = self._get_rules()
if not self._file_names: