sort order to Flashcard Review
This commit is contained in:
parent
ed1c6b9d4e
commit
8bc86e6936
2 changed files with 25 additions and 17 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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."""
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue