From 58345dc7c09532d3a9e9ba2cea8217960fb2c394 Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Sun, 8 Feb 2026 18:54:06 +0100 Subject: [PATCH] Fix delete corruption, promote desync, and shallow copies - Delete sequence: add ui_reset_token increment to prevent shifted sequences from inheriting deleted sequence's widget state - Promote: update data_cache with single_data so UI reflects the file format change without requiring a manual refresh - Mass update & clone: use copy.deepcopy to avoid shared mutable references between sequences Co-Authored-By: Claude Opus 4.6 --- tab_batch.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tab_batch.py b/tab_batch.py index 9e05936..e25cb44 100644 --- a/tab_batch.py +++ b/tab_batch.py @@ -56,7 +56,7 @@ def _render_mass_update(batch_list, data, file_path, key_prefix): if st.button("Apply Changes", type="primary", key=f"{key_prefix}_mass_apply"): for i in target_indices: for key in selected_keys: - batch_list[i][key] = source_seq.get(key) + batch_list[i][key] = copy.deepcopy(source_seq.get(key)) # Save with history snapshot data[KEY_BATCH_DATA] = batch_list @@ -216,7 +216,7 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi with act_c2: cl_1, cl_2 = st.columns(2) if cl_1.button("👯 Next", key=f"{prefix}_c_next", help="Clone and insert below", use_container_width=True): - new_seq = seq.copy() + new_seq = copy.deepcopy(seq) max_sn = 0 for s in batch_list: max_sn = max(max_sn, int(s.get(KEY_SEQUENCE_NUMBER, 0))) new_seq[KEY_SEQUENCE_NUMBER] = max_sn + 1 @@ -228,7 +228,7 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi st.rerun() if cl_2.button("⏬ End", key=f"{prefix}_c_end", help="Clone and add to bottom", use_container_width=True): - new_seq = seq.copy() + new_seq = copy.deepcopy(seq) max_sn = 0 for s in batch_list: max_sn = max(max_sn, int(s.get(KEY_SEQUENCE_NUMBER, 0))) new_seq[KEY_SEQUENCE_NUMBER] = max_sn + 1 @@ -247,6 +247,8 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi single_data[KEY_HISTORY_TREE] = data.get(KEY_HISTORY_TREE, {}) if KEY_SEQUENCE_NUMBER in single_data: del single_data[KEY_SEQUENCE_NUMBER] save_json(file_path, single_data) + st.session_state.data_cache = single_data + st.session_state.ui_reset_token += 1 st.toast("Converted to Single!", icon="✅") st.rerun() @@ -256,6 +258,7 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi batch_list.pop(i) data[KEY_BATCH_DATA] = batch_list save_json(file_path, data) + st.session_state.ui_reset_token += 1 st.rerun() st.markdown("---")