Corrige la boîte de dialogue posée comme élément de jeu réutilisable : conteneur vide au lieu du dialogue
Bug rapporté : poser un élément de jeu ("Mes éléments de jeu") dont le
modèle n'est qu'une "Superposition / boîte de dialogue" sur une vraie
scène affichait un conteneur vide à l'endroit du dépôt — jamais le
dialogue. La boîte de dialogue existait bien (masquée comme prévu, en
attente d'une action qui l'affiche) : c'est l'enveloppe qui l'entoure qui
n'aurait jamais dû être visible.
Cause : tout exemplaire d'élément de jeu est posé avec le widget générique
"conteneur" par défaut (add_element.py, colonne default_widget) — son
contenu réel (le modèle) est rechargé EN DIRECT à l'intérieur
(_render_element_type_children), mais l'enveloppe "conteneur" elle-même
reste une boîte NORMALE, toujours visible, avec sa propre couleur de fond/
bordure et sa position fixe sur le canevas (contrairement à une
superposition posée directement, qui, elle, démarre masquée). Résultat :
une boîte vide et permanente à l'endroit du dépôt, pendant que le vrai
dialogue (démarré masqué, correctement) reste invisible en dessous/
au-dessus tant qu'aucune action ne le déclenche.
Correctif : quand le modèle ENTIER d'un élément de jeu n'est qu'une seule
superposition (screens/element_types/is_overlay_only.py, nouveau), on
court-circuite entièrement l'enveloppe "conteneur" (render_element_html.py)
et on retire aussi le z-index de son cadre de positionnement
(element_style_filter.py, list_elements.py) — même raison que pour une
superposition posée directement (81c31a9) : sans ça, ce cadre reste un
candidat à piéger le z-index:9999 du dialogue rendu à l'intérieur dès
qu'un autre élément de la scène a un z-index plus grand.
Nouveau test, confirmé en échec sur l'ancien code (même "class=\"box\""
fantôme reproduit) puis au vert avec le correctif. 140 tests au vert au
total.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
78a373a536
commit
6e46949cf8
@@ -232,6 +232,41 @@ def test_overlay_stays_visible_in_the_editor_despite_starting_masked(client, gam
|
||||
assert wrapper_style2.rstrip().endswith("display:none;")
|
||||
|
||||
|
||||
def test_overlay_element_type_instance_has_no_visible_wrapper_box(client, game):
|
||||
"""Régression : poser un élément de jeu réutilisable ("Mes éléments de
|
||||
jeu") dont le MODÈLE n'est qu'une superposition affichait, sur la
|
||||
vraie scène, une boîte "conteneur" vide et TOUJOURS VISIBLE à
|
||||
l'endroit où l'exemplaire a été déposé — "un conteneur vide apparaît,
|
||||
pas la boîte de dialogue" (elle existe bien, masquée comme prévu ;
|
||||
c'est l'enveloppe générique "conteneur" AUTOUR, posée par défaut pour
|
||||
tout exemplaire (add_element.py), qui n'aurait jamais dû être visible
|
||||
pour un modèle qui n'est QUE ça). Corrigé en court-circuitant cette
|
||||
enveloppe dès que le modèle entier est une superposition."""
|
||||
import screens
|
||||
resp = client.post(f"/game/{game}/element-types", data={"name": "Dialogue"}, follow_redirects=False)
|
||||
assert resp.status_code == 302
|
||||
et = next(t for t in screens.list_element_types(game) if t["name"] == "Dialogue")
|
||||
template_screen_id = et["template_screen_id"]
|
||||
overlay_id = _add_element(client, game, template_screen_id, "superposition")
|
||||
client.post(f"/game/{game}/elements/{overlay_id}/children/add", data={"widget": "texte"})
|
||||
|
||||
screen_id = _create_screen(client, game, "Scène")
|
||||
resp = client.post(f"/game/{game}/screens/{screen_id}/elements/add",
|
||||
data={"widget": "__catalogue__", "element_type_id": et["id"]}, follow_redirects=False)
|
||||
assert resp.status_code == 302
|
||||
# Un frère ajouté APRÈS -> z_index plus grand, comme dans le scénario
|
||||
# rapporté (une scène avec d'autres éléments déjà en place).
|
||||
_add_element(client, game, screen_id, "bouton")
|
||||
|
||||
html = client.get(f"/game/{game}/play").data.decode()
|
||||
assert "forgeOverlayBox" in html
|
||||
assert 'class="box"' not in html # l'enveloppe "conteneur" par défaut ne doit plus apparaître
|
||||
idx = html.find('class="modal is-active"')
|
||||
wrapper_start = html.rfind('<div class="playElement"', 0, idx)
|
||||
wrapper_style = re.search(r'style="([^"]*)"', html[wrapper_start:idx]).group(1)
|
||||
assert "z-index" not in wrapper_style
|
||||
|
||||
|
||||
def test_overlay_wrapper_does_not_trap_its_own_z_index(client, game):
|
||||
"""Régression : le cadre .playElement/.canvasElement partagé par TOUS
|
||||
les widgets (voir filters/element_style_filter.py) posait quand même
|
||||
|
||||
Reference in New Issue
Block a user