feat(gui): integrate apply button with reburn logic
This commit is contained in:
+67
-2
@@ -340,8 +340,73 @@ class GUI(QMainWindow):
|
|||||||
self.subtitle_edit.setPlainText("# 字幕文件不存在")
|
self.subtitle_edit.setPlainText("# 字幕文件不存在")
|
||||||
|
|
||||||
def _on_apply(self):
|
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):
|
def _setup_new_project_ui(self):
|
||||||
"""新建项目的文件选择界面"""
|
"""新建项目的文件选择界面"""
|
||||||
|
|||||||
Reference in New Issue
Block a user