Replace legacy import with source sequence selector
Source file picker now shows all sequences in the selected file with a dropdown, replacing the outdated history entry selector. Both "From Source" and per-sequence "Copy Source" buttons use the selected sequence. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
53
tab_batch.py
53
tab_batch.py
@@ -159,7 +159,7 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
|
|||||||
# --- ADD NEW SEQUENCE AREA ---
|
# --- ADD NEW SEQUENCE AREA ---
|
||||||
st.subheader("Add New Sequence")
|
st.subheader("Add New Sequence")
|
||||||
ac1, ac2 = st.columns(2)
|
ac1, ac2 = st.columns(2)
|
||||||
|
|
||||||
with ac1:
|
with ac1:
|
||||||
file_options = [f.name for f in json_files]
|
file_options = [f.name for f in json_files]
|
||||||
d_idx = file_options.index(selected_file_name) if selected_file_name in file_options else 0
|
d_idx = file_options.index(selected_file_name) if selected_file_name in file_options else 0
|
||||||
@@ -167,12 +167,21 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
|
|||||||
src_data, _ = load_json(current_dir / src_name)
|
src_data, _ = load_json(current_dir / src_name)
|
||||||
|
|
||||||
with ac2:
|
with ac2:
|
||||||
src_hist = src_data.get(KEY_PROMPT_HISTORY, [])
|
src_batch = src_data.get(KEY_BATCH_DATA, [])
|
||||||
h_opts = [f"#{i+1}: {h.get('note', 'No Note')} ({h.get('prompt', '')[:15]}...)" for i, h in enumerate(src_hist)] if src_hist else []
|
if src_batch:
|
||||||
sel_hist = st.selectbox("History Entry (Legacy):", h_opts, key="batch_src_hist")
|
seq_opts = list(range(len(src_batch)))
|
||||||
|
sel_seq_idx = st.selectbox(
|
||||||
|
"Source Sequence:",
|
||||||
|
seq_opts,
|
||||||
|
format_func=lambda i: format_seq_label(src_batch[i].get(KEY_SEQUENCE_NUMBER, i + 1)),
|
||||||
|
key="batch_src_seq"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
st.caption("Single file (no sequences)")
|
||||||
|
sel_seq_idx = None
|
||||||
|
|
||||||
|
bc1, bc2 = st.columns(2)
|
||||||
|
|
||||||
bc1, bc2, bc3 = st.columns(3)
|
|
||||||
|
|
||||||
def add_sequence(new_item):
|
def add_sequence(new_item):
|
||||||
max_seq = 0
|
max_seq = 0
|
||||||
for s in batch_list:
|
for s in batch_list:
|
||||||
@@ -183,7 +192,7 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
|
|||||||
|
|
||||||
for k in [KEY_PROMPT_HISTORY, KEY_HISTORY_TREE, "note", "loras"]:
|
for k in [KEY_PROMPT_HISTORY, KEY_HISTORY_TREE, "note", "loras"]:
|
||||||
if k in new_item: del new_item[k]
|
if k in new_item: del new_item[k]
|
||||||
|
|
||||||
batch_list.append(new_item)
|
batch_list.append(new_item)
|
||||||
data[KEY_BATCH_DATA] = batch_list
|
data[KEY_BATCH_DATA] = batch_list
|
||||||
save_json(file_path, data)
|
save_json(file_path, data)
|
||||||
@@ -193,28 +202,14 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
|
|||||||
if bc1.button("➕ Add Empty", use_container_width=True):
|
if bc1.button("➕ Add Empty", use_container_width=True):
|
||||||
add_sequence(DEFAULTS.copy())
|
add_sequence(DEFAULTS.copy())
|
||||||
|
|
||||||
if bc2.button("➕ From File", use_container_width=True, help=f"Copy {src_name}"):
|
if bc2.button("➕ From Source", use_container_width=True, help=f"Import from {src_name}"):
|
||||||
item = DEFAULTS.copy()
|
item = DEFAULTS.copy()
|
||||||
flat = src_data[KEY_BATCH_DATA][0] if KEY_BATCH_DATA in src_data and src_data[KEY_BATCH_DATA] else src_data
|
if src_batch and sel_seq_idx is not None:
|
||||||
item.update(flat)
|
item.update(src_batch[sel_seq_idx])
|
||||||
|
else:
|
||||||
|
item.update(src_data)
|
||||||
add_sequence(item)
|
add_sequence(item)
|
||||||
|
|
||||||
if bc3.button("➕ From History", use_container_width=True, disabled=not src_hist):
|
|
||||||
if sel_hist:
|
|
||||||
try:
|
|
||||||
idx = int(sel_hist.split(":")[0].replace("#", "")) - 1
|
|
||||||
if idx < 0 or idx >= len(src_hist):
|
|
||||||
st.error(f"History index {idx + 1} out of range.")
|
|
||||||
else:
|
|
||||||
item = DEFAULTS.copy()
|
|
||||||
h_item = src_hist[idx]
|
|
||||||
item.update(h_item)
|
|
||||||
if "loras" in h_item and isinstance(h_item["loras"], dict):
|
|
||||||
item.update(h_item["loras"])
|
|
||||||
add_sequence(item)
|
|
||||||
except (ValueError, IndexError) as e:
|
|
||||||
st.error(f"Could not parse history selection: {e}")
|
|
||||||
|
|
||||||
# --- RENDER LIST ---
|
# --- RENDER LIST ---
|
||||||
st.markdown("---")
|
st.markdown("---")
|
||||||
info_col, reorder_col = st.columns([3, 1])
|
info_col, reorder_col = st.columns([3, 1])
|
||||||
@@ -260,8 +255,10 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
|
|||||||
with act_c1:
|
with act_c1:
|
||||||
if st.button(f"📥 Copy {src_name}", key=f"{prefix}_copy", use_container_width=True):
|
if st.button(f"📥 Copy {src_name}", key=f"{prefix}_copy", use_container_width=True):
|
||||||
item = DEFAULTS.copy()
|
item = DEFAULTS.copy()
|
||||||
flat = src_data[KEY_BATCH_DATA][0] if KEY_BATCH_DATA in src_data and src_data[KEY_BATCH_DATA] else src_data
|
if src_batch and sel_seq_idx is not None:
|
||||||
item.update(flat)
|
item.update(src_batch[sel_seq_idx])
|
||||||
|
else:
|
||||||
|
item.update(src_data)
|
||||||
item[KEY_SEQUENCE_NUMBER] = seq_num
|
item[KEY_SEQUENCE_NUMBER] = seq_num
|
||||||
for k in [KEY_PROMPT_HISTORY, KEY_HISTORY_TREE]:
|
for k in [KEY_PROMPT_HISTORY, KEY_HISTORY_TREE]:
|
||||||
if k in item: del item[k]
|
if k in item: del item[k]
|
||||||
|
|||||||
Reference in New Issue
Block a user