Deux bugs remontés en test manuel sur l'éditeur de scène (Phase A,
commit f0070fa) :
1. Décalage visuel à l'ajout d'un objet de scène (personnage/décor) :
render_scene_object.py positionne son <img> en absolu (left/top/
width/height en px), pensé pour être un enfant DIRECT de
.playScreen.playScene en mode jouable. Dans scene_edit.html, la même
balise est nichée dans .canvasElementInner, lui-même déjà positionné
par .canvasElement — l'image se repositionnait donc EN PLUS depuis
#canvas (son ancêtre positionné le plus proche), en double du
décalage déjà appliqué par le conteneur. Corrigé par une règle CSS
scoped à l'éditeur (.canvasElementInner > img) qui neutralise le
positionnement propre de l'image et la fait simplement remplir son
conteneur.
2. "FOREIGN KEY constraint failed" à l'ajout d'un clip de Timeline sur
un objet de scène : _animation_clips.element_id portait une VRAIE
contrainte FK vers _screen_elements depuis la création de la table.
animation-timeline.js est réutilisé TEL QUEL entre les deux éditeurs
(voir le plan "Fondations d'une plateforme multi-éditeurs") et
n'opère aucune distinction — pour un jeu jeu_2d, element_id désigne
en réalité un id de _scene_objects, absent de _screen_elements, d'où
l'échec de l'INSERT sous PRAGMA foreign_keys=ON. ensure_animation_schema
reconstruit maintenant la table (une fois, migration automatique à la
volée comme le reste du schéma) sans cette contrainte FK — même
patron que trigger_element_id/cond_element_a dans ensure_flow_schema.py.
Comme la suppression en cascade reposait jusqu'ici sur cette FK, un
nettoyage manuel des clips a été ajouté à la suppression d'un élément
(delete_element.py) et d'un objet de scène (delete_scene_object.py).
Nouveaux tests (tests/test_scene_edit_view.py, +4 cas) : ajout d'un
clip de Timeline sur un objet de scène via la route, nettoyage des
clips à la suppression d'un objet de scène et d'un élément DOM. Suite
complète : 312 tests passent (aucune régression).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
30 lines
1.3 KiB
Python
30 lines
1.3 KiB
Python
import db
|
|
|
|
from .ensure_scene_schema import ensure_scene_schema
|
|
from ..animations.ensure_animation_schema import ensure_animation_schema
|
|
from ..flow.ensure_flow_schema import ensure_flow_schema
|
|
|
|
|
|
def delete_scene_object(slug, object_id):
|
|
"""Supprime un objet de scène ET les nœuds de logique qui le
|
|
référencent (trigger_object_id/target_object_id/cond_element_a/
|
|
cond_element_b — aucun n'a de contrainte FK, voir
|
|
ensure_flow_schema.py) : un nœud qui vise un objet supprimé n'a plus
|
|
de sens, même patron que screens/elements/delete_element.py pour le
|
|
DOM. Nettoie aussi ses clips d'animation (_animation_clips.element_id,
|
|
voir ensure_animation_schema.py — réutilisé tel quel par
|
|
animation-timeline.js pour les deux éditeurs, sans contrainte FK)."""
|
|
ensure_scene_schema(slug)
|
|
ensure_flow_schema(slug)
|
|
ensure_animation_schema(slug)
|
|
conn = db.connect(slug)
|
|
conn.execute(
|
|
"""DELETE FROM _flow_nodes WHERE trigger_object_id = ? OR target_object_id = ?
|
|
OR cond_element_a = ? OR cond_element_b = ?""",
|
|
(object_id, object_id, object_id, object_id),
|
|
)
|
|
conn.execute("DELETE FROM _animation_clips WHERE element_id = ?", (object_id,))
|
|
conn.execute("DELETE FROM _scene_objects WHERE id = ?", (object_id,))
|
|
conn.commit()
|
|
conn.close()
|