Vous pouvez définir vos propres variables et les réutiliser partout dans votre thème : couleurs, chemins de police, marges, morceaux de texte. C'est le moyen le plus simple de garder un thème cohérent et de le retoucher en un seul endroit.
Chaque <variable> se place dans un bloc <variables>, en dehors de tout bloc <view>. Un bloc peut contenir autant de variables que nécessaire.
<theme>
<variables>
<variable name="couleur_principale" value="4368FF" />
<variable name="police" value="./art/Exo2-Bold.otf" />
<variable name="marge" value="0.05" />
</variables>
<view name="detailed">
<text name="titre" extra="true" text="${system}" color="${couleur_principale}" fontPath="${police}" pos="${marge} ${marge}" />
</view>
</theme>
Un nom de variable commence par une lettre ou un _, puis accepte lettres, chiffres, _ et .. Le point ne peut pas être doublé (a..b est invalide) ni terminer le nom. Un nom invalide est ignoré, avec une erreur dans themes.log.
| Valide | Invalide |
|---|---|
couleur1 |
1couleur |
_interne |
ma-couleur |
menu.fond |
menu..fond |
À la fin de chaque bloc </variables>, Recalbox « résout » les valeurs : les variables utilisateur imbriquées sont remplacées, puis les variables contextuelles globales et celles du système affiché.
<variables>
<variable name="base" value="${root}/art" />
<variable name="fond" value="${base}/fond-${system.name}.png" />
</variables>
Points à connaître :
themes.log.<include> qui la définit.<variables> sont interprétés en tout premier, avant même les <include>. Les variables d'un fichier sont donc utilisables dans ce fichier et dans tous les fichiers qu'il inclut.<ERROR: RECURSIVE VARIABLE>).<variable name="fond" value="./crt.png" if="crt" />.Les variables ${game.*} ne sont pas résolues au moment de la déclaration : elles dépendent du jeu sélectionné, qui change en permanence. Une variable personnalisée qui en contient n'est donc utilisable que là où le contexte jeu existe, c'est-à-dire dans les attributs text="" et path="" des objets <text>, <scrolltext> et <image>. Ailleurs, elle ne sera jamais remplacée.
<variables>
<variable name="ligne_infos" value="${game.name} — ${game.developer} (${game.releasedate})" />
</variables>
<view name="detailed">
<text name="infos" extra="true" text="${ligne_infos}" pos="0.05 0.9" />
</view>