duongthienz commited on
Commit
2585a74
·
verified ·
1 Parent(s): 59be383

make role cross files like rename

Browse files

idk why i thought they were already the same

Files changed (1) hide show
  1. state.py +40 -32
state.py CHANGED
@@ -43,7 +43,7 @@ def init_session_state():
43
  "speakerRenames": {}, # {filename: {speaker: name}}
44
  "summaries": {}, # {filename: {df2, df3, ...}}
45
  "categories": ["Instructor", "Students"],
46
- "categorySelect": {}, # {filename: [[], [], ...]}
47
  "removeCategory": None,
48
  "resetResult": False,
49
  "unusedSpeakers": {}, # {filename: [speaker, ...]}
@@ -90,43 +90,48 @@ def convert_df(df):
90
  # ---------------------------------------------------------------------------
91
 
92
  def addCategory():
93
- new = st.session_state.categoryInput
 
 
94
  st.toast(f"Adding {new}")
95
- st.session_state[f"multiselect_{new}"] = []
96
  st.session_state.categories.append(new)
 
 
97
  st.session_state.categoryInput = ""
98
- for fname in st.session_state.categorySelect:
99
- st.session_state.categorySelect[fname].append([])
100
 
101
 
102
  def removeCategory(index):
103
  name = st.session_state.categories[index]
104
  st.toast(f"Removing {name}")
105
- del st.session_state[f"multiselect_{name}"]
106
- del st.session_state[f"remove_{name}"]
107
  del st.session_state.categories[index]
108
- for fname in st.session_state.categorySelect:
109
- del st.session_state.categorySelect[fname][index]
110
 
111
 
112
- def updateCategoryOptions(fileName):
 
113
  if st.session_state.resetResult:
114
  return
115
- currAnnotation, _ = st.session_state.results[fileName]
116
- speakerNames = list(currAnnotation.labels())
117
- saved_renames = st.session_state.speakerRenames.get(fileName, {})
118
- display_to_raw = {saved_renames.get(sp, sp): sp for sp in speakerNames}
119
- unusedSpeakers = copy.deepcopy(speakerNames)
120
  for i, category in enumerate(st.session_state.categories):
121
- display_choices = list(st.session_state[f"multiselect_{category}"])
122
- raw_choices = [display_to_raw.get(d, d) for d in display_choices]
123
- st.session_state.categorySelect[fileName][i] = raw_choices
124
- for sp in raw_choices:
125
- try:
126
- unusedSpeakers.remove(sp)
127
- except ValueError:
128
- pass
129
- st.session_state.unusedSpeakers[fileName] = unusedSpeakers
 
 
 
 
 
 
 
 
 
130
 
131
 
132
  # ---------------------------------------------------------------------------
@@ -254,10 +259,8 @@ def updateMultiSelect():
254
  st.session_state[f"rename_{fileName}_{sp}"] = saved
255
  raw_to_display[sp] = saved if saved else sp
256
  for i, category in enumerate(st.session_state.categories):
257
- raw_choices = st.session_state.categorySelect[fileName][i]
258
- st.session_state[f"multiselect_{category}"] = [
259
- raw_to_display.get(sp, sp) for sp in raw_choices
260
- ]
261
 
262
 
263
  # ---------------------------------------------------------------------------
@@ -294,9 +297,9 @@ def register_file(fname):
294
  st.session_state.results.setdefault(fname, [])
295
  st.session_state.summaries.setdefault(fname, {})
296
  st.session_state.unusedSpeakers.setdefault(fname, [])
297
- st.session_state.categorySelect.setdefault(
298
- fname, [[] for _ in st.session_state.categories]
299
- )
300
  st.session_state.speakerRenames.setdefault(fname, {})
301
  st.session_state.speakerClips.setdefault(fname, {})
302
  if fname not in st.session_state.file_names:
@@ -437,7 +440,12 @@ def analyze(inFileName):
437
 
438
  currAnnotation, currTotalTime = st.session_state.results[inFileName]
439
  speakerNames = currAnnotation.labels()
440
- categorySelections = st.session_state.categorySelect[inFileName]
 
 
 
 
 
441
  printV("Loaded results", 4)
442
 
