diff --git a/gui/workflow_tab.py b/gui/workflow_tab.py
index 70d6a75..1fa6a0e 100644
--- a/gui/workflow_tab.py
+++ b/gui/workflow_tab.py
@@ -1422,39 +1422,8 @@ class WorkflowTab(QWidget):
layout.setContentsMargins(20, 8, 20, 4)
layout.setSpacing(6)
- # ---- Parse Speakers -------------------------------------------------
- spk_box = QGroupBox("3a — Parse Speakers (Auto-detect Names)")
- spk_box.setStyleSheet(self._task_box_style())
- spk_inner = QVBoxLayout(spk_box)
- spk_inner.setSpacing(4)
-
- spk_hint = QLabel(
- "Scans every file in files/ and extracts detected speaker names "
- "into a # Speakers section of vocab.txt — run this before using the AI prompt below."
- )
- spk_hint.setTextFormat(Qt.RichText)
- spk_hint.setWordWrap(True)
- spk_hint.setStyleSheet("color:#9d9d9d;font-size:13px;")
- spk_inner.addWidget(spk_hint)
-
- spk_btn_row = QHBoxLayout()
- self._parse_speakers_btn = _make_btn("🔍 Parse Speakers", "#007acc")
- self._parse_speakers_btn.setFixedWidth(180)
- self._parse_speakers_btn.setToolTip(
- "Scan all game files for speaker names and write them to vocab.txt"
- )
- self._parse_speakers_btn.clicked.connect(self._run_parse_speakers)
- spk_btn_row.addWidget(self._parse_speakers_btn)
- spk_btn_row.addStretch()
- spk_inner.addLayout(spk_btn_row)
- self._parse_speakers_status = QLabel("")
- self._parse_speakers_status.setStyleSheet("color:#9d9d9d;font-size:13px;")
- spk_inner.addWidget(self._parse_speakers_status)
-
- layout.addWidget(spk_box)
-
# ---- Copilot / Cursor prompt helpers --------------------------------
- prompt_box = QGroupBox("3b — AI Prompt Helpers (Copilot / Cursor)")
+ prompt_box = QGroupBox("3a — AI Prompt Helpers (Copilot / Cursor)")
prompt_box.setStyleSheet(self._task_box_style())
pb_inner = QVBoxLayout(prompt_box)
pb_inner.setSpacing(4)
@@ -2211,57 +2180,6 @@ class WorkflowTab(QWidget):
# Step 1 – Vocab
# ─────────────────────────────────────────────────────────────────────────
- def _run_parse_speakers(self):
- """Launch a speaker-parse pass over files/ and write results to vocab.txt."""
- try:
- from gui.translation_tab import TranslationWorker
- except Exception as exc:
- self._log(f"Could not import TranslationWorker: {exc}")
- return
-
- project_root = Path(__file__).parent.parent
- files_dir = project_root / "files"
- all_json = sorted(
- p.name for p in files_dir.glob("*.json") if p.name != ".gitkeep"
- ) if files_dir.exists() else []
-
- if not all_json:
- self._log("No JSON files found in files/. Run Step 1 (import) first.")
- self._parse_speakers_status.setText("No files found in files/.")
- return
-
- self._log(f"Parsing speakers from {len(all_json)} file(s)...")
- self._parse_speakers_btn.setEnabled(False)
- self._parse_speakers_status.setText("Running...")
-
- module_info = ["RPG Maker MV/MZ", [".json"], None]
- worker = TranslationWorker(
- project_root, module_info, estimate_only=False,
- selected_files=all_json,
- parse_speakers=True,
- )
- worker.log_signal.connect(self._log)
- worker.progress_signal.connect(
- lambda cur, tot, fn: self._parse_speakers_status.setText(
- f"[{cur}/{tot}] {Path(fn).name}"
- )
- )
- worker.finished_signal.connect(self._on_parse_speakers_done)
- self._worker = worker
- worker.start()
-
- def _on_parse_speakers_done(self, ok: bool, msg: str):
- self._parse_speakers_btn.setEnabled(True)
- if ok:
- self._parse_speakers_status.setText(
- "Done — # Speakers section written to vocab.txt"
- )
- self._reload_vocab()
- self._log("Speaker parse complete. vocab.txt updated with # Speakers.")
- else:
- self._parse_speakers_status.setText(f"Failed: {msg}")
- self._log(f"Speaker parse failed: {msg}")
-
_BASE_SEPARATOR = "# ── Base Vocabulary (auto-appended from vocab_base.txt — do not edit below) ──\n"
def _copy_glossary_prompt(self):