duongthienz commited on
Commit
fd13ed6
·
verified ·
1 Parent(s): c2ad1ab

Fix a bug with state change that can make index out of range

Browse files
Files changed (1) hide show
  1. state.py +19 -8
state.py CHANGED
@@ -121,13 +121,21 @@ def updateCategoryOptions(token_display_map=None):
121
  if st.session_state.resetResult:
122
  return
123
  display_to_raw = token_display_map or {}
 
 
 
 
 
 
 
 
 
124
  for i, category in enumerate(st.session_state.categories):
125
  ms_key = f"multiselect_{category}"
126
  display_vals = list(st.session_state.get(ms_key, []))
127
- # Translate display labels back to raw tokens for the data model
128
  raw_vals = [display_to_raw.get(t, t) for t in display_vals]
129
  st.session_state.categorySelect[i] = raw_vals
130
- # Keep widget key as display labels (do not overwrite with raw)
131
  # Recompute unusedSpeakers for all files
132
  all_assigned_tokens = {
133
  token
@@ -137,12 +145,15 @@ def updateCategoryOptions(token_display_map=None):
137
  for fname, result in st.session_state.results.items():
138
  if len(result) != 2:
139
  continue
140
- annotation, _ = result
141
- unused = [
142
- sp for sp in annotation.labels()
143
- if f"{fname}: {sp}" not in all_assigned_tokens
144
- ]
145
- st.session_state.unusedSpeakers[fname] = unused
 
 
 
146
 
147
 
148
  # ---------------------------------------------------------------------------
 
121
  if st.session_state.resetResult:
122
  return
123
  display_to_raw = token_display_map or {}
124
+
125
+ # Guard: ensure categorySelect has exactly one slot per category.
126
+ # Rapid interactions (e.g. addCategory firing mid-callback) can leave
127
+ # the two lists temporarily out of sync.
128
+ while len(st.session_state.categorySelect) < len(st.session_state.categories):
129
+ st.session_state.categorySelect.append([])
130
+ while len(st.session_state.categorySelect) > len(st.session_state.categories):
131
+ st.session_state.categorySelect.pop()
132
+
133
  for i, category in enumerate(st.session_state.categories):
134
  ms_key = f"multiselect_{category}"
135
  display_vals = list(st.session_state.get(ms_key, []))
 
136
  raw_vals = [display_to_raw.get(t, t) for t in display_vals]
137
  st.session_state.categorySelect[i] = raw_vals
138
+
139
  # Recompute unusedSpeakers for all files
140
  all_assigned_tokens = {
141
  token
 
145
  for fname, result in st.session_state.results.items():
146
  if len(result) != 2:
147
  continue
148
+ try:
149
+ annotation, _ = result
150
+ unused = [
151
+ sp for sp in annotation.labels()
152
+ if f"{fname}: {sp}" not in all_assigned_tokens
153
+ ]
154
+ st.session_state.unusedSpeakers[fname] = unused
155
+ except Exception:
156
+ pass
157
 
158
 
159
  # ---------------------------------------------------------------------------