Refactor sequence management and UI updates

Refactor sequence handling and UI elements in Streamlit app. Update custom parameters section and improve user experience.
This commit is contained in:
2026-01-02 01:02:35 +01:00
committed by GitHub
parent ceb9b86425
commit 39f4e7d96f

View File

@@ -1,5 +1,4 @@
import streamlit as st import streamlit as st
import random
from utils import DEFAULTS, save_json, load_json from utils import DEFAULTS, save_json, load_json
def create_batch_callback(original_filename, current_data, current_dir): def create_batch_callback(original_filename, current_data, current_dir):
@@ -34,6 +33,7 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
batch_list = data.get("batch_data", []) batch_list = data.get("batch_data", [])
# --- ADD NEW SEQUENCE AREA ---
st.subheader("Add New Sequence") st.subheader("Add New Sequence")
ac1, ac2 = st.columns(2) ac1, ac2 = st.columns(2)
@@ -83,17 +83,28 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
item.update(h_item["loras"]) item.update(h_item["loras"])
add_sequence(item) add_sequence(item)
# --- RENDER LIST ---
st.markdown("---") st.markdown("---")
st.info(f"Batch contains {len(batch_list)} sequences.") st.info(f"Batch contains {len(batch_list)} sequences.")
# Identify reserved keys to filter out standard fields # Define Standard Keys to exclude from Custom List
reserved = set(DEFAULTS.keys()) | {'sequence_number', 'prompt_history', 'note', 'batch_data'} lora_keys = ["lora 1 high", "lora 1 low", "lora 2 high", "lora 2 low", "lora 3 high", "lora 3 low"]
standard_keys = {
"general_prompt", "general_negative", "current_prompt", "negative", "prompt", "seed",
"camera", "flf", "sequence_number"
}
standard_keys.update(lora_keys)
# Add VACE/I2V keys
standard_keys.update([
"frame_to_skip", "input_a_frames", "input_b_frames", "reference switch", "vace schedule",
"reference path", "video file path", "reference image path", "flf image path"
])
for i, seq in enumerate(batch_list): for i, seq in enumerate(batch_list):
seq_num = seq.get("sequence_number", i+1) seq_num = seq.get("sequence_number", i+1)
prefix = f"{selected_file_name}_seq{i}_v{st.session_state.ui_reset_token}" prefix = f"{selected_file_name}_seq{i}_v{st.session_state.ui_reset_token}"
with st.expander(f"🎬 Sequence #{seq_num} : {seq.get('current_prompt', '')[:40]}...", expanded=False): with st.expander(f"🎬 Sequence #{seq_num}", expanded=False):
b1, b2, b3 = st.columns([1, 1, 2]) b1, b2, b3 = st.columns([1, 1, 2])
if b1.button(f"📥 Copy {src_name}", key=f"{prefix}_copy"): if b1.button(f"📥 Copy {src_name}", key=f"{prefix}_copy"):
@@ -134,7 +145,6 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
with c2: with c2:
seq["sequence_number"] = st.number_input("Seq Num", value=int(seq_num), key=f"{prefix}_sn_val") seq["sequence_number"] = st.number_input("Seq Num", value=int(seq_num), key=f"{prefix}_sn_val")
# Random Seed Button
s_row1, s_row2 = st.columns([3, 1]) s_row1, s_row2 = st.columns([3, 1])
seed_key = f"{prefix}_seed" seed_key = f"{prefix}_seed"
with s_row2: with s_row2:
@@ -144,7 +154,8 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
st.session_state[seed_key] = random.randint(0, 999999999999) st.session_state[seed_key] = random.randint(0, 999999999999)
st.rerun() st.rerun()
with s_row1: with s_row1:
seq["seed"] = st.number_input("Seed", value=int(seq.get("seed", 0)), key=seed_key) val = st.number_input("Seed", value=int(seq.get("seed", 0)), key=seed_key)
seq["seed"] = val
seq["camera"] = st.text_input("Camera", value=seq.get("camera", ""), key=f"{prefix}_cam") seq["camera"] = st.text_input("Camera", value=seq.get("camera", ""), key=f"{prefix}_cam")
seq["flf"] = st.text_input("FLF", value=str(seq.get("flf", DEFAULTS["flf"])), key=f"{prefix}_flf") seq["flf"] = st.text_input("FLF", value=str(seq.get("flf", DEFAULTS["flf"])), key=f"{prefix}_flf")
@@ -166,47 +177,44 @@ def render_batch_processor(data, file_path, json_files, current_dir, selected_fi
with st.expander("LoRA Settings"): with st.expander("LoRA Settings"):
lc1, lc2 = st.columns(2) lc1, lc2 = st.columns(2)
lkeys = ["lora 1 high", "lora 1 low", "lora 2 high", "lora 2 low", "lora 3 high", "lora 3 low"] for li, lk in enumerate(lora_keys):
for li, lk in enumerate(lkeys):
with (lc1 if li % 2 == 0 else lc2): with (lc1 if li % 2 == 0 else lc2):
seq[lk] = st.text_input(lk.title(), value=seq.get(lk, ""), key=f"{prefix}_{lk}") seq[lk] = st.text_input(lk.title(), value=seq.get(lk, ""), key=f"{prefix}_{lk}")
# --- CUSTOM PARAMETERS (Sequence Level) --- # --- CUSTOM PARAMETERS (BATCH) ---
st.markdown("---") st.markdown("---")
st.subheader("🔧 Custom Parameters") st.caption("🔧 Custom Parameters")
# Identify custom_keys = [k for k in seq.keys() if k not in standard_keys]
custom_keys = [k for k in seq.keys() if k not in reserved]
keys_to_remove = [] keys_to_remove = []
if custom_keys: if custom_keys:
for k in custom_keys: for k in custom_keys:
cc1, cc2, cc3 = st.columns([1, 2, 0.5]) ck1, ck2, ck3 = st.columns([1, 2, 0.5])
cc1.text_input("Key", value=k, disabled=True, key=f"{prefix}_ck_{k}", label_visibility="collapsed") ck1.text_input("Key", value=k, disabled=True, key=f"{prefix}_ck_lbl_{k}", label_visibility="collapsed")
val = cc2.text_input("Value", value=str(seq[k]), key=f"{prefix}_cv_{k}", label_visibility="collapsed") val = ck2.text_input("Value", value=str(seq[k]), key=f"{prefix}_cv_{k}", label_visibility="collapsed")
seq[k] = val # Update seq[k] = val
if cc3.button("🗑️", key=f"{prefix}_cdel_{k}"): if ck3.button("🗑️", key=f"{prefix}_cdel_{k}"):
keys_to_remove.append(k) keys_to_remove.append(k)
else:
st.caption("No custom keys.")
# Add New with st.expander(" Add Parameter to Sequence"):
with st.expander(" Add Parameter"): nk_col, nv_col = st.columns(2)
nk_col, nv_col, nbtn_col = st.columns([1, 1, 0.5]) new_k = nk_col.text_input("Key", key=f"{prefix}_new_k")
new_k = nk_col.text_input("Key", key=f"{prefix}_nk", placeholder="e.g. motion_scale") new_v = nv_col.text_input("Value", key=f"{prefix}_new_v")
new_v = nv_col.text_input("Value", key=f"{prefix}_nv", placeholder="1.5")
if nbtn_col.button("Add", key=f"{prefix}_add_cust"): if st.button("Add", key=f"{prefix}_add_cust"):
if new_k and new_k not in seq: if new_k and new_k not in seq:
seq[new_k] = new_v seq[new_k] = new_v
save_json(file_path, data) save_json(file_path, data)
st.session_state.ui_reset_token += 1
st.rerun() st.rerun()
# Apply Removals
if keys_to_remove: if keys_to_remove:
for k in keys_to_remove: for k in keys_to_remove:
del seq[k] del seq[k]
save_json(file_path, data) save_json(file_path, data)
st.session_state.ui_reset_token += 1
st.rerun() st.rerun()
st.markdown("---") st.markdown("---")