feat(gui): integrate apply button with reburn logic

This commit is contained in:
hmo
2026-05-04 00:34:05 +08:00
parent b9dc5b163b
commit 2505f88b74
+67 -2
View File
@@ -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):
"""新建项目的文件选择界面"""