duongthienz commited on
Commit
fc51005
·
verified ·
1 Parent(s): ad384c9

Update ui.py

Browse files
Files changed (1) hide show
  1. ui.py +21 -16
ui.py CHANGED
@@ -62,17 +62,20 @@ def render_categories_sidebar(all_speaker_tokens):
62
  )
63
  st.sidebar.divider()
64
 
65
- # Tokens already claimed by any role, for exclusivity filtering
 
 
 
 
 
66
  all_claimed = {
67
  token
68
- for tokens in st.session_state.categorySelect
69
- for token in tokens
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.categorySelect[i]) if i < len(st.session_state.categorySelect) else set()
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
- new_val = list(st.session_state[_global_rename_key(idx)])
115
- print(f"[DEBUG _on_grename_change] idx={idx} name={st.session_state.globalRenames[idx]['name']} new_val={new_val}")
116
- st.session_state.globalRenames[idx]["speakers"] = new_val
117
  enforceGlobalRenameExclusivity(idx)
118
 
119
- # Build a set of every token already claimed by some entry, for fast lookup
 
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
- # Options = tokens owned by this entry + tokens not claimed by anyone
138
- this_entry_tokens = set(entry["speakers"])
 
 
 
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,),