infinite scroll

This commit is contained in:
Gabriel Radureau
2025-10-13 15:05:54 +02:00
parent cc9fb9cede
commit 0fa5a30809
10 changed files with 274 additions and 263 deletions

View File

@@ -1,45 +1,38 @@
# controllers.py
import streamlit as st
import db
def label_widget(video_name, preselected=None):
"""Widget multiselect labels avec création dynamique et réactivité."""
def label_widget(video, preselected=None):
"""Widget multiselect pour labels, avec création dynamique."""
preselected = preselected or []
key_multiselect = f"labels_{video.id}"
key_input = f"new_label_{video.id}"
key_multiselect = f"labels_{video_name}"
key_input = f"new_label_{video_name}"
# --- Charger labels depuis DB ---
labels = db.load_labels()
# --- Initialisation session_state ---
if key_multiselect not in st.session_state:
st.session_state[key_multiselect] = preselected
# --- Si "Autre…" dans sélection, afficher input ---
current_selected = st.session_state[key_multiselect]
# Si "Autre…" dans sélection, afficher input
if "Autre…" in current_selected:
new_label = st.text_input("Entrer un label personnalisé", value="", key=key_input)
if new_label.strip():
# Ajouter le nouveau label à la DB
db.create_labels([new_label.strip()])
# Mettre à jour options avant de créer le multiselect
labels = db.load_labels()
# Remplacer "Autre…" par le nouveau label dans selection
current_selected = [l for l in current_selected if l != "Autre…"] + [new_label.strip()]
# MAINTENANT c'est sûr de passer current_selected comme default
st.session_state[key_multiselect] = current_selected
# --- Multiselect ---
selected = st.multiselect(
"Labels",
options=labels + ["Autre…"],
default=st.session_state[key_multiselect],
key=key_multiselect
key=key_multiselect,
)
# --- Sauvegarde ---
if st.button("💾 Sauvegarder labels", key=f"save_{video_name}"):
db.save_video_labels(video_name, selected)
st.success(f"{len(selected)} label(s) enregistré(s) pour {video_name}")
if st.button("💾 Sauvegarder labels", key=f"save_{video.id}"):
video.save_labels(selected)
st.success(f"{len(selected)} label(s) enregistré(s) pour {video.mp4_file_name}")
return selected