from flask import render_template import db import screens from core.flask_app import app @app.route("/game/") def game_dashboard(slug): """Vue d'ensemble du jeu : tout ce qui a été créé (écrans, objets, éléments de jeu réutilisables, variables), en un coup d'œil, avec un accès direct à chaque élément — la barre de navigation du jeu (voir base.html) permet déjà de sauter directement vers chaque éditeur, cette page sert donc de résumé/point d'entrée plutôt que de répéter les mêmes liens. Onboarding guidé (voir db/games/game_type_catalog.py) : un compte "restreint" (quiz/embranchement/rpg) voit ici une version SIMPLIFIÉE — juste ses écrans, en cartes avec un aperçu de leur contenu, plus un bouton "+ Ajouter un écran" qui ne demande PAS de type (imposé par le projet : "jeu_2d" pour un RPG, "document" pour les autres — voir routes/screens/screens_new.py). Objets/éléments de jeu réutilisables/ variables restent réservés à "Créer mon jeu de A à Z", la seule formule pensée pour la puissance complète du moteur.""" game = db.game_meta(slug) if db.is_restricted(slug): return _render_simple_dashboard(slug, game) return _render_full_dashboard(slug, game) def _render_simple_dashboard(slug, game): screen_list = screens.list_screens(slug) previews = {} for s in screen_list: if s["kind"] == "jeu_2d": objects = screens.list_scene_objects(slug, s["id"]) for o in objects: o["rendered_html"] = screens.render_scene_object(o) previews[s["id"]] = {"kind": "jeu_2d", "objects": objects} else: previews[s["id"]] = { "kind": "document", "elements": screens.list_elements(slug, s["id"]), } return render_template( "game_dashboard_simple.html", game=game, screen_list=screen_list, previews=previews, ) def _render_full_dashboard(slug, game): definitions = db.list_definitions(slug) # Détail complet (avec ses champs) de chaque objet, pour le panneau # d'édition déplaçable (voir game_dashboard.html) ouvert par le crayon # ✏️ de l'onglet Objets — un panneau par objet, pré-rendu ici et # simplement montré/masqué en JS, plutôt qu'un aller-retour serveur à # l'ouverture (voir openObjectEditPanel()). definitions_full = {d["id"]: db.get_definition(slug, d["id"]) for d in definitions} # Pour l'onglet "Données" de ce même panneau (remplace data_list.html/ # object_view.py, retirés) : les lignes déjà enregistrées de chaque # objet, les libellés lisibles de ses champs relation (pour l'affichage # du tableau) et les options possibles de ces mêmes champs relation # (pour le formulaire "Ajouter une entrée"). rows_by_definition = {} relation_labels_by_definition = {} relation_options_by_definition = {} referenced_by_definition = {} for d in definitions: full = definitions_full[d["id"]] rows_by_definition[d["id"]] = db.list_rows(slug, full) relation_labels = {} relation_options = {} for f in full["fields"]: if f["type"] == "relation": options = db.relation_options(slug, f["relation_definition_id"]) relation_labels[f["id"]] = {opt["id"]: opt["label"] for opt in options} relation_options[f["id"]] = options relation_labels_by_definition[d["id"]] = relation_labels relation_options_by_definition[d["id"]] = relation_options referenced_by_definition[d["id"]] = db.definitions_referencing(slug, d["id"]) screen_list = screens.list_screens(slug) element_types = screens.list_element_types(slug) element_type_usage = {t["id"]: screens.element_type_usage_count(slug, t["id"]) for t in element_types} variables = db.list_global_variables(slug) return render_template( "game_dashboard.html", game=game, definitions=definitions, definitions_full=definitions_full, rows_by_definition=rows_by_definition, relation_labels_by_definition=relation_labels_by_definition, relation_options_by_definition=relation_options_by_definition, referenced_by_definition=referenced_by_definition, screen_list=screen_list, element_types=element_types, element_type_usage=element_type_usage, variables=variables, variable_types=db.GLOBAL_VARIABLE_TYPES, field_types=db.FIELD_TYPES, )