Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
Update ui.py
Browse files
ui.py
CHANGED
|
@@ -62,17 +62,20 @@ def render_categories_sidebar(all_speaker_tokens):
|
|
| 62 |
)
|
| 63 |
st.sidebar.divider()
|
| 64 |
|
| 65 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
all_claimed = {
|
| 67 |
token
|
| 68 |
-
for
|
| 69 |
-
for token in
|
| 70 |
}
|
| 71 |
|
| 72 |
for i, category in enumerate(st.session_state.categories):
|
| 73 |
ms_key = f"multiselect_{category}"
|
| 74 |
-
if ms_key not in st.session_state:
|
| 75 |
-
st.session_state[ms_key] = list(st.session_state.categorySelect[i]) if i < len(st.session_state.categorySelect) else []
|
| 76 |
label_col, trash_col = st.sidebar.columns([5, 1])
|
| 77 |
label_col.markdown(f"**{category}**")
|
| 78 |
trash_col.button(
|
|
@@ -80,7 +83,7 @@ def render_categories_sidebar(all_speaker_tokens):
|
|
| 80 |
on_click=removeCategory, args=(i,),
|
| 81 |
help=f"Remove {category}",
|
| 82 |
)
|
| 83 |
-
this_role_tokens = set(st.session_state.
|
| 84 |
available_tokens = [
|
| 85 |
t for t in all_speaker_tokens
|
| 86 |
if t not in all_claimed or t in this_role_tokens
|
|
@@ -111,16 +114,17 @@ def render_rename_sidebar(currFile, speakerNames, all_speaker_tokens):
|
|
| 111 |
st.sidebar.divider()
|
| 112 |
|
| 113 |
def _on_grename_change(idx):
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
enforceGlobalRenameExclusivity(idx)
|
| 118 |
|
| 119 |
-
# Build
|
|
|
|
| 120 |
all_claimed = {
|
| 121 |
token
|
| 122 |
-
for e in st.session_state.globalRenames
|
| 123 |
-
for token in e["speakers"]
|
| 124 |
}
|
| 125 |
|
| 126 |
for idx, entry in enumerate(st.session_state.globalRenames):
|
|
@@ -134,14 +138,15 @@ def render_rename_sidebar(currFile, speakerNames, all_speaker_tokens):
|
|
| 134 |
on_click=removeGlobalRename, args=(idx,),
|
| 135 |
help=f"Remove '{entry['name']}'",
|
| 136 |
)
|
| 137 |
-
#
|
| 138 |
-
|
|
|
|
|
|
|
|
|
|
| 139 |
available_tokens = [
|
| 140 |
t for t in all_speaker_tokens
|
| 141 |
if t not in all_claimed or t in this_entry_tokens
|
| 142 |
]
|
| 143 |
-
current_val = st.session_state.get(grkey, "NOT SET")
|
| 144 |
-
print(f"[DEBUG render] {entry['name']}: entry.speakers={entry['speakers']} grkey_val={current_val} available={available_tokens}")
|
| 145 |
st.sidebar.multiselect(
|
| 146 |
f"Speakers for {entry['name']}", options=available_tokens,
|
| 147 |
key=grkey, on_change=_on_grename_change, args=(idx,),
|
|
|
|
| 62 |
)
|
| 63 |
st.sidebar.divider()
|
| 64 |
|
| 65 |
+
for i, category in enumerate(st.session_state.categories):
|
| 66 |
+
ms_key = f"multiselect_{category}"
|
| 67 |
+
if ms_key not in st.session_state:
|
| 68 |
+
st.session_state[ms_key] = list(st.session_state.categorySelect[i]) if i < len(st.session_state.categorySelect) else []
|
| 69 |
+
|
| 70 |
+
# Build claimed set from widget keys (source of truth for what's displayed)
|
| 71 |
all_claimed = {
|
| 72 |
token
|
| 73 |
+
for i, category in enumerate(st.session_state.categories)
|
| 74 |
+
for token in st.session_state.get(f"multiselect_{category}", [])
|
| 75 |
}
|
| 76 |
|
| 77 |
for i, category in enumerate(st.session_state.categories):
|
| 78 |
ms_key = f"multiselect_{category}"
|
|
|
|
|
|
|
| 79 |
label_col, trash_col = st.sidebar.columns([5, 1])
|
| 80 |
label_col.markdown(f"**{category}**")
|
| 81 |
trash_col.button(
|
|
|
|
| 83 |
on_click=removeCategory, args=(i,),
|
| 84 |
help=f"Remove {category}",
|
| 85 |
)
|
| 86 |
+
this_role_tokens = set(st.session_state.get(ms_key, []))
|
| 87 |
available_tokens = [
|
| 88 |
t for t in all_speaker_tokens
|
| 89 |
if t not in all_claimed or t in this_role_tokens
|
|
|
|
| 114 |
st.sidebar.divider()
|
| 115 |
|
| 116 |
def _on_grename_change(idx):
|
| 117 |
+
st.session_state.globalRenames[idx]["speakers"] = list(
|
| 118 |
+
st.session_state[_global_rename_key(idx)]
|
| 119 |
+
)
|
| 120 |
enforceGlobalRenameExclusivity(idx)
|
| 121 |
|
| 122 |
+
# Build claimed set from widget keys (not entry["speakers"] data) so it
|
| 123 |
+
# matches exactly what Streamlit is actually displaying as selected.
|
| 124 |
all_claimed = {
|
| 125 |
token
|
| 126 |
+
for i, e in enumerate(st.session_state.globalRenames)
|
| 127 |
+
for token in st.session_state.get(_global_rename_key(i), e["speakers"])
|
| 128 |
}
|
| 129 |
|
| 130 |
for idx, entry in enumerate(st.session_state.globalRenames):
|
|
|
|
| 138 |
on_click=removeGlobalRename, args=(idx,),
|
| 139 |
help=f"Remove '{entry['name']}'",
|
| 140 |
)
|
| 141 |
+
# Use the widget's current value (not entry["speakers"]) as this entry's
|
| 142 |
+
# owned tokens — they can drift, and the widget value is what Streamlit
|
| 143 |
+
# actually displays. This prevents Streamlit silently dropping selections
|
| 144 |
+
# when available_tokens is computed from stale entry["speakers"] data.
|
| 145 |
+
this_entry_tokens = set(st.session_state.get(grkey, entry["speakers"]))
|
| 146 |
available_tokens = [
|
| 147 |
t for t in all_speaker_tokens
|
| 148 |
if t not in all_claimed or t in this_entry_tokens
|
| 149 |
]
|
|
|
|
|
|
|
| 150 |
st.sidebar.multiselect(
|
| 151 |
f"Speakers for {entry['name']}", options=available_tokens,
|
| 152 |
key=grkey, on_change=_on_grename_change, args=(idx,),
|