from flask import jsonify, request from werkzeug.wrappers import Response import db import screens from core.flask_app import app @app.route("/game//scene-objects//geometry", methods=["POST"]) def scene_object_geometry(slug: str, object_id: int) -> Response | tuple[Response, int]: """Mirror exact de routes/elements/element_geometry.py, mais en pixels (voir screens/scenes/update_scene_object_geometry.py) — appelé en AJAX pendant/à la fin d'un glisser-déposer sur la scène.""" # Vérifié AVANT l'update (pas seulement après) : update_scene_object_geometry # ne valide pas object_id elle-même (simple UPDATE ... WHERE id = ?, sans # effet silencieux si la ligne n'existe plus) — un objet supprimé entre # temps (ex. course avec un autre onglet/une suppression concurrente) # aurait sinon fait planter obj["scene_id"] plus bas sur un obj devenu None. obj = screens.get_scene_object(slug, object_id) if obj is None: return jsonify({"error": "objet introuvable"}), 404 data = request.get_json(force=True) screens.update_scene_object_geometry( slug, object_id, x=float(data["x"]), y=float(data["y"]), width=float(data["width"]), height=float(data["height"]), ) # Un "fond" agrandi manuellement au-delà du champ de la caméra doit # élargir le "monde" tout de suite (voir screens.resolve_scene_world_size) # — sans ça, rien ne rafraîchissait window.SCENE_WIDTH/SCENE_HEIGHT côté # JS après un redimensionnement manuel (contrairement au tour de Ruby, # voir iaChatRefreshAfterTurn() dans static/js/ia/ia-chat.js), rendant # injoignable à la souris tout ce qui dépassait la scène nominale. screen = screens.get_screen(slug, obj["scene_id"]) screen = db.assert_not_none( screen, "obj existe (verifie plus haut) et _scene_objects.scene_id a ON DELETE CASCADE vers _screens" ) objects = screens.list_scene_objects(slug, obj["scene_id"]) world_width, world_height = screens.resolve_scene_world_size(screen, objects) return jsonify({"ok": True, "world_width": world_width, "world_height": world_height})