Dev #4
@@ -44,6 +44,23 @@ def _render_overlay(el, meta, slug, children_map=None, ctx=None, parent_flex_dir
|
||||
"align-items:center; justify-content:center; background:rgba(0,0,0,0.6);"
|
||||
)
|
||||
style = base_overlay_style + " " + _style_string(el, parent_flex_direction=parent_flex_direction)
|
||||
if not (ctx and ctx.get("_forge_play_mode")):
|
||||
# Dans l'ÉDITEUR (ctx sans _forge_play_mode — voir list_elements.py,
|
||||
# posé uniquement en mode JOUABLE), ce widget doit rester visible
|
||||
# quel que soit son réglage de visibilité statique — "Masqué" par
|
||||
# défaut à SA création (default_style_for_widget.py), pour ne pas
|
||||
# couvrir tout l'écran dès qu'on le pose. Sans ce forçage, la boîte
|
||||
# de dialogue reste display:none dans le canevas de l'éditeur, donc
|
||||
# invisible dès sa création : impossible d'y voir/positionner son
|
||||
# contenu tant qu'on n'a pas basculé "Visibilité" sur "Visible" à la
|
||||
# main (puis pensé à la remettre sur "Masqué" avant de tester). Le
|
||||
# "display:flex;" ajouté ICI, en dernier dans la chaîne de style,
|
||||
# gagne sur le "display:none" éventuellement posé plus tôt par
|
||||
# _style_string (CSS : même propriété déclarée deux fois -> la
|
||||
# dernière l'emporte). Seul le mode JOUABLE respecte réellement ce
|
||||
# réglage (ou une action "Modifier un élément → Visibilité" qui le
|
||||
# change en cours de partie)."""
|
||||
style += " display:flex;"
|
||||
|
||||
attr_parts = [f'style="{html_lib.escape(style)}"']
|
||||
for k, v in attrs.items():
|
||||
|
||||
@@ -203,6 +203,35 @@ def test_overlay_box_default_text_color_survives_the_bulma_box_class(client, gam
|
||||
assert "color:#e8eaf0" in box_tag
|
||||
|
||||
|
||||
def test_overlay_stays_visible_in_the_editor_despite_starting_masked(client, game):
|
||||
"""Régression : une "superposition" démarre MASQUÉE par défaut à sa
|
||||
création (display:none — voir default_style_for_widget.py, pour ne
|
||||
pas couvrir tout l'écran dès qu'on la pose). Ce display:none est écrit
|
||||
tel quel dans le HTML, aussi bien en mode jouable QUE dans l'éditeur —
|
||||
sans forçage, la boîte de dialogue restait donc invisible dans le
|
||||
CANEVAS DE L'ÉDITEUR dès l'instant où elle était créée, rendant
|
||||
impossible d'y voir/positionner visuellement titres/textes/boutons
|
||||
posés à l'intérieur ("j'ai mis un texte dedans mais il ne se voit pas"
|
||||
— le texte était là, mais toute la boîte qui le contient était
|
||||
display:none). Seul le mode JOUABLE doit respecter ce réglage."""
|
||||
screen_id = _create_screen(client, game)
|
||||
overlay_id = _add_element(client, game, screen_id, "superposition")
|
||||
client.post(f"/game/{game}/elements/{overlay_id}/children/add", data={"widget": "texte"})
|
||||
|
||||
edit_html = client.get(f"/game/{game}/screens/{screen_id}/edit").data.decode()
|
||||
idx = edit_html.find(f'id="elt-{overlay_id}"')
|
||||
assert idx != -1
|
||||
wrapper_style = re.search(r'style="([^"]*)"', edit_html[edit_html.rfind("<div", 0, idx):idx]).group(1)
|
||||
# display:none PUIS display:flex (la dernière déclaration CSS gagne).
|
||||
assert wrapper_style.rstrip().endswith("display:flex;")
|
||||
|
||||
play_html = client.get(f"/game/{game}/play").data.decode()
|
||||
idx2 = play_html.find(f'id="elt-{overlay_id}"')
|
||||
wrapper_style2 = re.search(r'style="([^"]*)"', play_html[play_html.rfind("<div", 0, idx2):idx2]).group(1)
|
||||
# En mode jouable, pas de forçage : le display:none par défaut reste actif.
|
||||
assert wrapper_style2.rstrip().endswith("display:none;")
|
||||
|
||||
|
||||
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