diff --git a/spanish_trainer.db b/spanish_trainer.db
index 301cac0..66228e7 100644
Binary files a/spanish_trainer.db and b/spanish_trainer.db differ
diff --git a/tabs/sandbox_tab.py b/tabs/sandbox_tab.py
index 6e3aa26..3978202 100644
--- a/tabs/sandbox_tab.py
+++ b/tabs/sandbox_tab.py
@@ -44,6 +44,12 @@ class SandboxTab(QWidget):
self.txt_context.setPlaceholderText("e.g., Camino 2027, Café, Market conversation...")
self.txt_context.setStyleSheet("padding: 6px; font-size: 14px;")
self.txt_context.textChanged.connect(self.handle_live_filter)
+
+ # NEW: Tags input field with live filter connection
+ self.txt_tags = QLineEdit()
+ self.txt_tags.setPlaceholderText("e.g., verb, greeting, subjunctive, travel...")
+ self.txt_tags.setStyleSheet("padding: 6px; font-size: 14px;")
+ self.txt_tags.textChanged.connect(self.handle_live_filter)
self.txt_notes = QLineEdit()
self.txt_notes.setPlaceholderText("Grammar rules, formal vs informal nuances...")
@@ -53,6 +59,7 @@ class SandboxTab(QWidget):
form_layout.addRow(QLabel("English Text:"), self.txt_english)
form_layout.addRow(QLabel("Spanish Text:"), self.txt_spanish)
form_layout.addRow(QLabel("Source Context:"), self.txt_context)
+ form_layout.addRow(QLabel("Tags:"), self.txt_tags)
form_layout.addRow(QLabel("Historical Notes:"), self.txt_notes)
main_layout.addWidget(form_container)
@@ -155,8 +162,8 @@ class SandboxTab(QWidget):
# --- SECTION 4: DATALIST DISPLAY REGION ---
self.table = QTableWidget()
- self.table.setColumnCount(5)
- self.table.setHorizontalHeaderLabels(["ID", "English Phrase", "Spanish Translation", "Context", "Notes"])
+ self.table.setColumnCount(6) # Increased to 6 to display Tags column
+ self.table.setHorizontalHeaderLabels(["ID", "English Phrase", "Spanish Translation", "Context", "Tags", "Notes"])
self.table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)
self.table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
@@ -169,7 +176,8 @@ class SandboxTab(QWidget):
header.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)
header.setSectionResizeMode(2, QHeaderView.ResizeMode.Stretch)
header.setSectionResizeMode(3, QHeaderView.ResizeMode.Interactive)
- header.setSectionResizeMode(4, QHeaderView.ResizeMode.Interactive)
+ header.setSectionResizeMode(4, QHeaderView.ResizeMode.Interactive) # Tags Header
+ header.setSectionResizeMode(5, QHeaderView.ResizeMode.Interactive) # Notes Header
main_layout.addWidget(self.table)
@@ -193,13 +201,14 @@ class SandboxTab(QWidget):
@pyqtSlot()
def handle_live_filter(self):
- """Filters the visible database entries based on current text input criteria."""
+ """Filters the visible entries based on English, Spanish, Context, and Tags criteria."""
# Temporary block signals to prevent selection loops from fighting text changes
self.table.blockSignals(True)
filter_en = self.txt_english.text().lower().strip()
filter_es = self.txt_spanish.text().lower().strip()
filter_ctx = self.txt_context.text().lower().strip()
+ filter_tag = self.txt_tags.text().lower().strip() # Capture tag text query
self.table.setRowCount(0)
visible_row_index = 0
@@ -208,15 +217,17 @@ class SandboxTab(QWidget):
val_en = (row["en_text"] or "").lower()
val_es = (row["es_text"] or "").lower()
val_ctx = (row["source_context"] or "").lower()
+ val_tag = (row["tags"] or "").lower() # Extract tags criteria
- # Look for matches across English, Spanish, and Source Context
- if (filter_en in val_en) and (filter_es in val_es) and (filter_ctx in val_ctx):
+ # Look for explicit matching conditions across all 4 entry variables
+ if (filter_en in val_en) and (filter_es in val_es) and (filter_ctx in val_ctx) and (filter_tag in val_tag):
self.table.insertRow(visible_row_index)
item_id = QTableWidgetItem(str(row["translation_id"]))
item_en = QTableWidgetItem(row["en_text"])
item_es = QTableWidgetItem(row["es_text"])
item_ctx = QTableWidgetItem(row["source_context"] or "")
+ item_tag = QTableWidgetItem(row["tags"] or "")
item_nts = QTableWidgetItem(row["notes"] or "")
item_id.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
@@ -225,7 +236,8 @@ class SandboxTab(QWidget):
self.table.setItem(visible_row_index, 1, item_en)
self.table.setItem(visible_row_index, 2, item_es)
self.table.setItem(visible_row_index, 3, item_ctx)
- self.table.setItem(visible_row_index, 4, item_nts)
+ self.table.setItem(visible_row_index, 4, item_tag)
+ self.table.setItem(visible_row_index, 5, item_nts)
# If we have an active editing ID, highlight that specific row during re-renders
if self.selected_translation_id == row["translation_id"]:
@@ -256,17 +268,20 @@ class SandboxTab(QWidget):
self.txt_english.blockSignals(True)
self.txt_spanish.blockSignals(True)
self.txt_context.blockSignals(True)
+ self.txt_tags.blockSignals(True)
self.txt_notes.blockSignals(True)
self.selected_translation_id = record["translation_id"]
self.txt_english.setText(record["en_text"])
self.txt_spanish.setText(record["es_text"])
self.txt_context.setText(record["source_context"] or "")
+ self.txt_tags.setText(record["tags"] or "")
self.txt_notes.setText(record["notes"] or "")
self.txt_english.blockSignals(False)
self.txt_spanish.blockSignals(False)
self.txt_context.blockSignals(False)
+ self.txt_tags.blockSignals(False)
self.txt_notes.blockSignals(False)
@pyqtSlot()
@@ -284,8 +299,8 @@ class SandboxTab(QWidget):
en_text = self.txt_english.text().strip()
es_text = self.txt_spanish.text().strip()
context = self.txt_context.text().strip()
+ tags = self.txt_tags.text().strip()
notes = self.txt_notes.text().strip()
- tags = "" # Default empty placeholder string to fit the backend DB method signature
if not en_text or not es_text:
QMessageBox.warning(self, "Validation Alert", "Both English and Spanish base text blocks are required.")
@@ -293,14 +308,12 @@ class SandboxTab(QWidget):
try:
if self.selected_translation_id is not None:
- # Direct match for database.update_translation_record signature:
- # (translation_id, es_text, en_text, source_context, tags, notes)
+ # database.update_translation_record signature: (translation_id, es_text, en_text, source_context, tags, notes)
database.update_translation_record(
self.selected_translation_id, es_text, en_text, context, tags, notes
)
else:
- # Direct match for database.insert_translation_record signature:
- # (es_text, en_text, source_context, tags, notes)
+ # database.insert_translation_record signature: (es_text, en_text, source_context, tags, notes)
database.insert_translation_record(
es_text, en_text, context, tags, notes
)
@@ -331,16 +344,19 @@ class SandboxTab(QWidget):
self.txt_english.blockSignals(True)
self.txt_spanish.blockSignals(True)
self.txt_context.blockSignals(True)
+ self.txt_tags.blockSignals(True)
self.txt_notes.blockSignals(True)
self.txt_english.clear()
self.txt_spanish.clear()
self.txt_context.clear()
+ self.txt_tags.clear()
self.txt_notes.clear()
self.txt_english.blockSignals(False)
self.txt_spanish.blockSignals(False)
self.txt_context.blockSignals(False)
+ self.txt_tags.blockSignals(False)
self.txt_notes.blockSignals(False)
def reload_table_display(self):
@@ -358,6 +374,7 @@ class SandboxTab(QWidget):
item_en = QTableWidgetItem(row["en_text"])
item_es = QTableWidgetItem(row["es_text"])
item_ctx = QTableWidgetItem(row["source_context"] or "")
+ item_tag = QTableWidgetItem(row["tags"] or "")
item_nts = QTableWidgetItem(row["notes"] or "")
item_id.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
@@ -366,6 +383,7 @@ class SandboxTab(QWidget):
self.table.setItem(idx, 1, item_en)
self.table.setItem(idx, 2, item_es)
self.table.setItem(idx, 3, item_ctx)
- self.table.setItem(idx, 4, item_nts)
+ self.table.setItem(idx, 4, item_tag)
+ self.table.setItem(idx, 5, item_nts)
self.table.blockSignals(False)
\ No newline at end of file