Files
Forge-Engine/screens/widgets/registry.py
T
williamandwilliam 3f4ebc4527
Build and deploy / build-and-push (push) Successful in 17s
Build and deploy / deploy (push) Successful in 10s
first commit
2026-08-21 16:23:49 +02:00

262 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from .controls.c_text import c_text
from .controls.c_textarea import c_textarea
from .controls.c_url import c_url
from .controls.c_color import c_color
from .controls.c_slider import c_slider
from .controls.c_checkbox import c_checkbox
from .controls.c_toggle_token import c_toggle_token
from .controls.c_align import c_align
from .controls.c_select import c_select
from .control_groups.text_style_controls_extra import TEXT_STYLE_CONTROLS_EXTRA
from ..flow.constants import CONDITION_OPERATORS
WIDGETS = {
"texte": {
"label": "Texte", "icon": "📝", "tag": "p", "has_content": True,
"w": 40, "h": 10, "default_content": "Texte du paragraphe.",
"controls": [
c_textarea("content", "Texte", "content", default="Texte du paragraphe.", group="Contenu"),
c_slider("font-size", "Taille du texte", "style:font-size", min=10, max=64, default=16, group="Texte"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
c_align("text-align", "Alignement", "style:text-align", group="Texte"),
c_checkbox("bold", "Gras", "style:font-weight", "bold", "normal", group="Texte"),
c_checkbox("italic", "Italique", "style:font-style", "italic", "normal", group="Texte"),
c_toggle_token("underline", "Souligné", "style:text-decoration", "underline", group="Texte"),
c_toggle_token("strikethrough", "Barré", "style:text-decoration", "line-through", group="Texte"),
] + TEXT_STYLE_CONTROLS_EXTRA,
},
"titre": {
"label": "Titre", "icon": "🔠", "tag": None, "has_content": True,
"w": 55, "h": 10, "default_content": "Titre",
"controls": [
c_textarea("content", "Texte", "content", default="Titre", group="Contenu"),
c_select("niveau", "Importance du titre", "attr:_niveau",
[("1", "Très grand — titre principal"), ("2", "Grand"), ("3", "Moyen")], default="2", group="Contenu"),
c_slider("font-size", "Taille du texte", "style:font-size", min=14, max=80, default=32, group="Texte"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
c_align("text-align", "Alignement", "style:text-align", default="left", group="Texte"),
c_checkbox("italic", "Italique", "style:font-style", "italic", "normal", group="Texte"),
c_toggle_token("underline", "Souligné", "style:text-decoration", "underline", group="Texte"),
] + TEXT_STYLE_CONTROLS_EXTRA,
},
"bouton": {
"label": "Bouton", "icon": "🔘", "tag": "button", "has_content": True,
"w": 30, "h": 8, "default_content": "Valider",
"controls": [
c_text("content", "Texte du bouton", "content", default="Valider", group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#ffffff", group="Texte"),
c_color("background", "Couleur de fond", "style:background-color", "#5b8cff", group="Texte"),
c_slider("font-size", "Taille du texte", "style:font-size", min=10, max=40, default=15, group="Texte"),
c_slider("border-radius", "Arrondi des coins", "style:border-radius", min=0, max=40, default=8, group="Texte"),
c_checkbox("submit", "Valide un formulaire", "attr:type", "submit", "button", group="Contenu"),
] + TEXT_STYLE_CONTROLS_EXTRA,
},
"lien": {
"label": "Lien", "icon": "🔗", "tag": "a", "has_content": True,
"w": 25, "h": 6, "default_content": "Cliquez ici",
"controls": [
c_text("content", "Texte du lien", "content", default="Cliquez ici", group="Contenu"),
c_url("href", "Destination", "attr:href", default="#", group="Contenu"),
c_checkbox("new_tab", "Ouvrir dans un nouvel onglet", "attr:target", "_blank", "", group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#5b8cff", group="Texte"),
c_toggle_token("underline", "Souligné", "style:text-decoration", "underline", group="Texte"),
] + TEXT_STYLE_CONTROLS_EXTRA,
},
"image": {
"label": "Image", "icon": "🖼️", "tag": "img", "has_content": False, "self_closing": True,
"w": 35, "h": 22, "default_content": "",
"controls": [
c_url("src", "Source de l'image", "attr:src", allow_upload=True, upload_accept="image/*", group="Contenu"),
c_text("alt", "Texte alternatif", "attr:alt", placeholder="décrit l'image pour l'accessibilité", group="Contenu"),
c_select("object-fit", "Ajustement dans son cadre", "style:object-fit",
[("cover", "Remplir en recadrant"), ("contain", "Tout montrer sans déformer"), ("fill", "Étirer pour remplir tout le cadre")],
default="cover", group="Média"),
c_slider("border-radius", "Arrondi des coins", "style:border-radius", min=0, max=60, default=0, group="Média"),
],
},
"video": {
"label": "Vidéo", "icon": "🎬", "tag": "video", "has_content": False,
"w": 40, "h": 25, "default_content": "",
"controls": [
c_url("src", "Source de la vidéo", "attr:src", allow_upload=True, upload_accept="video/*", group="Contenu"),
c_checkbox("controls", "Afficher les contrôles de lecture", "attr:controls", "controls", "", default=True, group="Contenu"),
c_checkbox("autoplay", "Lecture automatique", "attr:autoplay", "autoplay", "", group="Contenu"),
c_checkbox("loop", "Lecture en boucle", "attr:loop", "loop", "", group="Contenu"),
],
},
"champ_texte": {
"label": "Champ — texte", "icon": "⌨️", "tag": "input", "has_content": False, "self_closing": True,
"w": 40, "h": 8, "default_content": "", "fixed_attrs": {"type": "text"},
"controls": [
c_text("placeholder", "Texte indicatif", "attr:placeholder", placeholder="ex. Votre réponse", group="Contenu"),
c_text("name", "Nom du champ", "attr:name", placeholder="ex. reponse1", group="Contenu"),
c_checkbox("required", "Obligatoire", "attr:required", "required", "", group="Contenu"),
],
},
"champ_email": {
"label": "Champ — email", "icon": "📧", "tag": "input", "has_content": False, "self_closing": True,
"w": 40, "h": 8, "default_content": "", "fixed_attrs": {"type": "email"},
"controls": [
c_text("placeholder", "Texte indicatif", "attr:placeholder", placeholder="ex. votre@email.com", default="votre@email.com", group="Contenu"),
c_text("name", "Nom du champ", "attr:name", placeholder="ex. email", group="Contenu"),
c_checkbox("required", "Obligatoire", "attr:required", "required", "", group="Contenu"),
],
},
"champ_mot_de_passe": {
"label": "Champ — mot de passe", "icon": "🔒", "tag": "input", "has_content": False, "self_closing": True,
"w": 40, "h": 8, "default_content": "", "fixed_attrs": {"type": "password"},
"controls": [
c_text("placeholder", "Texte indicatif", "attr:placeholder", placeholder="ex. Mot de passe", group="Contenu"),
c_text("name", "Nom du champ", "attr:name", placeholder="ex. mot_de_passe", group="Contenu"),
c_checkbox("required", "Obligatoire", "attr:required", "required", "", group="Contenu"),
],
},
"case_a_cocher": {
"label": "Case à cocher", "icon": "☑️", "tag": "input", "has_content": True, "special_render": "checkbox_label",
"w": 35, "h": 8, "default_content": "Option",
"controls": [
c_text("content", "Texte affiché", "content", default="Option", group="Contenu"),
c_text("name", "Nom du champ", "attr:name", placeholder="ex. accepte_cgu", group="Contenu"),
c_text("value", "Valeur envoyée", "attr:value", placeholder="ex. oui", group="Contenu"),
c_checkbox("checked", "Coché par défaut", "attr:checked", "checked", "", group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
],
},
"bouton_radio": {
"label": "Bouton radio", "icon": "🔘", "tag": "input", "has_content": True, "special_render": "checkbox_label",
"w": 35, "h": 8, "default_content": "Option",
"controls": [
c_text("content", "Texte affiché", "content", default="Option", group="Contenu"),
c_text("name", "Nom du groupe", "attr:name", placeholder="ex. choix1", group="Contenu"),
c_text("value", "Valeur envoyée", "attr:value", placeholder="ex. optionA", group="Contenu"),
c_checkbox("checked", "Sélectionné par défaut", "attr:checked", "checked", "", group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
],
},
"zone_texte": {
"label": "Zone de texte", "icon": "🗒️", "tag": "textarea", "has_content": False,
"w": 40, "h": 18, "default_content": "",
"controls": [
c_text("placeholder", "Texte indicatif", "attr:placeholder", placeholder="ex. Votre message", group="Contenu"),
c_text("name", "Nom du champ", "attr:name", placeholder="ex. message", group="Contenu"),
c_checkbox("required", "Obligatoire", "attr:required", "required", "", group="Contenu"),
],
},
"liste_deroulante": {
"label": "Liste déroulante", "icon": "🔽", "tag": "select", "has_content": True, "special_render": "select_options",
"w": 35, "h": 8, "default_content": "Option 1\nOption 2\nOption 3",
"controls": [
c_textarea("content", "Options — une par ligne", "content", default="Option 1\nOption 2\nOption 3", group="Contenu"),
c_text("name", "Nom du champ", "attr:name", placeholder="ex. choix", group="Contenu"),
c_checkbox("required", "Obligatoire", "attr:required", "required", "", group="Contenu"),
],
},
"groupe_champs": {
"label": "Groupe de champs", "icon": "🗃️", "tag": "fieldset", "has_content": True, "special_render": "fieldset_legend",
"w": 55, "h": 30, "default_content": "Groupe de champs",
"controls": [
c_text("content", "Titre du groupe", "content", default="Groupe de champs", group="Contenu"),
],
},
"liste": {
"label": "Liste à puces", "icon": "📋", "tag": "ul", "has_content": True,
"w": 40, "h": 22, "default_content": "Premier élément\nDeuxième élément\nTroisième élément",
"controls": [
c_textarea("content", "Éléments de la liste — un par ligne", "content",
default="Premier élément\nDeuxième élément\nTroisième élément", group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
c_slider("font-size", "Taille du texte", "style:font-size", min=10, max=40, default=16, group="Texte"),
],
},
"liste_numerotee": {
"label": "Liste numérotée", "icon": "🔢", "tag": "ol", "has_content": True,
"w": 40, "h": 22, "default_content": "Premier élément\nDeuxième élément\nTroisième élément",
"controls": [
c_textarea("content", "Éléments de la liste — un par ligne", "content",
default="Premier élément\nDeuxième élément\nTroisième élément", group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
c_slider("font-size", "Taille du texte", "style:font-size", min=10, max=40, default=16, group="Texte"),
],
},
"tableau": {
"label": "Tableau", "icon": "🗂️", "tag": "table", "has_content": True, "special_render": "table",
"w": 55, "h": 25, "default_content": "Colonne 1;Colonne 2\nValeur A;Valeur B",
"controls": [
c_textarea("content", "Contenu — une ligne par rangée, colonnes séparées par ;", "content",
default="Colonne 1;Colonne 2\nValeur A;Valeur B", group="Contenu"),
c_checkbox("header_row", "Première ligne = en-tête", "attr:_header_row", "1", "", default=True, group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
],
},
"conteneur": {
"label": "Conteneur / décor", "icon": "⬛", "tag": "div", "has_content": True,
"w": 50, "h": 30, "default_content": "",
"controls": [
c_text("content", "Texte", "content", group="Contenu"),
c_color("background", "Couleur de fond", "style:background-color", "#1f2430", group="Texte"),
c_slider("border-radius", "Arrondi des coins", "style:border-radius", min=0, max=60, default=10, group="Texte"),
c_slider("opacity", "Opacité", "style:opacity", unit="", min=0, max=1, step=0.05, default=1, group="Texte"),
],
},
"separateur": {
"label": "Séparateur", "icon": "➖", "tag": "hr", "has_content": False, "self_closing": True,
"w": 50, "h": 2, "default_content": "",
"controls": [
c_color("color", "Couleur", "style:border-color", "#2b3140", group="Texte"),
],
},
"repeteur_donnees": {
"label": "Répéteur de données", "icon": "🔁", "tag": "div", "has_content": True, "special_render": "repeater",
"w": 55, "h": 35, "default_content": "{{nom}}",
"controls": [
c_select("definition_id", "Objet de données à afficher", "attr:_definition_id",
[("", "Sélectionner un objet")], default="", group="Contenu"),
c_select("template_type_id", "Modèle de ligne — élément de jeu", "attr:_template_type_id",
[("", "Aucun — utiliser le modèle de texte ci-dessous")], default="", group="Contenu"),
c_textarea("content", "Modèle d'affichage texte — utilise {{nom_du_champ}}", "content", default="{{nom}}", group="Contenu"),
c_color("color", "Couleur du texte", "style:color", "#e8eaf0", group="Texte"),
c_slider("font-size", "Taille du texte", "style:font-size", min=10, max=40, default=16, group="Texte"),
c_text("filtre_champ", "Filtrer : n'afficher que les lignes où ce champ",
"attr:_filtre_champ", placeholder="ex. niveau", default="", group="Filtre"),
c_select("filtre_operateur", "...est", "attr:_filtre_operateur", CONDITION_OPERATORS, default="egal", group="Filtre"),
c_text("filtre_valeur", "...cette valeur, ou {{NomObjet.champ}} pour comparer à une donnée qui change en cours de partie",
"attr:_filtre_valeur", placeholder="ex. 3 ou {{Partie.niveau_courant}}", default="", group="Filtre"),
],
},
"jauge": {
"label": "Jauge — liée à une donnée", "icon": "📊", "tag": "div", "has_content": False, "special_render": "jauge",
"w": 60, "h": 12, "default_content": "",
"controls": [
# La clé "definition_id" est reconnue spécifiquement dans
# controls_with_values.py pour être peuplée avec les VRAIS
# objets de données du jeu — même mécanisme que le Répéteur.
c_select("definition_id", "Objet de données à suivre", "attr:_definition_id",
[("", "Sélectionner un objet")], default="", group="Donnée"),
c_text("champ", "Champ numérique à afficher",
"attr:_champ", placeholder="ex. reputation", default="", group="Donnée"),
c_text("min", "Valeur mini", "attr:_min", default="0", group="Donnée"),
c_text("max", "Valeur maxi", "attr:_max", default="100", group="Donnée"),
c_color("couleur_basse", "Couleur côté mini", "attr:_couleur_basse", "#e05252", group="Apparence"),
c_color("couleur_haute", "Couleur côté maxi", "attr:_couleur_haute", "#4caf50", group="Apparence"),
c_checkbox("afficher_valeur", "Afficher la valeur en chiffres sur la jauge", "attr:_afficher_valeur", "1", "", default=False, group="Apparence"),
],
},
"superposition": {
# 3.4 (Confort) — overlay/modale réutilisable : couvre TOUJOURS tout
# l'écran (position:fixed, indépendant de x/y/width/height — voir
# render_overlay.py), avec un voile semi-transparent + une boîte
# centrée qui contient les éléments posés à l'intérieur. Fermeture
# manuelle uniquement : réutilise l'action existante "Modifier un
# élément → Visibilité" (masquer/rendre visible), comme n'importe
# quel autre élément — pas de mécanisme de fermeture au clic externe.
"label": "Superposition / boîte de dialogue", "icon": "🪟", "tag": "div", "has_content": True,
"special_render": "overlay",
"w": 50, "h": 40, "default_content": "",
"controls": [
c_text("content", "Texte — en plus des éléments posés dans la boîte", "content", group="Contenu"),
c_color("couleur_boite", "Couleur de fond de la boîte", "attr:_couleur_boite", "#1f2430", group="Apparence"),
c_slider("arrondi", "Arrondi des coins de la boîte", "attr:_arrondi", unit="", min=0, max=40, default=12, group="Apparence"),
],
},
}