diff --git a/src/gui.py b/src/gui.py index ad1893a..2dbaec6 100644 --- a/src/gui.py +++ b/src/gui.py @@ -340,8 +340,73 @@ class GUI(QMainWindow): self.subtitle_edit.setPlainText("# 字幕文件不存在") def _on_apply(self): - """Task 10 预留:应用修改""" - pass + """ + 应用按钮:收集所有修改,调用底层原子操作,重烧最终视频。 + + 逻辑: + 1. 检查字幕是否有修改(对比 v1_content.srt) + - 有修改 → reburn_subtitles(user_texts) + 2. 检查 clips 是否有修改 + - clips 修改后(add/delete/reextract)已通过各自的方法自动保存 + - 但需要重新烧录标题轨 → reburn_titles() + 3. 最后合并+烧录最终视频 + """ + self.apply_btn.setEnabled(False) + self.status_label.setText("正在应用更改...") + + def work(): + try: + changed = False + + # 1. 处理字幕修改 + srt_path = os.path.join(self.pipeline.subs_dir, 'v1_content.srt') + current_text = self.subtitle_edit.toPlainText() + + if os.path.exists(srt_path): + with open(srt_path, 'r', encoding='utf-8') as f: + original_text = f.read() + else: + original_text = "" + + if current_text != original_text: + # 字幕有修改,写入并重烧 + self.signaller.log_signal.emit("检测到字幕修改,保存并重烧...") + self.status_label.setText("保存字幕更改...") + with open(srt_path, 'w', encoding='utf-8') as f: + f.write(current_text) + self.pipeline.reburn_subtitles(current_text) + changed = True + + # 2. 检查是否有 unmatched clips(不参与烧录) + unmatched = [i for i, c in enumerate(self.pipeline.clips) if not c.get('matched', True)] + if unmatched: + self.signaller.log_signal.emit(f"警告: {len(unmatched)} 个 clip 未匹配到转录内容,不参与烧录") + self.status_label.setText(f"警告: {len(unmatched)} 个 clip 未匹配,跳过") + + # 3. 只要 clips 有任何修改(add/delete/reextract),都需要重烧标题轨 + # 这些修改已经在各自的方法里保存了 config,只需要重烧 + # reburn_titles() 会用最新的 clips config 生成标题轨 + self.signaller.log_signal.emit("重烧标题轨...") + self.status_label.setText("重烧标题轨...") + self.pipeline.reburn_titles() + changed = True + + if changed: + self.signaller.log_signal.emit("应用完成") + self.status_label.setText("应用完成!") + else: + self.signaller.log_signal.emit("没有检测到更改") + self.status_label.setText("没有更改") + + except Exception as e: + self.signaller.log_signal.emit(f"错误: {e}") + import traceback + self.signaller.log_signal.emit(traceback.format_exc()) + self.status_label.setText(f"错误: {e}") + finally: + self.apply_btn.setEnabled(True) + + threading.Thread(target=work, daemon=True).start() def _setup_new_project_ui(self): """新建项目的文件选择界面"""