Un exemplaire d'élément de jeu posé sur un écran reste maintenant lié à son modèle
Jusqu'ici, poser un élément de jeu depuis le catalogue ("Mes éléments de
jeu") copiait tout son arbre en base (instantiate_template_tree) : chaque
exemplaire devenait indépendant, y compris de son propre modèle - modifier
l'élément de jeu dans son éditeur n'avait plus aucun effet sur les
exemplaires déjà posés ailleurs.
Change ce comportement pour qu'un exemplaire reste TOUJOURS lié à son
modèle, sur le même principe déjà utilisé par un modèle de ligne de
Répéteur (jamais copié, rechargé en direct à chaque affichage - voir
_load_template_tree/_render_repeater) : add_element.py ne crée plus
qu'UNE SEULE ligne plate (avec sa position/taille propres à cet
exemplaire) au lieu de copier tout l'arbre, et render_element_html.py
recharge le contenu depuis l'écran-modèle à chaque rendu quand
element_type_id est réglé. Modifier l'élément de jeu dans son propre
éditeur met donc à jour tous ses exemplaires déjà posés, sur n'importe
quel écran (y compris ceux placés AVANT ce correctif, qui portaient déjà
element_type_id sur leur ligne de premier niveau), sans avoir à les
retoucher un par un.
Contrepartie assumée (discutée avec l'utilisateur avant ce changement) :
un exemplaire ne peut plus être personnalisé individuellement à
l'INTÉRIEUR (texte, couleur d'un enfant précis...) - seules sa position et
sa taille sur l'écran restent propres à chaque exemplaire. Pour changer le
contenu, il faut désormais passer par l'éditeur de l'élément de jeu
lui-même.
instantiate_template_tree.py, devenu inutilisé, est supprimé.
Ajoute tests/test_element_type_live_instances.py (mise à jour d'un
exemplaire déjà posé, propagation jusqu'à "Jouer", position toujours
indépendante par exemplaire) et met à jour un commentaire de test devenu
obsolète dans test_screens_and_elements.py.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
79fe04c6ac
commit
e9a991ed13
@@ -6,7 +6,6 @@ from ..widgets.registry import WIDGETS
|
||||
from ..widgets.widget_meta import widget_meta
|
||||
from ..widgets.default_style_for_widget import default_style_and_attributes
|
||||
from ..element_types.list_element_types import list_element_types
|
||||
from ..element_types.instantiate_template_tree import instantiate_template_tree
|
||||
|
||||
|
||||
def add_element(slug, screen_id, widget_key, element_type_id=None, parent_id=None):
|
||||
@@ -16,30 +15,24 @@ def add_element(slug, screen_id, widget_key, element_type_id=None, parent_id=Non
|
||||
alors plus (il suit le flux du parent), mais on garde des valeurs par
|
||||
défaut pour rester cohérent si jamais il en sort un jour.
|
||||
|
||||
element_type_id : si fourni ET que cet élément de jeu a un écran-modèle
|
||||
(le cas normal désormais — voir create_element_type), tout son arbre est
|
||||
COPIÉ en profondeur ici plutôt que de créer un seul élément plat : c'est
|
||||
ce qui permet à un élément de jeu d'être un mini-conteneur réutilisable
|
||||
avec plusieurs éléments imbriqués à l'intérieur, pas juste un widget
|
||||
unique avec un contenu par défaut."""
|
||||
element_type_id : si fourni, un SEUL élément est créé ici (ligne plate,
|
||||
comme n'importe quel widget), qui garde juste une référence vers cet
|
||||
élément de jeu — son contenu (l'arbre de son écran-modèle) n'est PAS
|
||||
copié en base : il est rechargé EN DIRECT à chaque affichage (voir
|
||||
render_element_html.py), exactement comme un modèle de ligne de
|
||||
Répéteur (voir _load_template_tree/_render_repeater). Modifier
|
||||
l'élément de jeu dans son propre éditeur met donc à jour tous ses
|
||||
exemplaires déjà posés, sur n'importe quel écran, sans avoir à les
|
||||
retoucher un par un — au prix de ne plus pouvoir personnaliser
|
||||
individuellement le CONTENU d'un exemplaire précis (sa position/taille
|
||||
sur l'écran, elles, restent propres à chaque exemplaire, comme
|
||||
d'habitude)."""
|
||||
widget_key = widget_key if widget_key in WIDGETS else "conteneur"
|
||||
if element_type_id:
|
||||
types = {t["id"]: t for t in list_element_types(slug)}
|
||||
et = types.get(int(element_type_id))
|
||||
if et and et.get("template_screen_id"):
|
||||
created = instantiate_template_tree(slug, et["template_screen_id"], screen_id, parent_id)
|
||||
if created:
|
||||
conn = db.connect(slug)
|
||||
conn.execute(
|
||||
"UPDATE _screen_elements SET element_type_id = ? WHERE id = ?", (et["id"], created[0])
|
||||
)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return created[0]
|
||||
# Modèle vide (aucun élément dedans pour l'instant) : on retombe
|
||||
# sur l'ancien comportement plat ci-dessous, pour ne jamais
|
||||
# échouer silencieusement à poser quelque chose.
|
||||
|
||||
widget_key = widget_key if widget_key in WIDGETS else "conteneur"
|
||||
if et:
|
||||
widget_key = et.get("default_widget") or widget_key
|
||||
meta = widget_meta(widget_key)
|
||||
# Réglages dont la valeur par défaut a un effet visuel voulu dès la
|
||||
# création (ex: une image démarre avec "cover" pour se recadrer
|
||||
|
||||
Reference in New Issue
Block a user