Data Studio — La surface de création
Le Data Studio est une seule fenêtre pour tout : consultation, recherche, édition des cellules, création de lignes/colonnes/onglets, création et suppression de feuilles, et un canevas d'enregistrements qui montre de quoi un enregistrement est fait.
Une règle sous-tend tout cela : la feuille est canonique. Le Studio écrit dans la source (fichier local / feuille Google), jamais dans les SO, et confirme chaque changement par un réimport automatique.
Tools ▸ SheetForge ▸ Data Studio l'ouvre — l'unique entrée de création dans le menu. Il ne nécessite aucun plugin : tout ce qui suit fonctionne avec les seuls types intégrés du Core, et un plugin ajoute par-dessus des formes et des espaces de clé en lecture seule (voir Avec et sans plugins).
Il n'existe plus qu'une seule fenêtre de création. L'ancien Espace de travail — la fenêtre IMGUI d'origine — a été retiré, et tout ce qu'il savait faire, le Studio le fait. Voir ce qu'est devenu l'Espace de travail si vous effectuez une mise à niveau.
Ce qui est à l'écran
Barre supérieure
- La puce de la source active nomme le fournisseur. Elle est atténuée quand aucun paramètre n'est actif.
- ↓ Pull from source lance l'import.
- ↑ Push to source porte une pastille comptant les changements en attente.
- Un bouton Discard juste à côté jette tout changement préparé dans la fenêtre. Il demande d'abord une confirmation nommant le nombre, et il atterrit comme une seule étape
Ctrl+Z, si bien que la préparation revient si vous annulez par erreur. La source n'est jamais touchée. - Les badges
isolated/draft. - Les compteurs ⛔/⚠. Cliquer sur un compteur saute à la première erreur/au premier avertissement.
- Un menu débordant ⋯ portant Lancer l'export, Push vers Google Sheet, Exporter les traductions…, Importer les traductions…, Vérification de l'état, Ouvrir le rapport de localisation et Paramètres du thème…. En dehors d'une source Google API, la ligne de push Google reste visible mais désactivée, avec la raison attachée au libellé ; les deux lignes de traduction se comportent de la même façon lorsque le projet ne contient aucune feuille de localisation.
Barre latérale
- Une entrée All se trouve en haut — la recherche multi-feuille, décrite ci-dessous.
- Puis chaque feuille avec son nombre de lignes, son point de couleur, et un marqueur ● sur toute feuille portant des changements préparés. La pastille de la barre supérieure donne le total ; ceci indique de quelles feuilles il provient.
- Les feuilles sont regroupées en sections par le libellé de groupe
@stylepropre à la feuille. Clic droit sur une feuille ▸ Group & color ✎ pour les définir ; les feuilles sans libellé restent dans la section par défaut. - Sous les feuilles se trouve un groupe READ-ONLY listant les registres de code enregistrés par plugin.
- Des badges honnêtes vivent ici aussi :
parse failedsur un onglet absent de l'aperçu,name clashquand un registre de code revendique le nom d'une feuille réelle, et l'avis de quarantaine décrit ci-dessous. - Chaque élément de clic droit actuellement bloqué reste visible avec sa raison attachée.
Table
- Un en-tête collant à quatre lignes : la lettre de colonne de la feuille source au-dessus des cellules brutes
@name/@type/@desc. La colonne A porte les marqueurs, donc les données commencent en B. - Une gouttière avec le numéro de ligne réel de la feuille, et une puce de référence par ligne :
shared Nquand deux enregistrements ou plus pointent vers cette ligne,↩ 1quand exactement un le fait, rien quand aucun. - La lettre et le numéro de ligne sont les mêmes coordonnées que celles imprimées par le rapport d'erreur, si bien que « ligne 5, colonne C » peut être désigné directement. Cliquer dessus les sélectionne — la colonne ou la ligne — pour les actions multi-cibles et les déplacements par glisser — voir Sélectionner des lignes et des colonnes ci-dessous.
- La lettre appartient à la place, pas à la colonne. Déplacez une colonne et elle affiche la lettre de la position qu'elle occupera une fois répercutée. La même règle donne à une colonne que vous avez ajoutée mais pas encore poussée la lettre qu'elle est sur le point de recevoir.
- L'édition de structure vit dans les menus de clic droit. Un en-tête de colonne propose propriétés, déplacer, insérer de part et d'autre et supprimer ; la gouttière de numéro de ligne propose monter, descendre et supprimer. Un élément bloqué reste visible avec sa raison.
- Un en-tête de colonne propose aussi Figer jusqu'à cette colonne, qui maintient cette colonne et tout ce qui est à sa gauche hors du défilement horizontal (voir ci-dessous).
- Le reste du menu de colonne — largeur de colonne, ajuster à la donnée, masquer, filtre, effacer les données de la colonne et les éléments de tri — est décrit plus bas sous Largeur de colonne, masquage et filtres par colonne. Une poignée de redimensionnement se trouve au bord droit de chaque cellule de lettre.
- À l'intérieur d'une cellule de référence, seuls les fragments de liste cassés sont mis en évidence.
Canevas
- S'ouvre sous la table quand vous activez une ligne.
- L'enregistrement que vous avez ouvert se trouve au milieu : ce qu'il consomme afflue depuis la gauche, ce qui le consomme se tient à droite. Un contrôle segmenté au-dessus du canevas choisit jusqu'où aller de chaque côté.
- Faites glisser la poignée pour redimensionner,
Escle referme. - Chaque carte de nœud affiche ses ports de référence et ses colonnes ordinaires comme des lignes de valeur éditables, si bien que le canevas est un second endroit où éditer, pas une image (voir Éditer sur le canevas ci-dessous).
Inspecteur de nœud
En bas à droite du canevas. Il porte :
- l'adresse de cellule du nœud (cliquez pour amener le focus sur cette cellule dans la grille) ;
- une note « enregistrement partagé » / « cette clé n'existe pas » / « cet enregistrement est nouveau » ;
- la liste Used by (cliquez sur une entrée pour vous y rendre) ;
- l'action intégrée Go to this sheet ;
- Duplicate and split / Cancel new row là où elles s'appliquent.
Problems
Le panneau du bas porte les mêmes diagnostics que produit un import, rendus par le même moteur de rapport. Le pipeline est la source de vérité ; la fenêtre n'invente jamais de message. Cliquer sur une ligne amène le focus sur la cellule fautive et ouvre son canevas.
Panneaux de domaine
Un panneau à droite avec un segment par panneau enregistré par plugin, repliable, se souvenant duquel était ouvert. Il n'est dessiné que lorsqu'un plugin enregistre un panneau — sans aucun enregistré, il n'y a pas de boîte vide, car une boîte vide prétend qu'il manque quelque chose.
Fenêtre modale de Push
Le diff avant écriture : onglet · clé de ligne · champ · ancien → nouveau pour chaque changement préparé, plus une note quand certaines modifications sont isolées. Une section Addressables liste chaque enregistrement d'asset que la répercussion va effectuer (ajout · déplacement · création de groupe — voir Éditer une cellule). Cancel n'écrit rien.
Éditer une cellule
- Le widget suit le
@type. Le@typequ'il lit est celui affiché à l'écran, si bien qu'une colonne que vous avez ajoutée ou retypée mais pas encore poussée reçoit déjà le widget de ce type.- Un
boolobligatoire est une bascule ; unbooloptionnel ouvre le même sélecteur qu'utilise la cellule d'enum, car il a trois états. Enum<T>s'affiche comme sa valeur plus un ▾ et ouvre le même sélecteur cherchable qu'utilise une cellule de référence. Une valeur non reconnue reste en haut de la liste plutôt que d'être réécrite silencieusement. Quand l'enum est défini dans une feuille, le sélecteur se termine par « Add a new member… ». Une cellule optionnelle vide affiche —, ou — (valeur par défaut).- Une colonne
RecordId@Tabreçoit une liste déroulante de référence (ci-dessous). - Une colonne
AssetRef@Groupreçoit un sélecteur d'asset et accepte les dépôts (ci-dessous). - Les colonnes
Color/AnimationCurve/Gradientreçoivent les propres champs de couleur, de courbe et de dégradé d'Unity (ci-dessous). - Tout le reste — nombres, chaînes, clés,
List<>de non-références, wrappers, types personnalisés — est du texte brut canonique, car c'est ce texte que le parseur fait l'aller-retour.
- Un
- Les cellules de référence ont toujours une liste déroulante. Une cellule
RecordId@Tabest une zone de texte plus un bouton ▾ ; taper une clé à la main fonctionne toujours. Le bouton est là même quand la feuille cible n'offre actuellement aucun candidat : cet état signifie généralement que quelque chose est cassé en ce moment même, ce qui est exactement le moment où vous avez besoin de l'outil, et le sélecteur le dit et propose de créer au lieu d'ouvrir une liste vide.- Une cellule
List<RecordId@Tab>reçoit+▾. Le sélecteur reste ouvert et chaque ligne est une case à cocher, si bien que cocher trois enregistrements ne prend qu'une seule visite. Cocher ajoute, décocher retire cet élément, et chaque coche est sa propre étape d'annulation. - L'ordre des éléments n'est pas ce à quoi répond une liste déroulante. Réorganisez les éléments depuis le canevas, où chaque élément de liste a sa propre ligne ▲▼.
- Une cellule scalaire remplace sa valeur et se ferme, avec la clé déjà présente dans la cellule marquée pour que vous ne puissiez pas la choisir deux fois.
- Une cellule
- Une colonne optionnelle peut être remise à vide. Là où la colonne déclare
?ou=default, les sélecteurs — de référence, d'enum et de booléen optionnel, tous pareillement — portent une ligne leave-empty libellée avec la valeur de repli de la cellule. Une colonne obligatoire n'a pas une telle ligne, car une cellule vide y est une erreur. - Créez l'enregistrement qui vous manque, depuis la cellule. Si la clé que vous voulez n'existe pas, appuyez sur + Create a new … record dans le sélecteur : la zone de recherche se transforme en zone de clé pré-remplie avec le préfixe commun de la feuille. Tapez un nom, appuyez sur Entrée, et la ligne est créée et écrite dans cette cellule comme une seule étape
Ctrl+Z.- La ligne n'est pas proposée quand cela ne pourrait pas fonctionner. Un espace de clé possédé par du code ne peut pas recevoir d'ajout, et le sélecteur le dit dans une phrase. Une source en lecture seule, un pipeline en cours d'exécution ou une feuille d'origine xlsx la bloque avec la même barrière qu'utilise le canevas.
- Les cellules d'asset ont un sélecteur et acceptent les dépôts. Une cellule
AssetRef@Groupest une zone de texte plus un bouton ⊙, dans l'esprit du champ d'objet d'Unity. Quelle que soit la façon dont un asset arrive, les règles sont les mêmes.- ⊙ ouvre le sélecteur d'asset de SheetForge : les adresses déjà présentes dans ce groupe — restreintes au
<Type>de la colonne quand elle en a un, les sous-assets listés après leur parent commeparent[sub]— avec une recherche et la valeur actuelle marquée. Une ligne ⊙ Parcourir le projet…, sous la liste, ouvre le propre sélecteur d'objet d'Unity filtré sur ce type. - Vous pouvez aussi glisser des assets depuis la fenêtre Project sur la cellule : un asset pour une colonne scalaire, n'importe quel nombre pour un
List<>(ajoutés dans l'ordre ; une clé déjà présente dans la cellule est ignorée). - Un asset déjà enregistré dans ce groupe conserve son adresse. Un asset qui n'est pas encore adressable est préparé pour l'enregistrement : la cellule reçoit son adresse aussitôt — le nom de fichier sans extension — et l'entrée de groupe, ainsi que le groupe lui-même quand il n'existe pas encore, sont créés quand vous répercutez, après que l'écriture de la feuille a réussi. Rien ne change dans le projet avant cela, et abandonner la préparation ne change rien du tout.
- Un asset enregistré dans un autre groupe demande d'abord — une boîte de dialogue nommant les deux groupes et combien d'autres cellules le référencent via l'ancien — puis prépare un déplacement.
- Refusé, avec un toast qui en dit la raison : les objets de scène, les dossiers, plusieurs assets déposés sur une cellule scalaire, un asset qui ne satisfait pas le type de la colonne, et une adresse déjà utilisée par un autre asset dans ce groupe.
- Les enregistrements préparés apparaissent dans la fenêtre modale de Push sous Addressables et comptent dans la pastille de la barre supérieure.
Ctrl+Zretire ensemble la valeur de la cellule et l'enregistrement ; retaper la cellule de sorte que plus rien ne référence l'adresse abandonne l'enregistrement dans la même étape, si bien qu'un enregistrement périmé ne survit jamais tout seul. - Chaque cellule d'asset porte aussi en permanence un bouton ↗ sur sa droite : appuyez dessus et la fenêtre Project localise et sélectionne cet asset — une cellule de liste sélectionne tous les assets qu'elle contient et localise le premier, et une adresse
parent[sub]localise le sous-objet lui-même. Ctrl+clic (Cmd+clic sur macOS) sur la cellule fait la même chose, tandis qu'un simple clic continue d'éditer le texte. Quand l'adresse ne se résout pas vers un asset, le bouton reste visible mais désactivé, avec la raison en infobulle. - Clic droit sur une cellule pour Localiser dans le projet — couvrant aussi les cellules de liste — et, sur une colonne optionnelle, Effacer (valeur par défaut). Les lignes de valeur du canevas portent le même bouton de localisation, car ce sont les mêmes widgets.
- Problems signale
UnknownAssetKeyetAssetTypeMismatchavant que vous ne répercutiez, et un enregistrement préparé n'est pas une erreur — la projection le compte déjà. Sans le package Addressables, le bouton ⊙ et le dépôt sont désactivés avec la raison en infobulle ; taper une adresse fonctionne toujours.
- ⊙ ouvre le sélecteur d'asset de SheetForge : les adresses déjà présentes dans ce groupe — restreintes au
- Les cellules d'asset montrent l'asset lui-même. Quand l'adresse d'une cellule
AssetRefse résout, une petite vignette apparaît à côté du texte — tout type d'asset dont l'éditeur peut afficher un aperçu, dimensionnée pour que la hauteur de ligne ne change jamais ; une celluleList<>montre celle de son premier élément.- Cliquer sur la vignette ouvre une vue agrandie flottante ; sur le canevas d'enregistrement, les assets image sont dessinés en grand sur la carte.
- Une adresse qui ne se résout pas n'affiche simplement aucune vignette — le bouton de localisation ↗ porte déjà la raison.
- Les cellules
AssetRef<AudioClip>se lisent. Un bouton de lecture à côté de l'adresse du clip le joue via le propre canal d'aperçu de l'éditeur ; appuyer à nouveau l'arrête, tout comme passer à autre chose — changer de cellule, fermer la fenêtre, un rechargement de domaine.- Quand la version de l'éditeur ne peut pas fournir la fonction d'aperçu, le bouton reste visible mais désactivé, avec la raison en infobulle. Sur une cellule dont l'asset n'est pas un clip audio, il n'y a simplement pas de bouton.
- Les cellules de couleur, de courbe et de dégradé sont les champs natifs. Une cellule scalaire
Color,AnimationCurveouGradientest le champ de couleur, le champ de courbe ou le champ de dégradé d'Unity — la cellule entière, aucun texte brut.- Chaque changement valide le texte canonique (voir Syntaxe des feuilles). Une rafale de changements — glisser dans le sélecteur de couleur, une session dans l'éditeur de courbe — fusionne en une seule étape d'annulation, la même règle que suit la frappe.
- Sur une colonne optionnelle, une cellule vide affiche —. Cliquez dessus pour ouvrir le champ à la valeur par défaut du type, et clic droit ▸ Effacer (valeur par défaut) pour la vider à nouveau.
List<Color>,List<AnimationCurve>etList<Gradient>sont des éditeurs à puces : une puce par élément (un échantillon de couleur, une vignette de courbe, une barre de dégradé) et une puce+. Cliquer ouvre une popup avec un champ natif par élément plus ▲▼ et ✕ ; ajouter, retirer, réordonner et chaque édition d'élément sont chacun leur propre étape d'annulation, car l'ordre d'une liste est une donnée. Les listes d'autres types restent du texte canonique.- Les lignes de valeur du canevas utilisent exactement les mêmes widgets.
- Restreindre une colonne d'asset à un type depuis le formulaire de colonne. Dans le formulaire de propriétés de colonne — et dans les formulaires d'ajout de colonne et de création de feuille — un bouton Type… se tient toujours à côté du champ
@type; il est activé tant que la notation en cours de saisie est unAssetRef@Group, et reste désactivé sinon, avec une infobulle expliquant pourquoi. Il liste les types d'asset que le projet peut charger (cherchable, nom court avec le nom complet en sous-titre) et réécrit le champ enAssetRef@Group<Type>, en laissantList<>,?et=defaultintacts ; Aucune restriction (tout asset) retire le<…>. Taper la restriction à la main fonctionne aussi. L'infobulle de l'en-tête de colonne montre le nom de type complet résolu. - Ce que vous tapez est ce que vous voyez, immédiatement. Le texte de la grille est la baseline plus votre préparation, donc il n'attend jamais la validation. Une valeur validée affiche sa couleur de préparation dès l'instant où elle est validée — que ce soit une valeur choisie dans un menu déroulant, une modification de valeur visuelle, ou une frappe rapide, même quand la cellule a encore le focus. L'aperçu plus lourd (Problems, compteurs, puces, canevas) se recalcule une fois par rafale d'édition plutôt qu'une fois par frappe — sauf après un geste ponctuel sur le canevas, qui se redessine sur-le-champ.
- Aucune validation en ligne pendant la saisie — les diagnostics proviennent d'un seul canal (le validateur de la validation préalable et de l'import), affichés dans Problems.
- + Row ajoute un enregistrement avec un id suggéré (détection de préfixe commun, sans collision) ; chaque changement préparé — modifications de cellule, modifications de clé, ajouts de ligne, tout annuler — est une étape Ctrl+Z / Ctrl+Y, et fermer la fenêtre avec des changements préparés invite à enregistrer/annuler/annuler la fermeture.
- ↑ Push to source exécute le dispatcher partagé : validation préalable → écriture en retour par source → réimport automatique. Les renommages de clé demandent toujours « N références seront mises à jour — continuer ? », et un push Google affiche toujours l'approbation du plan avant que quoi que ce soit ne soit envoyé.
- Barrières honnêtes :
- une source en lecture seule (Google ExportUrl) désactive l'édition et le push avec une raison au survol ;
- un onglet d'origine xlsx est en lecture seule avec un badge (l'écriture en retour saute les xlsx) ;
- pendant qu'un import/export/push est en cours, pull et push sont désactivés.
Sélectionner des lignes et des colonnes — et les faire glisser
Les coordonnées de la grille sont des poignées, comme dans un tableur.
- Cliquez sur un numéro de ligne pour sélectionner la ligne ; cliquez sur une lettre de colonne pour sélectionner la colonne.
- Ctrl+clic ajoute d'autres éléments à la sélection ; Shift+clic prend la portée depuis le dernier clic.
- L'en-tête et le corps mettent en surbrillance tout ce qui est sélectionné, et la cellule où se trouve le clavier dessine un contour de sélection qui suit les déplacements aux flèches.
- Changer de feuille annule la sélection — les mêmes numéros pointeraient vers d'autres colonnes là-bas — et les menus portent un élément Effacer la sélection.
- Faites glisser une sélection pour la déplacer. Attrapez un numéro de ligne (ou une lettre de colonne) sélectionné et faites-le glisser : une ligne d'insertion suit où le dépôt atterrirait, et le déposer déplace la sélection là comme une seule étape
Ctrl+Z.- Une sélection non adjacente — les lignes 2, 5 et 9, disons — arrive regroupée au point de dépôt dans l'ordre où vous les avez sélectionnées.
- Pendant qu'un tri, une recherche ou un filtre fige l'ordre visible, les déplacements de ligne restent refusés pour la même raison que les éléments de menu se désactivent — et démarrer le glissement le dit dès l'instant où il commencerait, plutôt que de simplement ne pas bouger en silence.
- Les menus de clic droit agissent sur toute la sélection. Avec plusieurs colonnes sélectionnées, Largeur de colonne…, Ajuster la largeur de la colonne, Masquer la colonne, les déplacements ◀▶, supprimer et Effacer les données de la colonne… s'appliquent à chaque colonne sélectionnée ; avec plusieurs lignes, les déplacements et la suppression les couvrent toutes — chaque lot comme une seule étape d'annulation.
- Les éléments qui n'ont de sens que pour une seule cible à la fois — propriétés, filtre, tri, figer, insérer — se tiennent à part dans leur propre section à cible unique.
- Un élément bloqué reste visible avec sa raison, comme partout ailleurs.
La sélection est un geste propre à l'affichage : rien à son sujet n'est préparé ni écrit tant qu'une action ne s'en sert pas.
Les menus eux-mêmes sont désormais un seul composant. Chaque menu contextuel et déroulant du Studio — en-têtes de colonne, gouttières de ligne, le ⋯ de la barre d'outils, la barre latérale, les nœuds et fils du canevas, les menus de cellule — a la même forme : des sections titrées, des coches, une navigation au clavier, et des éléments désactivés qui restent en place avec leur raison. C'est la même forme que les menus de l'application web, si bien que rien n'est à réapprendre entre les deux.
Éditer sur le canevas
Le canevas édite le même tampon de préparation que la table. Tout ce qui suit est un changement préparé ordinaire : il apparaît dans la fenêtre modale de Push, c'est une seule étape Ctrl+Z, et il est réécrit par la même chaîne de validation préalable et de réimport.
Ce qui est dessiné
Tout s'écoule dans un seul sens : les matériaux à gauche, ce qui les utilise à droite, avec l'enregistrement que vous avez ouvert au milieu.
Un contrôle segmenté au-dessus du canevas choisit jusqu'où aller de chaque côté :
- matériaux → ceci → utilisé par — un pas chacun ;
- matériaux seulement — deux pas, pour suivre une chaîne d'assemblage ;
- utilisé par seulement.
Une feuille sans colonne de référence propre n'a rien à sa gauche, elle n'offre donc que ce dernier choix. La limite de pas existe pour qu'un matériau largement utilisé ne déverse pas tout le projet à l'écran. Pour voir plus loin, double-cliquez sur un voisin pour en faire le nouveau terminus.
- Le même enregistrement atteint deux fois reste un seul nœud.
- Un enregistrement qui n'existe pas est dessiné quand même, marqué comme cassé, car un lien que vous ne pouvez pas voir est un lien que vous ne pouvez pas corriger.
- Un cycle n'est pas caché non plus : l'arête qui le referme repart le long d'une voie sous les cartes, en pointillé, afin que vous puissiez suivre où elle retourne.
La disposition est déterministe : les mêmes données produisent toujours la même image. Les positions des nœuds peuvent être glissées pour la session, et ce glissement n'est volontairement pas sauvegardé.
Ce qui se trouve sur un nœud
L'en-tête porte la clé, un sous-titre (sa feuille, ou le nom lisible par un humain qu'un plugin a fourni), l'adresse de cellule, et un badge comptant qui d'autre pointe vers cet enregistrement.
En dessous, les ports de référence sont toujours visibles. Un port est l'endroit où un fil se branche, donc en cacher un ferait mentir l'image. Chacun affiche un point plein ou vide, ce qu'il accepte, et combien sont liés. Un port de liste montre ses éléments dans l'ordre, chacun avec des contrôles de déplacement et de suppression, car l'ordre d'une liste est une donnée.
Les colonnes ordinaires se replient dans un groupe « n valeurs », ouvert sur le terminus et fermé ailleurs. Chaque ligne est une ligne de valeur dans laquelle vous pouvez taper — le même widget que celui utilisé par la grille, validé par la même barrière. Les points de port sont teintés de la couleur de la feuille qu'ils acceptent, si bien qu'une chaîne se lit comme une seule couleur.
Une carte montre la même projection que la table. Une colonne préparée dans ce lot — pas encore répercutée, types obligatoires et de référence inclus — se tient déjà sur la carte, marquée comme en attente de la même façon que l'en-tête de la table la marque, infobulle comprise : une colonne de référence préparée apparaît comme un port, une colonne ordinaire préparée comme une ligne de valeur, un renommage préparé affiche le nouveau nom par-dessus la valeur d'origine, et une suppression préparée retire aussi la ligne de la carte. Ajouter une colonne obligatoire à une feuille déjà peuplée ne vide pas les cartes pendant que les cellules vides sont encore en cours de remplissage — le canevas continue de montrer la feuille telle qu'elle sera après la répercussion, exactement comme le fait la grille.
Sur l'épaule droite se trouve un unique point de sortie. Ce que cet enregistrement exporte, c'est lui-même, il n'y en a donc qu'un, et le faire glisser pose la question opposée (« où est-ce que j'utilise ceci ? ») à celle que pose le glissement d'un port (« vers quoi cela pointe-t-il ? »).
Ce point n'est dessiné que lorsqu'une feuille du projet possède réellement une colonne qui accepte cette feuille — un point qui ne mène nulle part est une affordance vouée à l'échec. Le test porte sur le schéma, pas sur les données : une colonne qui déclare RecordId@ThisSheet garde le point vivant même avant que quiconque ait écrit une seule ligne.
Gestes et menus
Le point est la poignée. Appuyer sur un point de port démarre le geste, et appuyer ailleurs sur la ligne ne le fait pas, si bien que rien n'est saisi par accident. Appuyer et relâcher sans bouger reste un clic.
- L'en-tête d'une carte est sa propre poignée :
- cliquez dessus pour sélectionner la carte, ce qui la fait aussi passer au-dessus de toute carte qui la chevauche ;
- faites-la glisser pour déplacer la carte pour cette session ;
- double-cliquez dessus pour faire de cet enregistrement le nouveau terminus.
- Clic droit sur canevas vide → New record. Un sélecteur en cascade s'ouvre : le panneau de gauche liste les feuilles vers lesquelles pointent les ports actuellement dessinés, le panneau de droite porte la recherche, la création et la liste des enregistrements, et une troisième page demande quel port reçoit l'enregistrement quand plusieurs le pourraient.
- Un plugin peut restreindre ou élargir cette liste de feuilles. Une feuille qu'il a déclarée mais qu'aucun port à l'écran n'accepte reste listée avec sa raison attachée plutôt que de disparaître.
- Il n'y a pas de « nouvel enregistrement » hors contexte ici — chaque enregistrement né sur le canevas naît lié. Une ligne autonome, c'est à cela que sert le + Row de la table.
- Cliquez sur un point de port vide, ou clic droit sur un nœud → Connect, pour lier cette colonne. Le sélecteur s'ouvre au niveau du curseur et c'est la même liste de clés cherchable qu'utilise la grille.
- Deux lignes d'en-tête indiquent ce que le slot accepte et dans quelle cellule le choix sera écrit.
- Chaque ligne porte la clé, son nom affiché et combien d'endroits pointent déjà vers elle, et les clés déjà liées ici sont marquées plutôt que dupliquées silencieusement.
- Si l'enregistrement que vous voulez n'existe pas encore, la zone de recherche devient une zone de clé pré-remplie avec le préfixe commun de la feuille. Tapez un nom, appuyez sur Entrée, et il est créé et lié en un seul geste qu'un seul
Ctrl+Zannule. Un nom vide ou déjà pris le signale (et indique où) au lieu de créer quoi que ce soit.
- Un enregistrement que vous créez sur le canevas devient le canevas. La vue s'y redirige de la même façon qu'un double-clic sur une carte, si bien que le nouvel enregistrement se retrouve au milieu avec le lien que vous venez de créer à ses côtés. (La duplication est l'exception — l'intérêt d'une duplication est que ce terminus garde sa propre copie, donc la vue reste où elle est.)
- Faites glisser depuis un point de port vide et le fil suit le curseur : déposez-le sur une carte pour lier, sur un canevas vide pour y ouvrir le sélecteur.
- Faire glisser depuis le point de sortie fonctionne dans l'autre sens. Relâchez sur une carte et le canevas trouve laquelle de ses colonnes peut accueillir cet enregistrement (un seul candidat lie directement, plusieurs demandent lequel). Déposer sur un canevas vide ouvre la cascade miroir des feuilles qui pourraient l'accueillir, y compris des feuilles absentes de l'écran.
- Pendant qu'un glissement est actif, tout ce qui n'est pas concerné s'atténue et les ports qui pourraient l'accepter s'illuminent, si bien que les cibles légales sont visibles plutôt que devinées.
- Chaque geste terminé répond par un court toast nommant la cellule qu'il a écrite — et, quand cela compte, que le lien a refermé un cycle ou que l'enregistrement est désormais partagé avec quelqu'un d'autre.
- Décrochez un lien déjà branché. Faire glisser un port de référence unique rempli décroche ce fil précis, exactement comme débrancher un câble d'une prise. Déposez-le sur une autre carte pour le réorienter, sur un autre port pour déplacer le lien entre deux cellules (toujours une seule étape d'annulation, et aucune des deux cellules n'est écrite à moins que les deux plans ne tiennent), ou remettez-le où il était — ou appuyez sur
Esc— pour ne rien changer.- Le déposer sur un canevas vide ouvre le sélecteur de cette cellule au niveau du curseur, avec disconnect proposé comme une ligne à l'intérieur plutôt que fait sur-le-champ : une main qui a glissé ne doit pas effacer un lien.
- Cliquer sur un tel point sans bouger sélectionne ce fil à la place, si bien que les deux gestes ne se coûtent jamais rien l'un à l'autre.
- Un port scalaire rempli reste une cible valide pour le glissement de quelqu'un d'autre — le déposer dessus signifie remplacer.
- Les ports de liste n'ont pas de fil unique à décrocher, ils démarrent donc toujours un nouveau lien. Retirer ou réordonner un élément, c'est à cela que sert la propre ligne ✕ / ▲▼ de l'élément.
- Le corps d'un fil sert à choisir, pas à glisser. Cliquez n'importe où le long d'un fil — la bande cliquable suit chaque segment de son tracé — pour le sélectionner et ouvrir l'inspecteur de fil ;
Deleteou clic droit ▸ Disconnect le délie. Le réorienter est le geste de port ci-dessus, il n'y a donc exactement qu'une seule façon de faire chaque chose. - Clic droit sur un nœud → Delete this record. Une seule boîte de dialogue nomme tout ce qui disparaît : combien de connexions pointent vers l'enregistrement, et combien de modifications préparées sur cette ligne seront abandonnées.
- Dupliquez un enregistrement partagé. Quand un enregistrement est utilisé à plusieurs endroits, l'inspecteur de nœud propose Duplicate and split : il clone chaque colonne vers une nouvelle clé (suggérée à partir du préfixe de la feuille), et ne réoriente que les liens de ce canevas vers la copie. Une seule étape d'annulation, et l'enregistrement que tous les autres utilisent reste intact.
- L'inspecteur de fil s'ouvre avec le fil sélectionné. Il applique le principe une ligne est un jeton : la cellule dans laquelle le lien est écrit, et le texte entier de cette cellule découpé en ses jetons avec une marque sur celui que représente cette ligne.
- Quand le plugin qui a ouvert l'arête le décrit, une ligne édite la partie du jeton qui n'est pas la clé (le
add:10deattack:add:10). Éditer cette ligne ne réécrit que le reste ; changer vers quoi il pointe, c'est le réorienter, ce qui est le geste de port. - Depuis ici, vous pouvez aussi ouvrir l'enregistrement vers lequel il pointe, ou couper le lien.
- Quand le plugin qui a ouvert l'arête le décrit, une ligne édite la partie du jeton qui n'est pas la clé (le
- La touche
Deletelit la sélection, et demande ce que cette sélection signifie ici.- Avec un fil sélectionné, elle le délie.
- Avec une carte sélectionnée, cela dépend de si la carte est l'enregistrement que vous avez ouvert. Sur le terminus — la carte au milieu, l'enregistrement dont traite cet écran — elle supprime l'enregistrement, via la même boîte de dialogue de confirmation que l'élément de menu.
- Sur toute autre carte, elle coupe toutes les connexions entre cette carte et cet écran d'un coup, car depuis ici cette carte est un matériau, pas le sujet. C'est une seule étape d'annulation, avec les plans enchaînés pour qu'une colonne de liste perde tous ses éléments correspondants plutôt que tous sauf le dernier, et une connexion qu'elle n'a pas pu couper dit pourquoi plutôt que de rester silencieuse.
- (Clic droit ▸ Delete this record signifie toujours supprimer, quelle que soit la carte sur laquelle c'est fait — la touche est le raccourci dont le sens suit la sélection, la ligne de menu est la version explicite.)
- Une carte dessinée par un plugin qui n'est pas une ligne de feuille n'a rien à supprimer ou à délier, donc la touche n'y fait rien.
- Un nouvel enregistrement lié à rien n'est pas dessiné sur le canevas de quelqu'un d'autre. Une nouvelle ligne n'apparaît ici que tant qu'une connexion préparée la relie à quelque chose à l'écran — sinon, une seule ligne inachevée dans la table suivrait chaque canevas du projet partout.
- Rien n'est perdu pour autant. Créer un enregistrement depuis le canevas redirige immédiatement la vue vers lui, si bien que la ligne que vous venez de faire est ce que vous regardez. Une ligne faite dans la table reste dans la table. Et une ligne qui finit liée à rien est nommée dans la liste d'abandon de la boîte de dialogue de répercussion avant d'être abandonnée, qu'elle ait été dessinée ou non.
- Ctrl/Cmd + molette zoome le canevas entre 25 % et 200 %, en gardant fixe le point sous le curseur. Le pourcentage dans l'en-tête du canevas est un bouton qui revient d'un coup à 100 %. Une simple molette continue de faire défiler.
- Faites glisser avec le bouton central de la souris — ou Alt + bouton gauche — pour vous déplacer (pan). Le curseur change tant que vous maintenez, afin qu'il soit clair que c'est la vue qui bouge et non quelque chose dessus.
- Le glissement au bouton gauche seul continue de signifier « sélectionner et lier », c'est pourquoi le déplacement a son propre bouton. Alt + gauche est le même geste pour les souris et pavés tactiles sans bouton central.
- Le déplacement s'arrête au bord du contenu : c'est une vue à défilement, pas un plan infini, vous ne pouvez donc pas perdre le graphe dans un espace vide.
Déconnexion et refus
Disconnect indique ce qui va se passer avant que vous n'appuyiez. Effacer n'est jamais refusé, mais la ligne de menu énonce la conséquence :
- une colonne optionnelle avec une valeur par défaut retombe sur cette valeur par défaut, si bien que le fil disparaît et l'enregistrement se résout quand même à l'exécution ;
- une colonne optionnelle sans valeur par défaut devient simplement vide ;
- une colonne obligatoire devient une cellule vide que Problems signale — vous pouvez la préparer, et la validation préalable arrêtera la répercussion jusqu'à ce que vous la remplissiez ;
- une liste perd simplement cet élément.
La validation vit dans un seul canal ; le canevas n'en exécute jamais un second qui lui serait propre.
Deux choses sont refusées plutôt que simulées, et le menu indique lesquelles :
- Un fil qui ne dit pas dans quelle cellule il est écrit ne peut pas être édité. Le Core le renseigne pour les références qu'il lit lui-même ; un plugin qui ajoute un fil à la main le fournit (ou l'omet honnêtement).
- Un lien enfoui à l'intérieur d'un type personnalisé — le nom de stat à l'intérieur d'une valeur
Modifier, par exemple — n'est éditable que si le plugin qui a ouvert cette arête a aussi adoptéIAuthorableEdgeContributor. Sinon, le fil est en affichage seul.
Les clés en double, les sources en lecture seule, les onglets d'origine xlsx et un import en cours désactivent la création sur le canevas exactement comme ils désactivent celle de la table, chacun avec sa raison dans la ligne de menu.
Édition de structure
Tout ce qui suit se prépare comme une modification de cellule — visible immédiatement, annulable, confirmé par une seule écriture en retour. Les affordances vivent dans les menus de clic droit décrits ci-dessus (en-tête de colonne · gouttière de ligne · feuille de la barre latérale).
Le Studio conserve aussi des boutons permanents sur la barre d'en-tête de la feuille, à côté du nom de la feuille, afin que les plus utilisés soient trouvables sans savoir que les menus de clic droit existent — parmi eux + Row et + Column, qui ajoute une colonne à la fin. La même barre porte le ✎ de renommage de la feuille, la bascule de la ligne @overlap, et les contrôles de recherche et de tri. Faire un clic droit sur un en-tête reste le moyen de placer une nouvelle colonne à une position particulière.
- Colonnes : ajout, suppression, déplacement, et modification des propriétés sur place.
- Le formulaire de propriétés (properties ✎ sur l'en-tête) modifie le nom,
@type,@desc, et@overlapensemble. Seules les cellules de marqueur changent ; les cellules de données de la colonne sont préservées à 100 % (aucune perte de données par suppression-puis-réajout). @overlapest une case à cocher. La ligne est créée automatiquement au premier besoin, et la case est désactivée sur les colonnes clé, qui sont toujours uniques.- La saisie de
@typeest validée au fur et à mesure. La validation préalable vérifie ensuite que chaque cellule existante est compatible avec le nouveau type avant que quoi que ce soit ne soit écrit.
- Le formulaire de propriétés (properties ✎ sur l'en-tête) modifie le nom,
- Marqueurs : ajout/suppression de la ligne optionnelle
@overlap. Le libellé de groupe et la couleur@stylepropres à une feuille se préparent par le même chemin (clic droit dans la barre latérale ▸ Group & color ✎), si bien que le regroupement et la coloration sont poussés vers la feuille comme toute autre modification plutôt que conservés dans un état local à l'éditeur. - Lignes : suppression ; réorganisation avec ▲▼ (dans le Studio, « move up » / « move down » dans le menu de la gouttière).
- Réorganisation des colonnes — un nombre quelconque de déplacements, confirmés en une seule répercussion. Les colonnes en attente (nouvellement ajoutées) se réorganisent elles aussi, jusqu'à l'avant, devant les colonnes existantes.
- Les commentaires et les lignes vides sont préservés à travers toutes les modifications de structure.
WYSIWYG : la grille est un aperçu en direct de la feuille post-répercussion
Tout ce que vous préparez est immédiatement ce que vous voyez :
- Une colonne ajoutée apparaît instantanément — et vous pouvez remplir ses cellules dans le même lot (lignes existantes comme nouvelles lignes). C'est ainsi que vous ajoutez une colonne obligatoire à un onglet déjà peuplé : ajoutez-la et remplissez les valeurs en même temps ; les cellules obligatoires non remplies sont détectées par la validation préalable.
- Les colonnes/lignes supprimées disparaissent instantanément. Le résumé de préparation liste ce qui est en attente (
Deleted: column 'hp'·Added: column 'mp') — affichage uniquement. - Tout se mélange librement dans un seul lot : modifications de valeur, ajouts de ligne, ajouts/suppressions multiples de colonnes, bascules de marqueur, et réorganisations — aucune restriction du type « une opération par lot ».
- Supprimer une colonne/ligne qui possède déjà des modifications préparées (ou annuler une nouvelle colonne remplie) demande « N modifications seront perdues — continuer ? » — rien n'est abandonné silencieusement.
Renommage d'onglet et permutations A↔B — les références suivent les données
Renommage d'onglet (« Renommer l'onglet ✎ ») renomme la source et met à jour chaque référence @type à l'onglet dans toutes les feuilles (RecordId@Foo → RecordId@Bar, formes en liste et personnalisées incluses), après une boîte de dialogue de confirmation. Renommer la source signifie un renommage de fichier avec conservation de l'extension en local, et un changement de titre avec le contenu inchangé sur Google.
Les permutations mutuelles (A↔B) et les cycles sont pris en charge en un seul lot : préparer d'abord l'une ou l'autre moitié fonctionne, et les références suivent les données via une réécriture atomique de la permutation.
- Le mode local échange le contenu des fichiers en une seule passe d'écriture et nettoie les fichiers obsolètes de l'ancienne extension.
- Google ordonne les changements de titre topologiquement, en utilisant un titre temporaire pour éviter tout doublon momentané.
Le réimport prend en charge automatiquement le nettoyage : renommage de la classe générée, suppression du fichier de l'ancienne classe, et réenregistrement de la SO bake et de l'adresse Addressables.
Renommage de clé (RecordId) avec propagation des références
Modifiez une cellule de clé directement dans la grille. Lors de la répercussion, chaque cellule de chaque onglet qui référence cette clé (scalaires RecordId@ThisTab et éléments de liste) est mise à jour ensemble, après une confirmation « N références seront mises à jour — continuer ? ». Fonctionne à la fois pour les chemins local et Google. Limites :
- La propagation ne touche que les cellules de la baseline — le texte que vous venez de saisir dans le même lot n'est jamais réécrit silencieusement ; la validation préalable détecte la référence pendante à la place, afin que vous la corrigiez en connaissance de cause.
- Si la propagation devait toucher un onglet d'origine xlsx, toute la répercussion est bloquée (une répercussion partielle n'est jamais autorisée) — modifiez ce classeur directement et réimportez.
- La clé entière secondaire (
IntId) est modifiable de la même façon.
Ctrl+Z / Ctrl+Y — connecté à l'Undo natif d'Unity
Chaque modification en préparation s'intègre avec l'Undo natif d'Unity :
- modifications de cellule ;
- modifications de clé ;
- ajout/suppression/annulation de colonne ;
- ajout/suppression de ligne ;
- bascules de marqueur ;
- réorganisations ;
- modifications de propriétés ;
- renommages d'onglet ;
- liens et déliaisons sur le canevas ;
- dépôts d'asset, avec les enregistrements qu'ils préparent ;
- même « tout abandonner ».
Deux limites à connaître :
- Pendant la saisie dans un champ de texte, le champ lui-même consomme Ctrl+Z en premier (comportement standard de Windows).
- Après une répercussion réussie, l'historique de préparation est effacé — Ctrl+Z ne se déplace qu'à l'intérieur de la session pré-répercussion. Les changements déjà écrits dans la feuille s'annulent en modifiant la feuille.
Les modifications préparées survivent aux réimports
Les modifications préparées portent une adresse logique (onglet · clé de ligne · champ), pas un numéro de ligne physique, et sont résolues à nouveau juste avant la répercussion, si bien que votre préparation survit aux réimports automatiques et aux changements de baseline en arrière-plan. Si la feuille a changé de l'extérieur d'une façon qui casse la résolution — la clé de la ligne a été renommée à l'extérieur, la ligne a été supprimée, ou une clé entre désormais en conflit — cette modification est isolée : exclue de la répercussion et affichée avec un badge « isolée ». Elle n'est ni abandonnée silencieusement, ni autorisée à bloquer le reste de votre session ; vous pouvez l'abandonner individuellement après confirmation.
Validation préalable — valider, puis répercuter
L'écriture en retour valide d'abord l'intégralité de l'état projeté en mémoire — intégrité des références, unicité de @overlap, clés d'asset et types d'asset (les enregistrements préparés dans cette session comptant comme présents), plus tout validateur de domaine de plugin. Si la validation échoue, rien n'est écrit et vous recevez le rapport complet. L'écriture ne démarre qu'une fois que l'état projeté dans son intégralité a été validé avec succès ; les enregistrements Addressables préparés s'exécutent après que l'écriture de la feuille a réussi et avant le réimport automatique, et une répercussion dont le seul changement préparé est un enregistrement l'exécute quand même et réimporte (voir Sources, export et push).
Création / suppression de feuille
- Créer à partir de l'un des deux modèles intégrés, d'un modèle enregistré par un plugin, ou à partir de zéro en définissant les champs. Un clic crée le fichier local ou l'onglet Google (après un avertissement).
- Les modèles intégrés sont Exemple d'objet (types de base uniquement) et Enum definitions, qui met en page une feuille
@enum(voir ci-dessous). - Un modèle enregistré par un plugin est présent seulement quand un plugin en fournit un — par ex. les onglets de compétence du Plugin Demo.
- Les modèles intégrés sont Exemple d'objet (types de base uniquement) et Enum definitions, qui met en page une feuille
- Si vous créez dans une source autre que celle depuis laquelle vous importez actuellement, la boîte de dialogue le signale avant d'agir : le réimport automatique lirait l'ancienne source et ne verrait jamais le nouvel onglet, donc créer bascule la source d'import vers celle dans laquelle vous avez créé, et enregistre ce choix dans l'asset de paramètres.
- Supprimer nettoie tout ensemble : source, baseline, SO bake, et
.csgénéré (avertissement marqué + approbation).
Recherche multi-feuille (l'entrée All)
Le premier élément de la barre latérale est All : tapez un terme et il recherche par correspondance partielle dans les id et les valeurs de champ de toutes les feuilles, en listant feuille · clé · champ · valeur, 50 lignes par page. La zone vide, il parcourt tous les enregistrements de toutes les feuilles.
Il lit les bases de données bakées, il a donc besoin d'un premier import réussi et le dit clairement quand ce n'est pas encore le cas. Les résultats se rafraîchissent d'eux-mêmes quand un import se termine ou que les paramètres actifs changent, plutôt que d'afficher une réponse périmée.
Une ligne de résultat est une porte, pas seulement une entrée de liste. Double-cliquez dessus — ou sélectionnez-la et appuyez sur Entrée — et cette feuille s'ouvre avec la cellule correspondante sélectionnée ; un simple clic ne fait que sélectionner la ligne. Parce que les résultats proviennent des données bakées, un résultat peut nommer une feuille que la session actuelle n'a pas chargée — cette ligne ne navigue pas, et un court avis sous la liste en dit la raison plutôt que de ne rien faire.
Ouvrir une feuille dont l'import a échoué (quarantaine)
Une erreur de validation ne vous laissait auparavant rien pour la corriger : l'import échouait, donc aucune feuille n'apparaissait dans la fenêtre, et le seul moyen d'avancer était d'ouvrir la feuille de calcul elle-même. C'est désormais inversé.
Récupérer et enregistrer sont séparés de valider. Tant que la source a été lue entièrement, les feuilles sont enregistrées comme instantané de baseline même si la validation a échoué — le Studio les ouvre donc, affiche chaque erreur sur les cellules fautives, et vous laisse corriger et pousser exactement comme d'habitude.
Ce qui reste bloqué, c'est la sortie : la génération de code et le bake ne s'exécutent pas tant que le nombre d'erreurs n'est pas nul, si bien que « pas d'assemblage partiel » est préservé là où c'est sa place — à la sortie.
- Vous êtes informé, pas laissé à deviner. La console indique que les feuilles ont été enregistrées et ce qui est bloqué. La barre latérale porte un avis
⛔ N error(s) — code generation and baking are blockedqui saute à la première erreur au clic, et les badges d'erreur par feuille proviennent des diagnostics de projection que vous voyez déjà dans Problems. Une feuille qui n'a pas pu être analysée du tout le signale au lieu d'apparaître vide. - Pousser votre correction ne demande qu'une fois. Tant que la feuille est en quarantaine, l'écriture en retour affiche une confirmation supplémentaire : les erreurs existantes restent, et une nouvelle erreur que cette modification introduit est écrite aussi — la validation ne l'arrêtera pas. Tout ce qu'elle trouve est listé comme avertissement dans le rapport de cette répercussion, et le réimport automatique revalide ensuite la feuille entière. Sur une feuille saine, rien ne change : la validation préalable reste une barrière stricte.
- Les sorties restent fermées. Export et Push vers la feuille en direct sont tous deux refusés pendant la quarantaine, car les deux insèrent les dernières valeurs bakées avec succès dans les feuilles plus récentes — ce qui annulerait les valeurs que quelqu'un vient juste de corriger. Un build est arrêté par la vérification de fraîcheur pour la même raison, et la fenêtre Prise en main affiche aussi cet état.
- Le drapeau n'est effacé qu'à un seul endroit — au moment où un import va jusqu'au bout du bake. Aucune étape antérieure ne peut l'effacer, si bien qu'un échec ultérieur ne peut pas laisser derrière lui un faux « tout va bien ».
Tri et filtre (affichage seulement)
Le Studio ajoute un tri par feuille (n'importe quelle colonne, ascendant/descendant, comparaison consciente du type, persisté par projet) et un filtre de texte. Les deux ne changent que l'ordre d'affichage : la gouttière conserve les numéros de ligne réels de la feuille, et ni le tri ni le filtre ne touchent la préparation, la répercussion, le push ou l'export. Pendant qu'un tri ou un filtre est actif, les éléments de déplacement de ligne dans le menu de la gouttière se désactivent et en disent la raison, car « voisin visible » ne serait pas le vrai voisin. Les filtres de valeur par colonne et le masquage de colonnes décrits plus bas suivent la même règle.
Colonnes figées (affichage seulement)
Faites un clic droit sur un en-tête de colonne ▸ Figer jusqu'à cette colonne, et cette colonne, plus toutes les colonnes à sa gauche, se déplacent dans leur propre panneau hors du défilement horizontal — si bien que la clé reste visible pendant que vous défilez jusqu'à une colonne éloignée. Défiger les colonnes les libère. Au moins une colonne doit rester défilable, donc figer la dernière est refusé avec la raison affichée ; une table à une seule colonne n'a rien à figer.
Ce qui est figé est un nombre de colonnes depuis la gauche, pas une colonne particulière nommée — donc déplacer une colonne change lesquelles sont retenues, exactement comme se comportent les volets figés dans un tableur. Comme le tri et le filtre, c'est un réglage d'affichage, stocké par feuille dans les préférences par projet : cela n'atteint jamais la feuille, donc cela fonctionne sur les feuilles en lecture seule et d'origine xlsx et pendant qu'un import est en cours, et cela n'apparaît dans aucun push ni export.
Largeur de colonne, masquage et filtres par colonne (affichage seulement)
Chaque colonne — aussi bien sur les feuilles de données que sur les feuilles de définition d'enum — peut être dimensionnée à la main : faites glisser la poignée au bord droit de la cellule de lettre de la colonne, double-cliquez sur la poignée pour revenir à la largeur mesurée, ou utilisez Largeur de colonne… dans le menu de colonne pour un nombre exact et Ajuster la largeur de la colonne pour remesurer. Le minimum est de 24 px et il n'y a pas de maximum. Les largeurs sont enregistrées par feuille et restaurées quand la feuille ou l'éditeur reviennent, et l'ajustement automatique mesure toutes les lignes — pas seulement celles visibles — si bien qu'un filtre ne peut pas faire sauter les largeurs.
Le même menu de colonne porte le reste de l'ensemble façon tableur :
- Masquer la colonne / Afficher les colonnes masquées (n) — masquer est un réglage d'affichage : les lettres continuent de nommer les positions réelles de la feuille (A · C · D), une ligne de délimitation en gras dans l'en-tête et dans le corps marque où se trouvent les colonnes masquées, et une puce de la barre d'outils les compte. La dernière colonne visible refuse de se masquer, avec la raison indiquée. Les colonnes masquées existent toujours partout ailleurs — le canevas, la validation, Export et Push voient la feuille inchangée.
- Filtre… — une liste à cocher des valeurs de la colonne (avec une entrée (Vides) pour les cellules vides) plus une condition : contient / ne contient pas / est vide / n'est pas vide sur n'importe quelle colonne, et est égal à / n'est pas égal à / supérieur à / inférieur à / supérieur ou égal à / inférieur ou égal à sur les colonnes numériques. Si rien n'est coché, toutes les valeurs passent et la condition s'applique quand même. Un filtre se combine avec la zone de recherche, les lignes nouvellement ajoutées restent toujours visibles, la puce de la barre d'outils compte les colonnes filtrées, et Effacer le filtre en retire un.
- Effacer les données de la colonne… — après une confirmation, vide la valeur de cette colonne dans toutes les lignes (lignes filtrées et lignes nouvelles préparées incluses) comme une seule étape d'annulation. La colonne clé refuse — le nom de chaque ligne y vit ; renommez-la dans sa cellule — et une colonne obligatoire signale honnêtement des erreurs jusqu'à ce qu'elle soit remplie à nouveau. Une colonne sans rien à effacer ne prépare rien.
- Trier ascendant / descendant / (sheet order) — le tri par feuille, désormais aussi dans le menu de colonne, avec une coche sur le choix actif.
Comme le tri et les colonnes figées, tout cela est uniquement de l'affichage : des réglages d'affichage par feuille qui n'atteignent jamais la feuille, un push ni un export.
Feuilles de définition d'enum
Une feuille qui définit des enums (voir Syntaxe des feuilles) n'a pas d'enregistrement, donc le Studio lui donne sa propre grille au lieu de la table d'enregistrements. La grille montre une colonne par enum, ses membres listés dans l'ordre, avec un badge Enum definitions dans la barre latérale et un décompte du nombre d'enums qu'elle contient. Elle se lit comme toute autre feuille : des lettres de colonne en haut, de vrais numéros de ligne de la feuille dans la gouttière, les mêmes menus de clic droit dans le même ordre, et les changements préparés marqués avec les mêmes couleurs qu'utilise la table de données.
La structure de la feuille est rédigée sur place, exactement comme celle d'une feuille de données :
- Définissez un nouvel enum avec le bouton + Enum de la barre d'en-tête (le seul moyen de placer le premier enum sur une feuille de définition qui n'en a encore aucun) ou depuis le menu de clic droit d'un en-tête de colonne, à une position choisie. Le formulaire prend le nom, le type sous-jacent et la description optionnels, et les premiers membres — au moins un, car un enum sans membre ne peut pas être importé. L'ordre des membres est leurs valeurs entières.
- Renommez un enum, et chaque cellule
@typequi le référence dans toutes les feuilles est réécrite dans le même lot, si bien que le réimport après l'écriture se résout toujours. Éditez le type sous-jacent et la description sur place — les lignes de marqueur sont montrées même avant que la feuille les ait, et sont créées quand le changement atterrit. - Supprimez un enum — refusé tant qu'une feuille l'utilise encore, avec les colonnes utilisatrices nommées. Réorganisez les colonnes librement ; la position de colonne d'un enum ne porte aucune signification, donc c'est toujours sûr.
- Tout est préparé comme n'importe quelle autre modification : visible immédiatement, une étape
Ctrl+Zpar geste, écrit par une seule répercussion. Chaque décision — le nom est-il légal ou pris, un membre est-il valide, le type sous-jacent est-il autorisé, l'enum est-il encore utilisé — est prise par le même code qui valide l'import, si bien que le formulaire et le réimport ne peuvent pas se contredire. Une action bloquée reste dans son menu avec la raison au lieu de disparaître.
Les lignes de membre continuent de seulement s'ajouter et il n'y a pas de tri, car la position d'un membre est sa valeur — réorganiser les membres renumériserait des données déjà bakées dans des assets.
Les cellules montrent exactement ce que dit la feuille : un membre fixé avec la syntaxe Name=value apparaît tel quel. Les vérifications de doublon ne comparent que la partie nom, si bien que préparer Rare sur une feuille qui contient déjà Rare=10 est refusé plutôt que dédoublé.
Pour ajouter un membre, vous n'avez même pas besoin d'ouvrir la feuille. La liste déroulante d'une cellule Enum<T>, n'importe où dans le projet, porte « Add a new member… » en bas : tapez le nom et il est préparé sur la feuille d'enum comme une seule étape Ctrl+Z, marqué comme préparé jusqu'à ce que la prochaine répercussion l'écrive.
La ligne est absente — plutôt que présente et en échec — sur un enum qu'un plugin a enregistré depuis le C#, car la feuille ne le possède pas.
L'application web rédige ces feuilles de la même façon, avec les mêmes règles — voir SheetForge Web.
Aller d'une erreur de la Console à la cellule
Lorsqu'un import ou une répercussion trouve des erreurs, le rapport Console lisible par un humain ajoute un lien cliquable « Ouvrir dans Data Studio » à côté des coordonnées de chaque erreur. Cliquer dessus ouvre le Studio, bascule vers cet onglet, et met en surbrillance la cellule (une barre à gauche sur la ligne et une bordure sur la cellule). Les erreurs sans cellule spécifique (niveau fichier/onglet) se contentent de mettre le focus sur l'onglet. Le lien n'est ajouté qu'au rapport lisible par un humain ; la ligne de coordonnées lisible par une machine, dont dépendent la CI et le scraping de logs, reste inchangée.
Vérification de l'état
⋯ ▸ Vérification de l'état dans la barre d'outils du Studio exécute un diagnostic rapide sans réseau. Il affiche ✓/✗ avec une correction suggérée pour chacun des points suivants :
- les paramètres actifs ;
- l'accessibilité de la source — un dossier local qui existe, ou un id Google + un chemin de clé de compte de service ;
- une baseline d'import ;
- la fraîcheur du code généré/du bake/des addressables.
Une boîte de dialogue récapitulative indique combien de vérifications nécessitent une attention.
Paramètres d'import actifs
Lorsque le projet a plus d'un asset SheetForgeSettings, la barre d'outils affiche une liste déroulante pour choisir lequel est actif. En sélectionner un l'active immédiatement et reconstruit la vue ; les menus, les imports et la fenêtre suivent tous le choix actif. Avec un seul asset de paramètres, la liste déroulante est masquée. Le choix actif est stocké par projet et par utilisateur, si bien qu'il ne touche jamais le contrôle de version. Vous pouvez aussi le gérer depuis la fenêtre Prise en main (Tools ▸ SheetForge ▸ Prise en main) ou depuis l'inspecteur d'un asset de paramètres, qui affiche un badge « actif » ou un bouton « Définir comme actif ».
Filets de sécurité
- Détection des changements externes pour les sources locales.
- Un avertissement de fermeture lorsque des modifications préparées existent.
- Des ancres de génération de préparation qui empêchent d'agir sur une grille périmée.
- Conscience du mode : avec une source en lecture seule (Google ExportUrl), Push / la répercussion / la modification de structure / la suppression sont désactivés, avec une explication au survol de la souris.
- Barres de progression pendant l'import/l'export/le push, toujours effacées (
try/finally), localisées. - Une extension qui se comporte mal ne peut pas faire tomber la fenêtre : les surcharges de canevas, les widgets et les actions sont appelés à l'intérieur d'un try/catch, et un échec est un avertissement de console en anglais pendant que le reste de la fenêtre continue de fonctionner.
À savoir avant de renommer (non réversible après répercussion)
- Le renommage de colonne / le changement de
@typerégénère le champ généré (nom/type) — le code de jeu qui référence ce champ doit être mis à jour à la main. La boîte de dialogue de confirmation le dit explicitement ; une rupture de compilation qui en résulterait est interrompue de façon sûre par la chaîne automatique, avec une phrase exploitable. Les valeurs de la colonne sont préservées. - Le renommage d'onglet change le nom de la classe générée (
FooDatabase→BarDatabase) — même règle. - Les permutations mutuelles et les cycles suivent les mêmes règles que les renommages simples (voir la section de renommage d'onglet ci-dessus). Seul un véritable conflit — deux renommages vers le même nom — est rejeté.
- Les onglets d'origine xlsx sont exclus du renommage. Le formulaire en explique la raison et Appliquer est désactivé ; renommez la feuille dans le classeur lui-même, puis réimportez.
- Sur Google, un cas particulier subsiste : deux onglets permutés qui se référencent l'un l'autre ne sont pas repointés (le mode local est entièrement correct) — voir Capacités et limites.
- Après la répercussion, ces actions ne peuvent plus être annulées par Ctrl+Z (la feuille a été écrite).
Modification test (ajustement temporaire de SO)
L'inspecteur de SO bake possède un interrupteur « Modification test » (désactivé par défaut = lecture seule). Activez-le pour ajuster temporairement les valeurs de la SO et essayer des chiffres à l'exécution — jamais réécrit dans la feuille, disparaît au réimport suivant. Les enregistrements se retrouvent rapidement par codeName/id, dans l'éditeur comme en mode Play.
Le bouton séparé « preview my staged values on the SOs » de l'Espace de travail a disparu avec cette fenêtre. La surcouche qu'il pilotait reste une API publique pour l'outil qui en a besoin : EphemeralSoApply applique ce qu'elle peut calculer honnêtement, et refuse plutôt que de simuler les colonnes en attente et les cellules en échec de parsing. L'interrupteur ci-dessus couvre le cas courant.
Avec et sans plugins
Tout ce qui est répertorié comme Sans plugin (Core seul) fonctionne sur un projet nu. Chaque ligne Avec un plugin est ce qu'ajoute un plugin de domaine. Tout cela est mis en œuvre par le Plugin Demo fourni, si bien que vous pouvez voir chacun fonctionner avant d'écrire le vôtre (Création de plugins).
- Feuilles, cellules, lignes
- Sans plugin : table complète, édition de cellule, ajout de ligne, préparation, Ctrl+Z, push.
- Avec un plugin : inchangé.
- Pull / Push
- Sans plugin : import depuis la source active ; push via la même chaîne de validation préalable + réimport.
- Avec un plugin : inchangé.
- Problems
- Sans plugin : les quatre validations du Core (clés, références,
@overlap, clés d'asset). - Avec un plugin : plus vos règles
IDomainValidator. La démo avertit sur un cycle de réaction sans frein et sur un enregistrement orphelin.
- Sans plugin : les quatre validations du Core (clés, références,
- Ce que montre le canevas
- Sans plugin : l'enregistrement que vous avez ouvert, ce dont il est fait et ce qui l'utilise, disposé de façon déterministe.
- Avec un plugin : plus votre surcharge par onglet via
ISheetForgeGraphPlugin— des identités qui ne sont pas des enregistrements de feuille, des liens que le Core ne peut pas voir, des colonnes épinglées par un ordre de domaine (absolu ou compté depuis l'enregistrement à l'écran), et le nom lisible par un humain que porte un enregistrement. La démo fait pousser des nœuds d'événement et un bloc de code autour d'un enregistrementExampleActions, épingle les étapes de lancement d'un enregistrementExampleSkills, et transformefireballen Fireball sur la carte et dans le sélecteur.
- Arêtes dessinées
- Sans plugin : chaque référence
RecordId@Tabque voit le scanner du Core (scalaires, éléments de liste, valeurs par défaut, intérieurs de wrapper). - Avec un plugin : plus les arêtes déclarées par un
IEdgeContributor, et toute arête supplémentaire que révèle une surcharge de canevas. La démo ouvre la référence de stat enfouie dans une valeur de mini-syntaxeModifier.
- Sans plugin : chaque référence
- Éditer sur le canevas
- Sans plugin : créer, connecter, déconnecter, réorienter, dupliquer, supprimer et éditer la valeur en ligne pour chaque colonne ; de nouveaux enregistrements peuvent être créés dans les feuilles que ciblent les ports dessinés.
- Avec un plugin : plus
IAuthorableGraphShapepour décider où de nouveaux enregistrements peuvent être créés,IAuthorableEdgeContributorpour rendre éditable la propre arête d'un contributeur, etIEdgeTokenEditorpour exposer la partie de son jeton qui n'est pas la clé. Le contributeur de la démo réécrit la mini-syntaxemodifierquand vous liez ou déliez une stat, et propose sonop:valuecomme une ligne éditable dans l'inspecteur de fil.
- Widgets de cellule
- Sans plugin : les branches intégrées (bascule, sélecteur de choix, sélecteur de référence, sélecteur d'asset avec dépôt, champs de couleur / courbe / dégradé, listes à puces pour les listes de ces trois-là, texte brut).
- Avec un plugin : plus votre
IStudioCellEditorProviderpour un type de cellule nommé. Sans aucun code de widget, unStudioCellEditorHintnomme à la place l'une de sept formes intégrées (liste déroulante, multi-ligne, curseur, bascule, couleur, courbe, dégradé) pour ce type. Un widget enregistré l'emporte ; l'indice l'emporte sur le défaut du Core — y compris sur les indices intégrés de couleur / courbe / dégradé, quand un pack enregistre un indice sous le même nom de type.
- Menus et panneaux
- Sans plugin : les éléments intégrés seulement.
- Avec un plugin : plus vos enregistrements
ISheetForgeStudioPlugin— des verbes à la fin de l'inspecteur, du menu de ligne, du menu d'en-tête de colonne, du menu de nœud de canevas et du ⋯ de la barre supérieure, un panneau récapitulatif à droite, et un badge à côté d'un en-tête de colonne. La démo prépare un frein de réaction sur une ligne, remplit une colonne entière en une seule étape d'annulation, et récapitule l'assemblage d'une compétence avec une jauge de temps de lancement.
- Panneaux riches
- Sans plugin : rien.
- Avec un plugin :
IStudioPanelProviderpeint un panneau UIToolkit arbitraire. Enregistré sous le même id qu'un panneau décrit, c'est lui qui l'emporte ici, tandis que le navigateur dessine le panneau décrit.
- Barre latérale
- Sans plugin : vos feuilles seulement.
- Avec un plugin : plus des registres de code verrouillés de style
_Refs(ISheetForgeCodeRegistryPlugin) affichés comme une grille clé/libellé/raises en lecture seule ; les arêtes pointant vers ces clés ne sont pas dessinées comme cassées.
- Au-dessus du canevas
- Sans plugin : rien (le Core ne fournit aucun widget).
- Avec un plugin : votre
IStudioGraphWidget. La démo montre une bande d'étapes fixe (VALIDATE → CAST → COMMIT → DELIVER → APPLY) remplie depuis la ligne du terminus.
- Inspecteur de nœud
- Sans plugin : adresse, liste used-by, « Go to this sheet », « Duplicate and split ».
- Avec un plugin : plus vos boutons
IStudioInspectorAction. La démo préparebrakeSeconds = 0.25sur une réaction sans frein (une modification préparée normale et annulable).
- Couleurs et libellés
- Sans plugin : les préréglages intégrés plus la couleur
@stylepropre à chaque feuille. - Avec un plugin : plus votre préréglage
ISheetForgeThemePluginet vos chaînesISheetForgeStringsPlugin— enregistrées dans le Core, si bien que les libellés du même pack apparaissent aussi dans le navigateur.
- Sans plugin : les préréglages intégrés plus la couleur
Démarrer avec un projet vide
Ouvert sans aucun paramètre d'import actif, le Studio affiche un panneau « Pour commencer » à la place du tableau — des boutons intégrés pour créer un asset de paramètres, importer la démo du plugin/du cœur, ou ouvrir Prise en main. Il disparaît dès que des paramètres existent.
Plus rapide encore : glissez un dossier sur la fenêtre, ou un seul fichier .tsv/.csv/.xlsx dont le dossier parent est alors utilisé. Après une confirmation, cela crée un asset de paramètres d'import qui lit ce dossier et l'active. Si vous avez déjà des paramètres actifs, la boîte de dialogue le signale et propose d'en créer un nouveau et de basculer.
Ce qu'est devenu l'Espace de travail
La fenêtre IMGUI d'origine, l'Espace de travail, a été retirée. Elle partageait la session de création, le moteur de composition/validation et le chemin de répercussion du Studio, si bien qu'aucun comportement n'a été perdu — et les trois choses qu'elle seule offrait ont d'abord été déplacées :
| Fonctionnalité de l'Espace de travail | Où elle vit maintenant |
|---|---|
| L'onglet All — recherche multi-feuille avec pagination | L'entrée All en haut de la barre latérale du Studio (même recherche, même taille de page) |
| L'accueil par glisser-déposer | Le Studio lui-même reçoit le dépôt (ci-dessus) |
| Le panneau Google gid autofill / liste des onglets en direct | L'inspecteur de l'asset de paramètres, sous Google Sheets |
Une capacité a été abandonnée plutôt que déplacée : le bouton de l'Espace de travail pour prévisualiser les valeurs préparées sur les SO bakées. L'interrupteur Modification test de l'inspecteur de SO couvre le même besoin (voir Modification test ci-dessus).
Si vous avez du code ou des notes qui y font référence : il n'y a aucune entrée de menu à mettre à jour — elle n'en a jamais eu — et l'inspecteur de paramètres, l'inspecteur de SO bake et la galerie de modèles de Prise en main ouvrent tous le Data Studio.
Pages associées
- Syntaxe des feuilles — ce contre quoi valide le formulaire de propriétés
- Sources, export et push — ce que fait la « répercussion » selon la source
- Création de plugins — écrire les surcharges de canevas, les registres de code, les widgets et les actions que le Studio récupère
- Noyau de création — le moteur sur lequel cette fenêtre est construite
- Capacités et limites — la liste complète des limites de création