sort order to Flashcard Review

This commit is contained in:
stephen 2026-08-29 11:17:53 +10:00
parent ed1c6b9d4e
commit 8bc86e6936
2 changed files with 25 additions and 17 deletions

View file

@ -5,7 +5,7 @@ a = Analysis(
['main.py'], ['main.py'],
pathex=[], pathex=[],
binaries=[], binaries=[],
datas=[], datas=[()],
hiddenimports=[], hiddenimports=[],
hookspath=[], hookspath=[],
hooksconfig={}, hooksconfig={},
@ -21,7 +21,7 @@ exe = EXE(
a.scripts, a.scripts,
[], [],
exclude_binaries=True, exclude_binaries=True,
name='main', name='Spanish Voice Trainer',
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
strip=False, strip=False,

View file

@ -1,5 +1,4 @@
# tabs/review_tab.py # tabs/review_tab.py
import random
import os import os
import re import re
import subprocess import subprocess
@ -60,14 +59,15 @@ class ReviewTab(QWidget):
# Left Half: Live Translation Grid View Table # Left Half: Live Translation Grid View Table
self.table = QTableWidget() self.table = QTableWidget()
self.table.setColumnCount(2) self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(["English Phrase", "Spanish Translation"]) self.table.setHorizontalHeaderLabels(["Sort", "English Phrase", "Spanish Translation"])
self.table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows) self.table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)
self.table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers) self.table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
header = self.table.horizontalHeader() header = self.table.horizontalHeader()
header.setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch) header.setSectionResizeMode(0, QHeaderView.ResizeMode.ResizeToContents)
header.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch) header.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)
header.setSectionResizeMode(2, QHeaderView.ResizeMode.Stretch)
split_layout.addWidget(self.table, stretch=1) split_layout.addWidget(self.table, stretch=1)
@ -192,7 +192,7 @@ class ReviewTab(QWidget):
@pyqtSlot() @pyqtSlot()
def handle_live_filter(self): def handle_live_filter(self):
"""Filters grid contents and generates a randomized matching queue for the card engine.""" """Filters grid contents and sorts by sort_order for the card engine."""
self.table.blockSignals(True) self.table.blockSignals(True)
self.table.setRowCount(0) self.table.setRowCount(0)
@ -200,7 +200,6 @@ class ReviewTab(QWidget):
filter_tag = self.txt_review_tags.text().lower().strip() filter_tag = self.txt_review_tags.text().lower().strip()
self.filtered_review_pool = [] self.filtered_review_pool = []
visible_row_index = 0
for row in self.all_cached_records: for row in self.all_cached_records:
val_ctx = (row["source_context"] or "").lower() val_ctx = (row["source_context"] or "").lower()
@ -209,15 +208,21 @@ class ReviewTab(QWidget):
if (filter_ctx in val_ctx) and (filter_tag in val_tag): if (filter_ctx in val_ctx) and (filter_tag in val_tag):
self.filtered_review_pool.append(row) self.filtered_review_pool.append(row)
self.table.insertRow(visible_row_index) # Sort sequentially by sort_order (fallback to translation_id if unset)
self.table.setItem(visible_row_index, 0, QTableWidgetItem(row["en_text"])) self.filtered_review_pool.sort(
self.table.setItem(visible_row_index, 1, QTableWidgetItem(row["es_text"])) key=lambda r: (r.get("sort_order") if r.get("sort_order") is not None else 999999, r.get("translation_id", 0))
visible_row_index += 1 )
visible_row_index = 0
for row in self.filtered_review_pool:
self.table.insertRow(visible_row_index)
self.table.setItem(visible_row_index, 0, QTableWidgetItem(str(row.get("sort_order", 0))))
self.table.setItem(visible_row_index, 1, QTableWidgetItem(row["en_text"]))
self.table.setItem(visible_row_index, 2, QTableWidgetItem(row["es_text"]))
visible_row_index += 1
self.table.blockSignals(False) self.table.blockSignals(False)
# Reshuffle the active localized queue stack and reset card state tracking pointer
random.shuffle(self.filtered_review_pool)
self.current_index = 0 if self.filtered_review_pool else -1 self.current_index = 0 if self.filtered_review_pool else -1
self.is_flipped = False self.is_flipped = False
self.display_current_card() self.display_current_card()
@ -251,7 +256,7 @@ class ReviewTab(QWidget):
@pyqtSlot() @pyqtSlot()
def handle_card_interaction(self): def handle_card_interaction(self):
"""State machine cycling through card flipped values or increments indices sequential steps.""" """State machine cycling through card flipped values and automatically playing audio on both side transitions."""
if not self.filtered_review_pool: if not self.filtered_review_pool:
return return
@ -259,15 +264,18 @@ class ReviewTab(QWidget):
# Transition State: Front -> Back # Transition State: Front -> Back
self.is_flipped = True self.is_flipped = True
self.display_current_card() self.display_current_card()
# Automatically play Spanish neural audio on flip
self.play_card_audio()
else: else:
# Transition State: Advance to next index item row # Transition State: Advance to next sequential item
self.current_index += 1 self.current_index += 1
if self.current_index >= len(self.filtered_review_pool): if self.current_index >= len(self.filtered_review_pool):
self.current_index = 0 self.current_index = 0
random.shuffle(self.filtered_review_pool) # Rescramble on completion pass loops
self.is_flipped = False self.is_flipped = False
self.display_current_card() self.display_current_card()
# Automatically play English neural audio on advancing to next card
self.play_card_audio()
def _async_edge_speech_worker(self, text, voice, rate_modifier): def _async_edge_speech_worker(self, text, voice, rate_modifier):
"""Background thread worker to render neural speech with terminal debug logging.""" """Background thread worker to render neural speech with terminal debug logging."""