443
  noVoice, oneVoice, multiVoice = su.calcSpeakingTypes(currAnnotation, currTotalTime)
 
43
  "speakerRenames": {}, # {filename: {speaker: name}}
44
  "summaries": {}, # {filename: {df2, df3, ...}}
45
  "categories": ["Instructor", "Students"],
46
+ "categorySelect": [[], []], # [[token, ...], ...] one list per category, tokens = "fname: SPEAKER_##"; starts with 2 lists for Instructor/Students
47
  "removeCategory": None,
48
  "resetResult": False,
49
  "unusedSpeakers": {}, # {filename: [speaker, ...]}
 
90
  # ---------------------------------------------------------------------------
91
 
92
  def addCategory():
93
+ new = st.session_state.categoryInput.strip()
94
+ if not new:
95
+ return
96
  st.toast(f"Adding {new}")
 
97
  st.session_state.categories.append(new)
98
+ st.session_state.categorySelect.append([])
99
+ st.session_state.pop(f"multiselect_{new}", None)
100
  st.session_state.categoryInput = ""
 
 
101
 
102
 
103
  def removeCategory(index):
104
  name = st.session_state.categories[index]
105
  st.toast(f"Removing {name}")
106
+ st.session_state.pop(f"multiselect_{name}", None)
 
107
  del st.session_state.categories[index]
108
+ del st.session_state.categorySelect[index]
 
109
 
110
 
111
+ def updateCategoryOptions():
112
+ """Store tokens ('fname: SPEAKER_##') in the global categorySelect lists."""
113
  if st.session_state.resetResult:
114
  return
115
+ # Rebuild unusedSpeakers for every analyzed file based on current token assignments
 
 
 
 
116
  for i, category in enumerate(st.session_state.categories):
117
+ st.session_state.categorySelect[i] = list(
118
+ st.session_state[f"multiselect_{category}"]
119
+ )
120
+ # Recompute unusedSpeakers for all files
121
+ all_assigned_tokens = {
122
+ token
123
+ for tokens in st.session_state.categorySelect
124
+ for token in tokens
125
+ }
126
+ for fname, result in st.session_state.results.items():
127
+ if len(result) != 2:
128
+ continue
129
+ annotation, _ = result
130
+ unused = [
131
+ sp for sp in annotation.labels()
132
+ if f"{fname}: {sp}" not in all_assigned_tokens
133
+ ]
134
+ st.session_state.unusedSpeakers[fname] = unused
135
 
136
 
137
  # ---------------------------------------------------------------------------
 
259
  st.session_state[f"rename_{fileName}_{sp}"] = saved
260
  raw_to_display[sp] = saved if saved else sp
261
  for i, category in enumerate(st.session_state.categories):
262
+ # categorySelect[i] holds cross-file tokens; widget key just keeps them as-is
263
+ st.session_state.pop(f"multiselect_{category}", None)
 
 
264
 
265
 
266
  # ---------------------------------------------------------------------------
 
297
  st.session_state.results.setdefault(fname, [])
298
  st.session_state.summaries.setdefault(fname, {})
299
  st.session_state.unusedSpeakers.setdefault(fname, [])
300
+ # Ensure categorySelect has one list per category (global, not per-file)
301
+ while len(st.session_state.categorySelect) < len(st.session_state.categories):
302
+ st.session_state.categorySelect.append([])
303
  st.session_state.speakerRenames.setdefault(fname, {})
304
  st.session_state.speakerClips.setdefault(fname, {})
305
  if fname not in st.session_state.file_names:
 
440
 
441
  currAnnotation, currTotalTime = st.session_state.results[inFileName]
442
  speakerNames = currAnnotation.labels()
443
+ # categorySelect is global tokens ("fname: SPEAKER_##"); extract raw IDs for this file
444
+ prefix = inFileName + ": "
445
+ categorySelections = [
446
+ [token[len(prefix):] for token in tokens if token.startswith(prefix)]
447
+ for tokens in st.session_state.categorySelect
448
+ ]
449
  printV("Loaded results", 4)
450
 
451
  noVoice, oneVoice, multiVoice = su.calcSpeakingTypes(currAnnotation, currTotalTime)