import streamlit as st from callbacks import toggle_all_audio_checkboxes, callback_delete_selected_audios @st.fragment def audio_management_fragment(paths: dict): """A self-contained fragment for managing and deleting project audio files.""" with st.expander("🎧 管理專案音訊素材"): audio_dir = paths["audio"] output_dir = paths["output"] audio_files = [] if audio_dir.exists(): audio_files.extend(sorted(audio_dir.glob('*.wav'))) if output_dir.exists(): audio_files.extend(sorted(output_dir.glob('*.wav'))) if not audio_files: st.info("專案的 `audio` 和 `output` 資料夾中目前沒有音訊檔。") else: all_selected = all(st.session_state.get(f"delete_audio_cb_{f.name}", False) for f in audio_files) if st.session_state.get('select_all_audios', False) != all_selected: st.session_state.select_all_audios = all_selected st.markdown("勾選您想要刪除的音訊檔案,然後點擊下方的按鈕。") st.checkbox( "全選/取消全選", key="select_all_audios", on_change=toggle_all_audio_checkboxes, args=(audio_files,) ) with st.form("delete_audios_form"): for audio_file in audio_files: file_size_kb = audio_file.stat().st_size / 1024 label = f"**{audio_file.parent.name}/{audio_file.name}** ({file_size_kb:.2f} KB)" st.checkbox(label, key=f"delete_audio_cb_{audio_file.name}") submitted = st.form_submit_button("🟥 確認刪除選取的音訊", use_container_width=True, type="primary") if submitted: callback_delete_selected_audios(paths) st.rerun(scope="fragment")