duongthienz commited on
Commit
cfd7fb1
·
verified ·
1 Parent(s): e10e7d3

fix bug between rename speaker and rename multiple speakers

Browse files
Files changed (1) hide show
  1. ui.py +14 -9
ui.py CHANGED
@@ -114,21 +114,27 @@ def render_rename_sidebar(currFile, speakerNames, all_speaker_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):
131
  grkey = _global_rename_key(idx)
 
132
  if grkey not in st.session_state:
133
  st.session_state[grkey] = list(entry["speakers"])
134
  label_col, trash_col = st.sidebar.columns([5, 1])
@@ -138,11 +144,10 @@ def render_rename_sidebar(currFile, speakerNames, all_speaker_tokens):
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
 
114
  st.sidebar.divider()
115
 
116
  def _on_grename_change(idx):
117
+ # Write the widget's new value into the data model first
118
  st.session_state.globalRenames[idx]["speakers"] = list(
119
  st.session_state[_global_rename_key(idx)]
120
  )
121
+ # Remove the changed entry's widget key so it re-seeds cleanly on
122
+ # the next render (avoids Streamlit "cannot modify instantiated widget" errors)
123
+ st.session_state.pop(_global_rename_key(idx), None)
124
  enforceGlobalRenameExclusivity(idx)
125
 
126
+ # Build claimed set from the data model (entry["speakers"]) as the canonical
127
+ # source of truth. Widget keys may be absent after a mutation (we pop them
128
+ # intentionally), so falling back to them can produce a stale claimed set.
129
  all_claimed = {
130
  token
131
+ for entry in st.session_state.globalRenames
132
+ for token in entry["speakers"]
133
  }
134
 
135
  for idx, entry in enumerate(st.session_state.globalRenames):
136
  grkey = _global_rename_key(idx)
137
+ # Seed the widget key from entry["speakers"] if it was cleared by a mutation
138
  if grkey not in st.session_state:
139
  st.session_state[grkey] = list(entry["speakers"])
140
  label_col, trash_col = st.sidebar.columns([5, 1])
 
144
  on_click=removeGlobalRename, args=(idx,),
145
  help=f"Remove '{entry['name']}'",
146
  )
147
+ # Use entry["speakers"] (the data model) as this entry's owned tokens.
148
+ # Widget keys are popped during mutations, so using them here would give
149
+ # a stale empty set and incorrectly exclude tokens from available_tokens.
150
+ this_entry_tokens = set(entry["speakers"])
 
151
  available_tokens = [
152
  t for t in all_speaker_tokens
153
  if t not in all_claimed or t in this_entry_tokens