Pular para o conteúdo
SheetForge

Referência da API — A Superfície Pública

Esta página lista todo tipo público nos assemblies do produto. Qualquer coisa não listada aqui é internal por design; a superfície pública é deliberadamente estreita.

  • Core (SheetForge.Core + SheetForge.Core.Tooling): 137 tipos públicos (Core: 131, Core.Tooling: 6). O Core.Tooling é a metade exclusiva do editor que hospeda serviços de import-time como relatórios e planejamento de push — nada dele é distribuído em builds de jogador.
  • Editor: 53 tipos públicos de nível superior, mais seus tipos aninhados públicos.
  • Runtime: 7 tipos, mais as saídas geradas.

Esta é exatamente a superfície contra a qual os testes de simulação de consumidor (sem InternalsVisibleTo) compilam.

Contrato de detecção (não é um tipo): um asset separado também pode detectar que o SheetForge está instalado em tempo de compilação via o símbolo de scripting define SHEETFORGE que o assembly Editor autorregistra. É um define, não um tipo público, então não aparece listado nas tabelas abaixo — veja Autoria de Plugins ▸ Detectando o SheetForge a partir de outro asset. (Diferente de SHEETFORGE_ADDRESSABLES, um version-define interno que apenas indica se o pacote Addressables está presente.)

Convenções: assinaturas são abreviadas ( = veja os documentos XML do código-fonte); "puro" significa sem UnityEngine / sem IO.


Assembly Core (SheetForge.Core) — C# puro

Sem UnityEngine, sem IO, sem rede, sem conhecimento de domínio. Imposto pelo compilador: o Core não referencia nada.

Contratos de registro de plugin (SheetForge.Core.Plugins)

TipoCategoriaPapel e membros principais
ISheetForgePlugininterfaceO contrato base de plugin de domínio. string Name · RegisterEnums(EnumRegistry) · RegisterCellParsers(CellParserRegistry)
ISheetForgeValidatorPlugininterfaceComplemento opcional para regras de validação. RegisterValidators(DomainValidatorRegistry)
ISheetForgeEdgePlugininterfaceComplemento opcional para declarações de aresta. RegisterEdgeContributors(EdgeContributorRegistry)
ISheetForgeMarkerPlugininterfaceComplemento opcional para marcadores estruturais personalizados. RegisterStructuralMarkers(MarkerRegistry)
ISheetForgeTemplatePlugininterfaceComplemento opcional para templates de "Criar planilha". RegisterTemplates(TemplateRegistry)
ISheetForgeGraphPlugininterfaceComplemento opcional que registra sobreposições de canvas do Data Studio por aba. RegisterGraphShapes(GraphShapeRegistry)
ISheetForgeCodeRegistryPlugininterfaceComplemento opcional para alvos de referência que pertencem ao código (abas virtuais travadas). RegisterCodeRegistries(CodeRegistryCatalog)
ISheetForgeThemePlugininterfaceComplemento opcional para predefinições de cor das janelas. RegisterThemes(ThemeRegistry)
ISheetForgeStudioPlugininterfaceComplemento opcional para superfícies de autoria declarativas (ações, painéis, selos de coluna, hints de editor de célula). RegisterStudioUi(StudioUiRegistry). No Core em vez do Editor, para que um único registro renderize tanto no editor UIToolkit quanto no navegador
ISheetForgeStringsPlugininterfaceComplemento opcional que registra as próprias strings de UI do pacote, por idioma. RegisterStrings(StringOverlayRegistry). Substitui o par ISheetForgeLocPlugin / PluginLocRegistry do lado do Editor, aposentado, que só conseguia alcançar o editor
ISheetForgePipelinePlugininterfaceComplemento opcional que registra observadores de pipeline. RegisterPipelineObservers(PipelineObserverRegistry)

Composição e compatibilidade (SheetForge.Core.Plugins)

A descoberta é por host — o TypeCache da Unity no editor, a varredura de assembly enviado do navegador na web. Tudo depois dela (instanciação, ordenação, isolamento e o portão de compatibilidade) é uma única função Core compartilhada, o que é o que impede os dois hosts de divergirem slot a slot.

TipoCategoriaPapel e membros principais
PluginCompositionstatic classO único caminho de assembly. Uma instância por tipo, convertida via cast para cada contrato que implementa. Os dois membros e a divisão de diagnóstico estão abaixo da tabela
PluginSetsealed classO resultado montado — doze slots: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes · Strings · StudioUi · PipelineObservers. Um novo slot alcança os dois hosts sendo adicionado aqui
SheetForgePluginCompatAttributesealed attribute (assembly)[assembly: SheetForgePluginCompat(SheetForgePluginFormat.Current, MinHostVersion = "…", PluginVersion = "…")]. int FormatVersion · string MinHostVersion (comparação numérica separada por pontos; null/vazio = sem exigência) · string PluginVersion (somente exibição, nunca comparado). Lido sem instanciar nada, e julgado por assembly — um assembly recusado perde todo registro, em vez de carregar pela metade. Ausente = geração Minimum, sem exigência de host
SheetForgePluginFormatstatic classAs constantes de geração: const int Current · const int Minimum. Só se move se o próprio formato de plugin for substituído — crescimento puramente aditivo mantém o número onde está

PluginComposition — os dois membros:

  • IReadOnlyList<Type> ContractTypes — o filtro de descoberta. A sua ordem é fixa, porque ela decide a ordem em que os diagnósticos aparecem.
  • PluginSet Compose(IReadOnlyList<Type> candidateTypes, string hostVersion, ErrorCollector errors, ICollection<string> failures, Func<string,bool> isProductKey = null) — a própria chamada de montagem.

Dois tipos de problema são mantidos separados. Conflitos de registro e recusas de compatibilidade viram diagnósticos estruturados em errors; bugs de implementação — falha de construção, um callback que lança exceção — viram linhas em inglês em failures, e passar null ali as descarta.

O predicado final isProductKey é como a regra "um plugin não pode sobrescrever uma chave do produto" da sobreposição de strings é imposta sem o Core jamais ver as tabelas de idioma: a regra vive aqui, o host fornece apenas o material. Omita o predicado e só essa regra é pulada.

Registries (SheetForge.Core.Model / .Validation / .Edges)

TipoPapel e membros principais
EnumRegistryNome do enum → tipo CLR (material para o codegen). Register<TEnum>() · Register(name, memberNames) · TryGetMembers · TryGetClrTypeName · TryGetClrAssemblyName · RegisteredEnumNames. Três membros adicionais são detalhados abaixo da tabela
CellParserRegistryNome do tipo → parser de célula (aberto-fechado). Registro duplicado lança exceção. Register(ICellValueParser) · TryGet · TryGetCustomRenderer · RegisteredTypeNames · RegisterWrapper(ICellWrapperType) · TryGetWrapper · RegisteredWrapperNames (tipos wrapper)
DomainValidatorRegistryLista de validadores somente-anexação, ordem preservada. Register(IDomainValidator) · Validators
EdgeContributorRegistryLista de contribuidores somente-anexação, ordem preservada. Register(IEdgeContributor) · Contributors
MarkerRegistryNome do marcador (sem @) → marcador estrutural personalizado. Colisão com um marcador embutido (SheetSyntax.ReservedMarkers@name/@type/@desc/@overlap/@style/@enum/@loc) / duplicata / identificador inválido lança exceção. Register(IStructuralMarkerDefinition) · TryGet · IsEmpty · RegisteredMarkerNames · AppendMarkerTokens
TemplateRegistryChave de template "Criar planilha" → template. Chave vazia/duplicada, exibição vazia, zero abas, TSV de aba vazio lançam exceção. Register(DataTemplate) · TryGet · Templates · IsEmpty

EnumRegistry — os três membros em detalhe:

  • EnumRegistry(EnumRegistry parent) — um filho que lê através de um pai e registra somente em si mesmo. O pai guarda os enums CLR registrados por plugin durante todo o domain reload, o filho guarda os definidos em planilha desta importação, então uma importação nunca modifica o cache compartilhado. Registrar um nome que o pai já possui lança uma exceção, em vez de sombreá-lo.
  • Contains(name) — primeiro o próprio, depois o pai, Ordinal.
  • SetClrTypeName(name, fullTypeName) — preenche um nome CLR depois de um registro somente-string. O nome do assembly permanece vazio porque o tipo ainda não existe.

Templates de "Criar planilha" (SheetForge.Core.Model)

TipoPapel e membros principais
DataTemplateUm template registrado por um plugin: string Key (identidade no registry) · string DisplayName (texto de propriedade do plugin) · IReadOnlyList<DataTemplateTab> Tabs (uma ou mais)
DataTemplateTabUma aba de um template: string TabName · string Tsv (um TSV normalizado completo — linhas de marcador mais dados de exemplo)

Tipos de célula personalizados (SheetForge.Core.Model)

TipoPapel e membros principais
ICellValueParserFaz o parsing de uma célula escalar. Falha = coletar em context.Errors + retornar false (nunca lançar exceção). string TypeName · bool TryParse(CellParseContext, string, out object)
ICustomCellTypeAuxiliar opcional de codegen/round-trip. Type ValueType · bool TryRender(object, out string text, out string reason)
IReferencingCellTypeCapacidade opcional que um ICellValueParser registrado também pode implementar, para que uma chave enterrada na sua própria notação ganhe o tratamento completo de RecordId@Tab — integridade + sugestões, propagação de renomeação de chave com o payload preservado, arestas e portas de grafo, o seletor , detecção de órfãos, regras de dropdown exportadas. Encontrada via cast do parser registrado (sem registro separado). bool TryGetTokenKey(elementText, out key) · string MakeToken(key) · bool TryRetargetToken(elementText, newKey, out newText) · bool TryRemoveToken(elementText, key, out newText) (resultado vazio = o elemento desaparece) · bool TryRewriteKeys(elementText, IReadOnlyDictionary<string,string> renames, out newText). Uma chamada = um elemento (a célula inteira, ou um elemento separado por ;), então um payload não pode conter ;; @target precisa nomear uma aba de planilha real (UnknownTargetTab caso contrário). Nunca lança exceção — false/null significa "não consigo interpretar", e reescritas preservam o resíduo
IRefBearingValueA metade do lado do valor do item acima, implementada pelo valor parseado: IEnumerable<string> ReferencedKeys (ordem de declaração = ordem de diagnóstico e de orçamento de sugestão; entradas null/vazias são puladas). O scanner lê isto; os hooks de texto acima reescrevem a célula. Ambos são necessários — um valor parseado não consegue restaurar a notação do autor, e o texto não pode ser validado sem ser lido
ICellWrapperTypeUma forma de valor wrapper genérica MyWrapper<T> (por exemplo, Pair<int> = 1~2) — o wrapper possui a sintaxe externa e o Core faz o parsing do tipo interno recursivamente. string Name · bool TrySplit(string, out IReadOnlyList<string> pieces, out string reason) · string JoinCanonical(IReadOnlyList<string>) · Type OpenClrType · object Assemble(IReadOnlyList<object>, Type closed) · bool TryDisassemble(object, out IReadOnlyList<object>, out string reason)
WrapperValueO IR parseado de uma célula wrapper — carrega a estratégia do wrapper + expõe os CellValues internos (para que referências internas passem pela validação, renomeação de chave/aba, e Exportação). ICellWrapperType Wrapper · IReadOnlyList<CellValue> Inner
IStructuralMarkerDefinitionUma linha @marker personalizada (valores por coluna, validados coluna por coluna — generaliza @overlap). string MarkerName (sem @) · string Description · void ValidateCell(MarkerCellContext)
MarkerCellContextUma chamada de validação de célula de marcador. string MarkerName · string RawText · string FieldName · CellCoordinate Coordinate · void Reject(string reason, string suggestion = null) (→ MarkerCellInvalid)
CellParseContextO contexto de uma chamada de parsing. TypeToken Type · CellCoordinate Coordinate · ErrorCollector Errors · EnumRegistry Enums

Constantes da gramática da planilha (SheetForge.Core.Model)

Um pacote que lê ou grava texto de célula funciona com a mesma gramática que o importador usa — dividir uma célula de lista, compor uma string @type, verificar se um nome já está em uso.

Essas constantes são a única fonte de verdade dessa gramática, então um pacote nunca reafirma um separador próprio: um caractere copiado se desalinha no dia em que a gramática mudar. As listas são entregues como somente leitura, então nada que um pacote faça pode mudar a própria gramática. A notação que elas expressam está totalmente documentada na página Sintaxe da Planilha — isso é a interface programática para ela.

TipoEspéciePapel
SheetSyntaxclasse estáticaA gramática da planilha como constantes, agrupadas abaixo

Marcadores

  • CommentPrefix (#) · MarkerPrefix (@).
  • Uma constante por linha de marcador embutido: NameMarker · TypeMarker · DescMarker · OverlapMarker · StyleMarker · EnumMarker · LocMarker.
  • RequiredMarkers — os três que toda planilha precisa ter.
  • ReservedMarkers — todo nome embutido. Consulte antes de nomear um marcador personalizado: uma colisão é recusada no registro.

Separadores

  • ListSeparator (;) — entre elementos de lista.
  • EntrySeparator (,), FieldSeparator (:), SectionSeparator (|), KeyTimeSeparator (@) — as camadas dentro de um único valor, e é por isso que ; nunca aparece no próprio texto de um valor.
  • StyleKeyValueSeparator (=) — dentro de uma célula @style.

Notação de @type

  • OptionalSuffix (?) · DefaultSeparator (=) · TargetSeparator (@, como em RecordId@Tab).
  • ListTypeName · ListOpen (List<) · ListClose (>).

Nomes de tipo

  • Uma constante por nome embutido: IntTypeName · FloatTypeName · BoolTypeName · StringTypeName · RecordIdTypeName · IntIdTypeName · AssetRefTypeName · LocRefTypeName · ColorTypeName · AnimationCurveTypeName · GradientTypeName · EnumTypeName.
  • BuiltinScalarTypes e IsBuiltinScalarTypeName(name) — respondem "esse nome já é embutido?" antes de um parser ser registrado sob ele.
  • StyleKeyNames (title, color) · LocReservedColumns (smart, comment).

Valores

  • TrueCanonical / FalseCanonical — o texto canônico de bool.
  • NumberCellStyles — o NumberStyles com o qual toda célula numérica é lida. Separadores de milhar são excluídos e a cultura é sempre invariante, então uma vírgula decimal local falha ruidosamente em vez de mudar um número silenciosamente.

Validação de domínio (SheetForge.Core.Validation)

TipoPapel e membros principais
IDomainValidatorRegra entre colunas/entre abas. Violações → ctx.Errors como DomainRuleViolation com os 4 elementos. string Name · Validate(DomainValidationContext)
DomainValidationContextTables (aba → SheetTable) · KeyIndices · AssetKeys (null = ignorado) · Errors

Costura de aresta (SheetForge.Core.Validation / .Edges)

TipoPapel e membros principais
ReferenceScanner (static)Única fonte da verdade para a enumeração de ocorrências de referência. Scan(tables) · ScanTable · ScanField · IsReferenceField(TypeToken), mais os dois predicados de referência detalhados abaixo da tabela
RefKeyKind (enum)Se uma referência corresponde ao espaço de chave em string (RecordId) ou em inteiro (IntId). Retornado por ReferenceScanner.GetReferenceKind; consumidores ramificam sobre ele. Somente-anexação
ReferenceOccurrence (struct)Uma ocorrência — Kind · FromTab · RowNumber · ColumnNumber · FieldName · TargetTab · TargetId · ToCoordinate()
ReferenceOccurrenceKind (enum)Scalar · ListElement · ExplicitDefault · WrapperElement · CustomElement (uma referência que um IRefBearingValue declarou de dentro da sua própria notação — coordenadas em nível de célula, já que o layout interno pertence àquele tipo). Somente-anexação, então valores existentes mantêm seu significado
IEdgeContributorDeclara arestas que o scanner não consegue ver. Sem diagnósticos. string Name · ContributeEdges(EdgeContributionContext, ICollection<EdgeSpec>)
EdgeSpecUma aresta — FromTab/FromRecordId/ToTab/ToRecordId (+ opcional FieldName, PayloadTab/PayloadRecordId para arestas de registro, Label)
EdgeContributionContextTables + KeyIndices somente leitura (sem coletor de erro — arestas não são validação)
IAuthorableEdgeContributorCapacidade opcional que um IEdgeContributor também pode implementar para que a sua aresta possa ser editada no canvas de grafo. bool TryPlanConnect(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out EdgeCellWrite) · bool TryPlanDisconnect(EdgeAuthoringContext, RecordEdge, out EdgeCellWrite)false = nada é preparado e a affordance fica desabilitada com um motivo; ambos rodam dentro de try/catch
IEdgeTokenEditorCapacidade opcional que um IEdgeContributor também pode implementar para que o resto do seu token (tudo que não é a chave) possa ser editado no inspector de fio. bool TryDescribeToken(EdgeAuthoringContext, RecordEdge, out EdgeTokenDescription) · bool TryPlanSetModifier(EdgeAuthoringContext, RecordEdge, string newModifier, out EdgeCellWrite) — ambos leem a mesma célula (uma aresta sabe para onde aponta, não como está escrita hoje), false = a linha fica oculta ou honestamente desabilitada; ambos rodam dentro de try/catch
EdgeTokenDescriptionO que um token é e como editar o seu resto — TokenText (o fragmento a destacar) · ModifierText · HasModifier · ModifierLabel · IsChoice · Options / OptionLabels. new EdgeTokenDescription(tokenText) = sem resto, então nenhuma linha é desenhada; o ctor de escolha recorre a texto livre quando a lista de opções está vazia
IBatchAuthorableEdgeContributorCapacidade opcional, irmã de IAuthorableEdgeContributor (não uma herança): planos de conectar/desconectar como uma lista de gravações de célula, para dados em que um gesto precisa mudar várias células pareadas juntas. bool TryPlanConnectMany(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out IReadOnlyList<EdgeCellWrite>) · bool TryPlanDisconnectMany(EdgeAuthoringContext, RecordEdge, out IReadOnlyList<EdgeCellWrite>) — a lista inteira é preparada como um único passo de undo, ou nenhum; contribuidores singulares continuam funcionando (fallback), e o lote vence quando uma classe implementa os dois
IVirtualNodeFactoryCapacidade opcional: gestos de "criar" no canvas que não são uma nova linha de planilha. IReadOnlyList<VirtualNodeKind> KindsFor(EdgeAuthoringContext, tab, recordId) (chamado a cada montagem do menu — mantenha leve) · bool TryPlanCreate(EdgeAuthoringContext, tab, recordId, VirtualNodeKind, out IReadOnlyList<EdgeCellWrite>)false = a sessão fica intocada. Um plano não pode ter como alvo um registro criado no mesmo gesto
VirtualNodeKind (struct)Um tipo criável — Id (retornado ao pé da letra na escolha) · Label (texto de menu já traduzido; / aninha) · IsUsable. Seguro contra null, seguro contra default
IEdgeSlotDeclarerCapacidade opcional: portas que um nó (virtual) abre sem precisar de uma aresta ao vivo. IReadOnlyList<DeclaredSlot> DeclareSlots(EdgeAuthoringContext, nodeTab, nodeRecordId) — slots declarados entram no menu de conectar, no seletor de porta e nas linhas de porta do card; chamado a cada renderização, então as implementações precisam ser leves e livres de efeito colateral
DeclaredSlot (struct)Um slot declarado — FieldName (único por nó; precisa corresponder ao FieldName da aresta do contribuidor para os fios se ancorarem) · TargetTab · IsList · IsUsable. Seguro contra null, seguro contra default
EdgeAuthoringContextA entrada de planejamento — Tables + string CellText(tab, recordId, field), que retorna a célula como ela está agora (baseline mais preparação), então dois vínculos feitos em sequência se enxergam um ao outro
EdgeCellWrite (struct)O plano: TabName · RecordId · FieldName · NewRawText (vazio = limpar) · IsAddressable. Endereçado por chave, não por número de linha

ReferenceScanner — os dois predicados de referência:

  • GetReferencedTab(TypeToken) — o único predicado que todo consumidor pergunta, "isto é uma referência, e para onde". Ele responde para RecordId@Tab, para IntId@Tab (o espaço de chave inteira), para o interior de um wrapper, e para um tipo personalizado marcado com IsCustomReference. É por isso que um único opt-in — e, para IntId@Tab, uma ampliação deste predicado — liga todos eles de uma vez.
  • GetReferenceKind(TypeToken)RefKeyKind — se a referência compara contra o espaço de chave em string ou em inteiro, então a propagação de renomeação, o dropdown e o seletor ramificam corretamente.
  • GetReferenceKind(TypeToken, tables) — a sobrecarga ciente da tabela.

Uma referência do core declara o seu próprio espaço (RecordId / IntId). Um tipo personalizado com referência não tem notação para dizer isso — MyType@Tab é a única grafia — então o seu espaço é derivado da identidade da aba de destino: uma chave própria RecordId significa espaço em string, IntId sozinho significa espaço em inteiro, e uma aba desconhecida ou null tables recorre ao espaço em string, a mesma resposta que a sobrecarga só-com-token dá. Essa derivação é o que permite que uma implementação existente de IReferencingCellType mire em uma aba com chave em IntId sem uma única linha alterada.

Índice do grafo de referências (SheetForge.Core.Edges)

Um snapshot imutável que funde referências escaneadas pelo core e arestas de contribuidor em um único modelo, indexado nos dois sentidos. Material de exibição — nunca produz diagnósticos (o Diagnostics da projeção continua sendo a única fonte da verdade para problemas).

TipoCategoriaPapel e membros principais
RecordEdge (struct)valorUma aresta. RecordEdgeOrigin Origin · FromTab · FromRecordId (vazio para arestas em nível de campo) · FieldName · RowNumber / ColumnNumber (baseado em 1; 0 = nível de campo/aba) · ToTab · ToRecordId (o id pretendido, mesmo quando não resolvido) · bool IsDangling (fixado no momento da montagem) · Label · PayloadTab / PayloadRecordId (arestas de registro)
RecordEdgeOrigin (enum)CoreReference (lida de uma célula RecordId@Tab — tem coordenadas) · Contributor (declarada por um IEdgeContributor — em nível de registro)
ReferenceIndexsealed classO snapshot. static Build(tables, keyIndices, contributorEdges, codeRegistries, extraKeys = null) (os três últimos podem ser null; extraKeys = aba → chaves que existem mas ainda não foram parseadas, por exemplo linhas que uma superfície de autoria acabou de preparar, então os vínculos para elas não são desenhados como quebrados) · AllEdges (ordem determinística: aba de origem Ordinal → linha → coluna → ocorrência) · OutEdges(tab, recordId) / InEdges(tab, recordId) (nunca null) · int InCount(tab, recordId) · bool TryGetRowKey(tab, rowNumber, out recordId) · DanglingEdges

Canvas de registros do Data Studio (SheetForge.Core.Graphing)

O canvas decide o que desenhar por conta própria: ele percorre o índice de referências para fora, a partir do registro que você abriu (o terminus), e organiza o resultado de forma determinística. Um plugin não substitui esse quadro — ele acrescenta a ele. Dados puros do início ao fim: colunas são células de grade, não pixels, e cores são uma string Category livre que a janela mapeia para uma paleta.

TipoCategoriaPapel e membros principais
IRecordCanvasAugmenterinterfaceA sobreposição de canvas de uma aba, chamada depois que o fechamento é montado. Augment(GraphBuildContext, CanvasAugmentBuilder, string terminusTab, string terminusRecordId). Não adicionar nada deixa o quadro do core como está; um throw é capturado pela janela e vira um aviso de console em inglês. A identidade pertence aos dados (um nó virtual perde para um registro real da mesma chave); a apresentação — a dica de exibição — não
CanvasAugmentBuildersealed classA superfície de gravação, apenas quatro coisas — membros e regras abaixo da tabela
GraphShapeRegistrysealed classNome da aba → sobreposição de canvas. Register(tabName, IRecordCanvasAugmenter) (aba duplicada / nome vazio / null lança exceção) · TryGet · IsEmpty
GraphBuildContextsealed classA entrada somente leitura da sobreposição. Tables (aba → SheetTable) · ReferenceIndex References · IReadOnlyList<CodeRegistrySource> CodeRegistries (vazio, nunca null). Sem coletor de erro — um canvas é exibição, não validação
GraphSpecBuildersealed classO auxiliar de montagem do grafo. ctor (GraphBuildContext) · static NodeKey(tab, recordId) (a única verdade para onde os fios apontam) · AddNode(GraphNodeSpec) (o primeiro (Key, Column) vence) · AddWire(GraphWireSpec) · AddWire(fromKey, toKey, label, fromTab, fromRecordId, fieldName, isCyclic = false, cyclicNote = null) (a sobrecarga que também nomeia a célula em que o vínculo está escrito, o que é o que torna o fio editável)
GraphSpecsealed classO resultado montado que o canvas desenha — Nodes · Wires (a montagem passa pelo builder; o ctor é internal)
GraphNodeSpecsealed classUm nó. Key · Tab · RecordId · Title · Subtitle · Category · CellCoordinate Address · Column / Row (células de grade que o canvas já resolveu — carregadas, não escolhidas, aqui) · IsFocus (o terminus) · IsMissing · InCount · IsCyclic
GraphWireSpecsealed classUm fio. FromKey · ToKey · Label · IsCyclic · CyclicNote, mais a célula proprietária opcional: FromTab · FromRecordId · FieldName · RecordEdge? SourceEdge (null = fio somente de exibição; o canvas então diz que ele não pode ser editado). Os cinco argumentos de exibição permanecem inalterados, então chamadas existentes compilam e renderizam de forma idêntica
IAuthorableGraphShapeinterfaceCapacidade opcional que um IRecordCanvasAugmenter também pode implementar. IReadOnlyList<string> CreatableTabs(GraphBuildContext, string tabName) — onde o canvas pode criar um registro (vazio = lugar nenhum). Os padrões sem ela estão abaixo da tabela

CanvasAugmentBuilder — a superfície de gravação. Apenas quatro coisas:

  • AddNode(tab, recordId, title = null, category = null) / AddNode(tab, recordId, title, category, CellCoordinate address) — um nó virtual para uma identidade que não é um registro de planilha (uma chave de evento, um átomo de código); a aba pode ficar vazia.
  • AddEdge(fromTab, fromRecordId, toTab, toRecordId, label = null, fieldName = null, fieldOnTarget = false, isCyclic = false, cyclicNote = null) — uma aresta extra que o scanner do core não consegue ver. Nomear fieldName diz em qual célula o vínculo está escrito, fieldOnTarget diz que essa célula fica na chegada, e não na partida, e o par de ciclo marca um loop para exibição, com a nota que só o domínio conhece.
  • SetLayer(tab, recordId, layer) — uma dica de camada absoluta (0 = mais à esquerda, negativo = ainda mais à esquerda, tudo se desloca para a direita para compensar). SetLayerRelative(tab, recordId, offset) — a mesma coisa, contada a partir do terminus (−1 = uma coluna à esquerda dele), resolvida contra a coluna do terminus antes de qualquer dica movê-la.
  • SetSubtitle(tab, recordId, subtitle) — uma dica de exibição, a única coisa que se aplica a registros que já existem e a registros que não estão em tela (o seletor de conexão lê esses).

Itens com chave vazia são ignorados, e o que foi coletado é internal, porque as regras de fusão vivem em um único lugar. Toda ampliação é à direita (trailing), então uma sobreposição escrita contra uma superfície anterior continua compilando.

IAuthorableGraphShape — os dois padrões sem ela:

  • A lista de abas criáveis que esta capacidade substitui — o eixo que também decide se um canvas sequer abre e até onde a varredura de linhas pendentes alcança — cobre toda aba alcançável a partir da aba em foco seguindo o esquema transitivamente.
  • A cascata de vínculo que o usuário de fato vê começa a partir das abas para onde as portas atualmente desenhadas apontam.

Ambos descartam abas de registro de código e abas sem coluna-chave. Uma aba que isto retorna e que nenhuma porta desenhada aceita permanece listada na cascata de vínculo com o seu motivo anexado, e os próprios portões da janela ainda se aplicam por cima.

Predefinições de cor (SheetForge.Core.Theming)

TipoPapel e membros principais
ThemeRegistryId de predefinição → tema. Ids em branco, duplicatas e os dois ids embutidos reservados lançam exceção. Register(SheetForgeTheme) · TryGet · Themes · IsEmpty · IsBuiltInId(id) · BuiltInDefaultId · BuiltInHighContrastId
SheetForgeThemeUma predefinição de cor. Id · DisplayName · DarkColors / LightColors (IReadOnlyDictionary<ThemeColorSlot, uint>, copiado na construção) · TryGetColor(dark, slot, out rgb) · IsEmpty
ThemeColorSlotenum — os 33 papéis de cor que uma predefinição pode sobrescrever (superfícies, linhas, texto, cores semânticas, marcas de preparação, superfícies de falha, scrim, grafo). Cores são 0xRRGGBB: o Core não referencia nenhum tipo do motor, e preenchimentos translúcidos derivam de uma cor de slot mais um alfa fixo. Somente-anexação.

Uma predefinição sobrescreve apenas os slots que ela nomeia; todo outro slot mantém o padrão do produto, então uma predefinição continua válida conforme slots são adicionados. Registrar nunca aplica uma predefinição — o usuário escolhe uma em Preferences ▸ SheetForge ▸ Theme.

Superfícies de autoria declarativas (SheetForge.Core.Studio)

Um plugin descreve o que mostrar — o invólucro como dado, o predicado e o efeito como delegates — e cada host o desenha com os seus próprios widgets: UIToolkit no editor, React no navegador. Nenhum número de layout aparece em lugar nenhum. O que dizer é do plugin; como posicioná-lo é do renderizador.

Todo enum aqui é somente-anexação, então um registro mantém o seu significado conforme o vocabulário cresce.

TipoCategoriaPapel e membros principais
StudioUiRegistrysealed classO que RegisterStudioUi preenche. AddAction(StudioActionDescriptor) · AddPanel(StudioPanelDescriptor) · AddColumnBadge(StudioColumnBadgeDescriptor) · AddCellEditorHint(StudioCellEditorHint) · Actions / Panels / ColumnBadges / CellEditorHints · IsEmpty
StudioUiNodesealed classUm fragmento descrito, imutável, construído através de fábricas estáticas — as fábricas, as propriedades de leitura e a regra de URL estão abaixo da tabela
StudioUiNodeKindenumOs 13 tipos acima (RowLink)
StudioActionDescriptorsealed classUm verbo. Id (único) · LabelKey (uma chave Loc; não registrada mostra ao pé da letra) · StudioActionPlacement Placement · Func<StudioSurfaceContext,bool> AppliesTo · Action<StudioSurfaceContext> Execute · ConfirmKey (opcional — o host pergunta essa frase primeiro). O host reverifica AppliesTo no momento da invocação, então uma entrada de menu desatualizada responde com um no-op honesto e um redesenho
StudioActionPlacementenumInspector · RowContextMenu · TopbarMenu · ColumnHeaderMenu · CanvasNodeMenu. Cada assento preenche campos de contexto diferentes — o assento de linha carrega o registro, o assento de coluna o nome da coluna, o assento de canvas o registro daquele nó
StudioPanelDescriptorsealed classUm painel no painel à direita do Studio. Id · TitleKey · Func<StudioSurfaceContext,StudioUiNode> Build — reconstruído a cada tick de recomputação, então não guarda estado. Sem nenhum painel registrado, o painel simplesmente não é desenhado
StudioColumnBadgeDescriptorsealed classUm selo ao lado de um cabeçalho de coluna. Func<StudioSurfaceContext,string,string,StudioUiNode> Provide (contexto, aba, campo) — null significa nada naquela coluna
StudioCellEditorHintsealed class"Use este widget embutido para este tipo" — escolher um tipo em vez de fornecer um. TypeName (um nome exato de tipo do CellParserRegistry; uma célula de lista é comparada pelo seu nome de elemento; células de wrapper mantêm o texto canônico e nunca são comparadas) · StudioCellEditorArchetype Archetype · GetOptions (somente dropdown — Func<context, tab, field, IReadOnlyList<StudioCellOption>>) · SliderMin / SliderMax · ToggleTrueValue / ToggleFalseValue. Quatro construtores, um por forma de material. Consultado depois que um IStudioCellEditorProvider registrado recusa e antes das ramificações embutidas; o hint de um pacote é consultado antes dos hints embutidos abaixo, então registrar um sob Color, AnimationCurve ou Gradient sobrepõe o editor padrão para aquele tipo. Um List<> cujo hint de elemento é ColorPicker, CurveEditor ou GradientEditor vira um editor de chips nos dois hosts
StudioCellEditorArchetypeenumDropdown · MultilineText · Slider · Toggle · ColorPicker (texto de célula #RRGGBB / #RRGGBBAA) · CurveEditor (texto de célula = a notação canônica de CurveValue) · GradientEditor (texto de célula = a notação canônica de GradientValue). Somente-anexação — os dois mais novos são 5 e 6
BuiltinCellEditorHintsstatic classOs três hints que o próprio Core declara — ColorColorPicker, AnimationCurveCurveEditor, GradientGradientEditor — percorrendo o mesmo caminho que os hints de um pacote, então o editor e o navegador não podem escolher widgets diferentes para eles. IReadOnlyList<StudioCellEditorHint> All (ordem fixa) · bool TryGet(typeName, out hint) (Ordinal). Os hosts consultam StudioUiRegistry.CellEditorHints primeiro e recorrem a esta tabela
StudioCellOptionsealed classUm candidato de dropdown — Value (o texto canônico gravado na célula) · Label (o que uma pessoa lê; padrão = Value)
StudioSurfaceContextsealed classA única costura que uma extensão vê e através da qual age. Leitura: Tables · ReferenceIndex References · CodeRegistries · Tab · RecordId · Field · ActionArgument (o valor que um nó Input confirmou). Mutação mediada, e nada mais: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells (um passo de Undo, tudo ou nada) · Action<string,string> FocusRecord · Action RequestRebuild. A preparação passa pelo próprio portão da janela, então uma origem somente leitura, um pipeline em execução ou uma aba baseada em workbook a bloqueia com um motivo (ctor internal: o host o monta)

StudioUiNode — fábricas, leituras e a regra de URL:

  • Fábricas: Row · Label · Chip · Badge · Button · Rule · Heading · KeyValue · Table(headerRow, rows) · List · Progress · Input · Link, mais WithTooltip(text), que retorna um novo nó em vez de mudar este.
  • Leituras: Kind · Text · Tooltip · ThemeColorSlot? Tone (nunca uma cor fixa, então segue o tema) · ActionId · Detail · Ratio · Url · Children.
  • static bool IsAllowedUrl(url) — apenas http/https. Um único predicado que os dois hosts consultam, então eles não podem discordar sobre o que é seguro abrir.

Strings de UI de plugin (SheetForge.Core.Model)

TipoPapel e membros principais
StringOverlayRegistryColetor e sobreposição de consulta para strings de UI registradas por plugin; Loc.Tr (editor) e t() (navegador) a consultam antes das tabelas do produto. Register(key, language, value) · Register(key, IReadOnlyDictionary<string,string> byLanguage) · bool TryGet(key, language, out value) · RegisteredKeys. A correspondência de idioma e as quatro recusas estão abaixo da tabela

StringOverlayRegistry — correspondência e recusas. language é um código IETF ("en", "ko", "zh-Hans", "pt-BR", …), comparado sem diferenciar maiúsculas/minúsculas. A busca recorre a idioma pedido → inglês → nada encontrado, e o fallback vive aqui para que os dois hosts respondam de forma idêntica.

Quatro registros são recusados, cada um registrando um motivo voltado ao desenvolvedor, em vez de falhar silenciosamente:

  • uma chave embutida do produto — uma sobreposição pode adicionar chaves, nunca sobrescrever as próprias frases ou caminhos de menu do produto;
  • uma chave+idioma que outro pacote já registrou — o primeiro encontrado vence, porque senão a ordem de instalação decidiria a tela;
  • uma chave ou valor vazio;
  • um código de idioma que o produto não conhece, que nunca é dobrado em inglês.

Observação de pipeline (SheetForge.Core.Plugins / .Model)

TipoPapel e membros principais
IPipelineObserverNotificação somente leitura. void OnImportCompleted(PipelineRunView view) — uma vez por ciclo de importação explícito, ao seu final, sucesso ou falha. Deliberadamente não existe um hook que altere um valor ou adicione um diagnóstico (isso pertence a um tipo de célula e a IDomainValidator), nem um que rode no pre-flight de preparação. Um throw é isolado com o motivo coletado; a saída da importação permanece inalterada. Futuros pontos de observação chegam como interfaces de capacidade irmãs, convertidas via cast a partir do observador registrado, então uma implementação escrita hoje continua compilando
PipelineObserverRegistryLista de observadores somente-anexação, ordem preservada. Register(IPipelineObserver) · Observers
PipelineRunViewO snapshot imutável que um observador recebe — Success (validação, ou seja, se um registry foi montado; resultados de codegen/bake são lidos a partir dos diagnósticos) · Tables (abas que foram parseadas; em uma execução com falha, apenas as abas que não puderam ser parseadas estão ausentes, porque "nenhuma montagem parcial" é uma regra de saída, não de observação) · Diagnostics (a mesma lista que o relatório mostra) · SkippedTabs · EnumTabs. Coleções são copiadas na construção, e o construtor é internal, então nenhum snapshot meio-construído pode ser entregue a um observador

Registros de código (SheetForge.Core.Graphing)

Alvos de referência que vivem no código, expostos à superfície de autoria como abas virtuais travadas. Consumidos pelo Data Studio (barra lateral / grafo / inspector), não pelo validador de importação.

TipoCategoriaPapel e membros principais
CodeRegistryCatalogsealed classRaiz de registro. Register(CodeRegistrySource) (null / nome de aba vazio / nome de aba duplicado lança exceção) · TryGet(tabName, out source) · Sources · IsEmpty
CodeRegistrySourcesealed classUma aba virtual travada. string TabName · IReadOnlyList<CodeRegistryEntry> Entries (ordem de registro = ordem de exibição)
CodeRegistryEntrysealed classUma entrada. string Key (o que uma referência pode apontar) · string Label · IReadOnlyList<string> Raises (null normaliza para vazio). O Core trata os três como strings opacas

O modelo de leitura do IR (SheetForge.Core.Model)

TipoPapel e membros principais
SheetTableA saída de parsing de uma aba. SheetSchema Schema · IReadOnlyList<SheetRecord> Records
SheetSchemastring TabName · Fields · TryGetField(name, out FieldSchema) · SheetStyle Style (o metadado de exibição @style da planilha) · bool IsLocalizationSheet (o marcador @loc está presente) · IReadOnlyList<LocaleColumn> LocaleColumns (as colunas de idioma na ordem original das colunas — vazio em uma planilha que não é uma planilha de localização, nunca null) · TryGetLocaleColumn(localeCode, out LocaleColumn) (busca pelo código, sem diferenciar maiúsculas de minúsculas) · TryGetSourceLocale(out LocaleColumn) (a primeira coluna de idioma; false quando não há nenhuma)
SheetStyleO valor da linha @style — metadado de exibição de uma planilha. string Title (rótulo de grupo da barra lateral) · string ColorHex (#RRGGBB como escrito) · bool HasColor · static None (sem estilo). Nunca lido pelo codegen, pelo bake ou pelo fingerprint do esquema
LocaleColumn (struct)Uma coluna de idioma de uma planilha de localização — o que a linha @loc escreveu naquela coluna. string Code (o código exatamente como escrito; o Core valida a forma da grafia, nunca se o idioma existe) · string FieldName · int ColumnNumber (baseado em 1) · bool IsSource (a primeira coluna de idioma — aquela que as prévias em linha leem e na qual a cunhagem grava)
SheetRecordint RowNumber (original, baseado em 1) · Values (campo → CellValue) · TryGet · indexador
FieldSchemaName · TypeToken Type · Description · ColumnNumber · DefaultValue · AllowOverlap · IReadOnlyDictionary<string,string> MarkerValues (nome do marcador personalizado → texto da célula desta coluna)
TypeTokenCélula @type parseada. RawText · TypeName · TypeArgument · TargetName · IsList · IsOptional · HasExplicitDefault · DefaultValueText · AllowsEmptyCell · IsSelfKey · IsIntId (apenas a chave inteira própria desta aba — a forma de referência IntId@Tab é lida através de TargetName + ReferenceScanner.GetReferencedTab, da mesma forma que RecordId@Tab) · TypeToken InnerToken / IsWrapper (tipos wrapper — interno recursivo) · IsCustomReference (esta coluna é MyType@Tab, onde o parser implementa IReferencingCellType; ReferenceScanner.GetReferencedTab é o único predicado que o lê, o que é como todo consumidor se acendeu sem uma mudança de assinatura) · AssetTypeName (o <Type> de AssetRef@Group<Type> como escrito, null quando sem restrição; o Core armazena somente o nome — resolvê-lo é trabalho do IAssetTypeResolver — e ele também é carimbado no token AssetRef dentro de uma lista ou de um wrapper). Os três parâmetros finais do construtor (innerToken, isCustomReference, assetTypeName) têm valor padrão, então chamadas existentes continuam compilando, e os construtores anteriores de 8 e 10 argumentos permanecem como sobrecargas, então assemblies de plugin já compilados continuam funcionando sem uma recompilação
CellValue (struct)Um valor de célula tipado; sem nulls (IsDefaulted marca padrões materializados). object Value · IsDefaulted · AsList · estático Of / Defaulted
RecordId (struct)Um valor de chave (igualdade Ordinal). string Value · IsEmpty
RecordRefValue (struct)O valor de uma célula RecordId@Tab. TargetTab · Id
IntRefValue (struct)O valor de uma célula IntId@Tab — o gêmeo de chave inteira de RecordRefValue. string TargetTab · int Id · bool IsEmpty · static Empty(tab) (um IntId@Tab? opcional que não aponta para nada)
LocRefValue (struct)O valor de uma célula LocRef@Tab — o gêmeo de localização de RecordRefValue, mantido como um tipo separado para que um consumidor saiba, só pelo valor, que ele aponta para uma tabela de strings. string TargetTab · string Key · bool IsEmpty · static Empty(tab) · ReferencedKeys. Ele implementa IRefBearingValue, então o scanner de referências o trata exatamente como uma referência do Core
AssetRefValue (struct)O valor de uma célula AssetRef@Group. Group · Key (a chave de um sub-asset é parent[sub])
EnumValue (struct)O valor de uma célula Enum<T> (par de strings — a conversão para CLR é trabalho do bake). EnumName · MemberName

Referências de asset tipadas (SheetForge.Core.Model)

O <Type> em AssetRef@Group<Type> é resolvido pelo host — o Core não conhece nem o engine, nem os assemblies do projeto — e o Core apenas julga o resultado. Tudo aqui é dado puro.

TipoCategoriaPapel e membros principais
IAssetTypeResolverinterfaceAssetTypeResolution Resolve(string rawName) — um nome entra, um veredito sai; o mesmo nome sempre recebe a mesma resposta (implementações podem fazer cache). Injetado no ImportPipeline separadamente do AssetKeyIndex, então nomes de tipo são resolvidos mesmo em um projeto que ainda não tem configurações do Addressables; quando nenhum resolver é injetado (headless, navegador), os diagnósticos de nome de tipo simplesmente não são produzidos. A implementação do Editor resolve contra os tipos de asset derivados de UnityEngine.Object carregados no projeto (sem lista de permissões; componentes e tipos exclusivos do editor excluídos)
AssetTypeResolutionsealed classO veredito para um nome — RawName · AssetTypeResolutionStatus Status · FullName (nome completo CLR, tipos aninhados com +; somente Resolved e NotReferenceable) · AssemblyName (o assembly que o assembly complementar gerado precisa referenciar — definido para tipos de assembly definition, null para módulos do engine e nomes não resolvidos) · Candidates (nunca null: os candidatos ambíguos, ou sugestões de correspondência mais próxima para um nome desconhecido). Fábricas Resolved(raw, fullName, assemblyName) · Unknown(raw, suggestions) · Ambiguous(raw, candidates) · NotReferenceable(raw, fullName, assemblyName)
AssetTypeResolutionStatusenumResolved · Unknown (nenhum tipo com esse nome) · Ambiguous (o nome curto corresponde a vários tipos — escreva o nome completo) · NotReferenceable (o tipo vive em um assembly predefinido como Assembly-CSharp, que o código gerado não consegue referenciar)

O codegen lê o dicionário resolvido que o pipeline produz e emite AssetReferenceT<global::FullName> para um nome resolvido; um nome que ele não consegue encontrar nesse dicionário nunca é emitido ao pé da letra — o campo recorre a AssetReference e um aviso AssetTypeUnresolvedFallback é coletado. O nome completo resolvido também é misturado ao fingerprint do esquema.

Tipos de valor visual (SheetForge.Core.Model)

Modelos de valor livres de engine para os três tipos visuais embutidos. Cada um é imutável, IEquatable, e possui a sua própria forma de texto (TryParse / Render) — a mesma notação que a página de Sintaxe da Planilha documenta — então um tipo de plugin que armazena uma cor, uma curva ou um gradiente pode reutilizá-los em vez de inventar uma segunda notação. O Editor os coze (bake) em UnityEngine.Color / AnimationCurve / Gradient e os lê de volta; o navegador os amostra através dos avaliadores abaixo, em vez de reimplementar a matemática.

TipoCategoriaPapel e membros principais
ColorValuereadonly structQuatro bytes R · G · B · A · static Default (#00000000) · static TryParse(text, out value, out error) (aceita #RGB / #RGBA / #RRGGBB / #RRGGBBAA) · Render() (maiúsculo, seis dígitos quando opaco)
CurveValuesealed classKeys (crescente por tempo) · PreWrap / PostWrap · static Empty (sem chaves — o único estado sem forma de texto; Render() retorna "") · static Create(keys, preWrap, postWrap)o único caminho de construção: ordena por tempo, rejeita tempos duplicados, e aplica CurveTangentSolver para que "o modo vence" valha desde o momento em que uma curva existe · static TryParse (chaves de 2/4/7/8 campos, Once aceito como um alias de ClampForever, tangentes Infinity/-Infinity) · Render() (chaves de 8 campos, sufixo de wrap somente quando necessário)
CurveKeyreadonly structTime · Value · InTangent · OutTangent · InWeight · OutWeight · CurveWeightedMode WeightedMode · CurveTangentMode LeftMode / RightMode · bool Broken; um construtor de dez argumentos, sem normalização própria
CurveWrapenumClampForever · Loop · PingPong · Default — o vocabulário de wrap da Unity por nome (o mapeamento do valor para WrapMode pertence ao baker)
CurveTangentModeenumFree = 0 · Auto = 1 · Linear = 2 · Constant = 3 · ClampedAuto = 4 — nome e valor idênticos a AnimationUtility.TangentMode, então o baker mapeia por nome e nunca toca nos bits de tangente compactados da Unity
CurveWeightedMode[Flags] enumNone = 0 · In = 1 · Out = 2 · Both = 3 — qual lado de uma chave usa tangentes ponderadas (Bezier)
CurveTangentSolverstatic classCurveKey[] Apply(IReadOnlyList<CurveKey> sortedKeys) — deriva os números de tangente que um modo determina, aplicando os estágios na ordem do engine (Linear no seu próprio lado → ClampedAuto nos dois lados → Auto nos dois lados → Constant no seu próprio lado), deixando os lados Free e os pesos intocados. CurveValue.Create o chama, então quem consome raramente precisa
CurveEvaluatorstatic classfloat Evaluate(CurveValue, float time) · float[] Sample(CurveValue, int count) (count ≥ 2, uniformemente espaçado da primeira até a última chave) — Hermite entre chaves, Bezier ponderada nos lados cuja flag de peso está ativa, uma retenção quando uma tangente é infinita, e os quatro comportamentos de wrap fora do intervalo de chaves; verificado contra AnimationCurve.Evaluate em curvas aleatórias
GradientValuesealed classColorKeys · AlphaKeys (de 1 a 8 cada, crescente por tempo) · GradientBlend Mode · GradientColorSpace ColorSpace · static Default (branco, totalmente opaco, Blend) · static Create(colorKeys, alphaKeys, mode, colorSpace) (valida contagens e intervalos 0…1, quantiza tempos para 16 bits como a Unity faz, ordena de forma estável) · static TryParse (três ou quatro seções separadas por `
GradientColorKeyreadonly structColorValue Color (alfa ignorado — o alfa tem as suas próprias chaves) · float Time
GradientAlphaKeyreadonly structfloat Alpha · float Time
GradientBlendenumBlend · Fixed · PerceptualBlend
GradientColorSpaceenumUninitialized (não gravado; lido como Gamma) · Gamma · Linear — apenas PerceptualBlend é afetado
GradientEvaluatorstatic classColorValue Evaluate(GradientValue, float time) · ColorValue[] Sample(GradientValue, int count) — mesclagem linear, em degraus ou perceptual (Oklab), com as chaves de alfa mescladas separadamente, arredondadas para bytes; verificado contra Gradient.Evaluate em gradientes aleatórios

Erros e resultados (SheetForge.Core.Model / .Reporting)

TipoPapel e membros principais
ImportErrorErro estruturado, neutro em relação à localidade. Code · Severity · Coordinate · ActualValue · Expected · Suggestion
ImportErrorCode (enum, 105)O catálogo completo de "por quê" — as famílias que ele cobre estão listadas abaixo da tabela. Somente-anexação, porque as tabelas de renderização se baseiam nos valores dos membros
ImportSeverity (enum)Error (bloqueia a saída) · Warning
CellCoordinate (struct)Aba · linha baseada em 1 · coluna baseada em 1 · campo; calcula a letra da coluna da planilha. Fábricas ForTab / ForRow
ErrorCollectorColetor de "colete tudo". All · HasErrors · ErrorCount · Add
ImportResultSaída do pipeline. Invariante: Success == false ⇔ Registry == null. Success · Registry · Diagnostics · SkippedTabs · EnumTabs (abas lidas como planilhas de definição de enum, então nunca parseadas como tabelas de dados — mantidas separadas de SkippedTabs, que significa "ainda sem tabela escrita", então a contagem de ignoradas do relatório permanece correta; ambos são conjuntos de preservação que mantêm o código gerado, os assets cozidos (bake) e os endereços dessas abas) · static Succeeded / Failed
ImportReport (.Reporting, assembly SheetForge.Core.Tooling)Entrada dos renderizadores de relatório — Timestamp · SourceDescription · TabCount · RecordCount · Success · Diagnostics · ErrorCount · WarningCount · SkippedTabCount (quantas de TabCount eram planilhas vazias ignoradas em vez de importadas — o cabeçalho o imprime, para que uma contagem de abas não seja confundida com "todas importadas")
ImportReportText (.Reporting, assembly SheetForge.Core.Tooling, static)Renderiza um relatório na própria string legível por humanos do produto, sem nada escrito no console e sem link de salto ou linha de coordenada de máquina anexados (esses pertencem à convenção do próprio console). string Render(ImportReport report, IReadOnlyDictionary<string,string> languageTable = null, string operationName = null) — omita a tabela para inglês; o nome da operação, quando omitido, é lido da mesma tabela, então a frase nunca mistura dois idiomas. Chamadores do lado do Editor normalmente querem SheetForgeActions.RenderReportText(report), que preenche o idioma atual do editor (um assembly puro não consegue ler EditorPrefs)

ImportErrorCode — as famílias que ele cobre:

  • marcadores, esquema, tipos, células, chaves/referências e chaves de asset;
  • origens/arquivos, csv/xlsx, identificadores de codegen, addressables, baseline/exportação, Google/auth/Push e templates;
  • plugins — PluginRegistrationConflict, mais PluginIncompatible quando a declaração de compatibilidade de um assembly cai fora do que este host lê;
  • IntId — DuplicateIntId, e para referências IntId@Tab, UnresolvedIntId · TargetTabHasNoIntId;
  • @overlap e DomainRuleViolation;
  • planilhas de definição de enum — EnumSheetMarkerConflict · DuplicateEnumName · EnumSheetEmptyColumn · InvalidEnumIdentifier · InvalidEnumUnderlyingType · InvalidEnumMemberValue;
  • DropdownNotSupportedByFormat, que é um aviso, e não um erro;
  • referências de asset tipadas — UnknownAssetType · AmbiguousAssetType · AssetTypeNotReferenceable (uma vez por coluna, na linha @type), AssetTypeMismatch por célula, e o aviso de codegen AssetTypeUnresolvedFallback.

Índices e utilitários (SheetForge.Core.Validation / .Model / .Parsing / .Unparse)

TipoPapel e membros principais
TabKeyIndexInformação de chave de uma aba — a coluna-chave em string mais o conjunto de chaves inteiras IntId da aba, então tanto referências RecordId@Tab quanto IntId@Tab resolvem contra ele. TabName · KeyField · HasKeyColumn · Keys · Contains(id)
KeyIndexBuilder (static)Constrói índices de chave (as chaves em string e o conjunto de chaves inteiras IntId, em uma única passagem), relata erros de chave, valida colunas IntId. Build(SheetTable, ErrorCollector) · ValidateIntIdColumns
AssetKeyIndexGrupo → conjunto de chaves válidas (o Editor o preenche a partir do catálogo do Addressables, chaves de sub-asset incluídas; injeção de null = ignora a validação de asset). Register(group, keys) · HasGroup · HasKey · KeysOf · GroupNames, mais a camada de tipo usada por AssetRef@Group<Type>: RegisterTyped(group, key, satisfiedTypeFullNames) (a chave e o fecho dos nomes completos de tipo como os quais ela pode ser carregada — o seu próprio tipo, bases, interfaces, os tipos dos seus sub-assets; registrar de novo faz a união dos fechos) · HasTypeInfo(group, key) · SatisfiesType(group, key, typeFullName). Uma chave registrada com Register simples não tem fecho e fica isenta da checagem de tipo, em vez de falhar nela
LocalizationCoverage (static)Cobertura por idioma e chaves órfãs de uma planilha de localização. Um cálculo puro que devolve listas em vez de coletar erros, porque uma célula não traduzida e uma chave não utilizada são estados normais, não saídas a bloquear. IReadOnlyList<LocaleCoverage> Compute(SheetTable) · IReadOnlyList<string> FindOrphanKeys(locTabName, tables) (chaves para as quais nada aponta; deliberadamente conservador — toda forma de referência que o scanner conhece conta como uso, então uma tradução viva nunca é chamada de órfã)
LocaleCoverage (sealed class)A cobertura de um idioma. LocaleColumn Locale · int TotalKeys · int TranslatedKeys · IReadOnlyList<string> MissingKeys (ordem das linhas da planilha, nunca null) · bool IsComplete
TextSuggestion (static)Sugestões de correspondência mais próxima (Levenshtein limitado, determinístico). FindNearest · Distance · DistanceWithin
BuiltinCellParsers (static)CreateDefaultRegistry() — os 12 parsers embutidos (int, float, bool, string, Enum, RecordId, AssetRef, IntId, LocRef, Color, AnimationCurve, Gradient).
CanonicalValueRenderer (static)Valor → string de célula canônica (Exportação/Push). TryRender(…) (delega um ColorValue / CurveValue / GradientValue para o seu próprio Render(); uma curva sem chaves é renderizada como a célula vazia) · RenderFloat(float) (round-trip mais curto)

Plano de Push (SheetForge.Core.Unparse)

Público porque IPushApprover.Approve(PushPlan) os expõe; dados puros.

TipoPapel
PushPlan (assembly SheetForge.Core.Tooling, assim como as três linhas abaixo)O plano de envio inteiro. Tabs · HasWork
PushTabPlanUma aba: Writes · Appends · Deletes (chave + número da linha; DeleteNotices continua sendo a visão somente de chave)
PlannedCellWriteUma gravação de célula — coordenadas, célula do baseline, novo valor/texto, flag de família de string
PlannedRowAppendUma linha anexada — textos de célula completos + colunas de família de string

Assembly Editor (SheetForge.Editor)

Configurações, localização, composição (SheetForge.Editor.Pipeline / .Localization)

TipoPapel e membros principais
SheetForgeSettings (SO)O asset de configurações. Campos: sourceProviderId (único eixo de seleção de origem; vazio = LocalFile embutido) · localFolderPath · bakeOutputFolder · generatedCodeFolder · generatedNamespace · exportFolderPath · exportFormat · spreadsheetId · googleAccessMode · serviceAccountKeyPath · gidMap (lista de GidMapEntry { tabName, gid }). Propriedades resolvidas Effective*.
Loc (static)Ponto de entrada da localização. Tr(key) · TrContent(…) · Table · MenuRoot const. Tr resolve em quatro passos: string registrada por plugin (idioma atual, depois inglês — a sobreposição é a dona desse fallback, veja StringOverlayRegistry) → tabela embutida (idioma atual, depois inglês) → a própria chave. Existe exatamente um canal de registro para strings de plugin, então "qual registro vence" nunca vira uma pergunta
PluginRegistry (static)Descobre plugins via TypeCache, então entrega os candidatos a PluginComposition.Compose. Build · BuildValidators · BuildEdgeContributors · BuildStructuralMarkers · BuildTemplates · BuildGraphShapes · BuildCodeRegistries · BuildThemes · BuildAll (pacote) · InvalidateCache() (descarta o cache de duração do reload — mesma convenção de SourceProviderRegistry.InvalidateCache; também descarta o cache do portão de compatibilidade, então um conjunto de descoberta alterado é rejulgado). O pacote e o isolamento de slot estão detalhados abaixo da tabela
ImportEvents (static)Barramento de eventos do lado do Editor — um contrato público: assets externos podem se inscrever. event Action<ImportCompletedArgs> ImportCompleted · RaiseImportCompleted(ImportCompletedArgs) disparam apenas quando uma importação rodou até o fim, passando pelo bake, então um assinante pode ler os assets cozidos. event Action<BaselineUpdatedArgs> BaselineUpdated · RaiseBaselineUpdated(BaselineUpdatedArgs) disparam sempre que um snapshot de planilha foi salvo — incluindo uma execução que falhou na validação — que é como uma superfície de autoria se atualiza em uma importação em quarentena. Dois eixos, deliberadamente não fundidos: um significa "as planilhas se moveram", o outro "os assets se moveram"
BaselineUpdatedArgs (sealed)Payload de salvamento de baseline. IReadOnlyList<string> Tabs (as abas gravadas no snapshot) · bool Quarantined (se o snapshot recém-salvo falhou na validação)
SheetForgeActions (static)A fachada de execução — o mesmo ciclo que um clique de menu roda, chamável a partir de um script de CI, um build hook ou o seu próprio botão. RunImport() · RunExport() · RunPush() · RunHealthCheck() · RunLocalizationSync() (cada um delega; resolução de configurações, o portão do Addressables, exclusão mútua, modais de confirmação, a barra de progresso e a retomada codegen→compilação→bake, tudo isso permanece dentro do produto) · bool IsBusy · bool TryBeginExclusiveScope(out IDisposable scope) (false + scope = null quando algo já está em execução; o scope é o que libera, e um segundo Dispose não consegue liberar a execução de outra pessoa) · string RenderReportText(ImportReport) (as próprias frases do produto no idioma atual do editor, sem escrita no console). A semântica de conclusão está detalhada abaixo da tabela
SheetForgeEditorInfo (static, namespace SheetForge.Editor)Âncora do assembly Editor — const Version, o espelho de SheetForgeRuntimeInfo para portões de funcionalidade contra a superfície do lado do editor
ImportCompletedArgs (sealed)Payload de conclusão passado aos assinantes. IReadOnlyList<string> Tabs (abas cujo bake foi feito nesta conclusão) · string BakeFolder (pasta dos Database SOs). Padrão args-object — campos futuros não vão quebrar a assinatura do evento.
GoogleSheetAccessMode (enum)SheetsApi (autenticado, gravável) · ExportUrl (sem autenticação, somente leitura)
ExportFormat (enum)Tsv · Csv · Xlsx · Json · MatchSource

PluginRegistry — o pacote e o isolamento de slot. O PluginBundle aninhado expõe o PluginSet Set montado — a única fonte de verdade de doze slots, o que é como um slot recém-crescido é lido sem ampliar o pacote — mais nove janelas de conveniência sobre ele: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes. Os construtores anteriores de seis e oito argumentos permanecem como sobrecargas que definem os registries mais recentes como vazios por padrão, comportando-se de forma idêntica às versões anteriores a esses contratos existirem.

O isolamento é do Core, não deste tipo: um plugin que lança uma exceção ao se registrar é relatado pelo nome e pulado, e todo outro slot e plugin ainda se registram.

SheetForgeActions — semântica de conclusão. RunImport/RunPush são fire-and-forget. Seus corpos são async void, porque a thread principal do editor não pode bloquear em IO de rede, então o retorno não é a conclusão — inscreva-se em ImportEvents.ImportCompleted para isso. RunExport/RunHealthCheck/RunLocalizationSync se completam de forma síncrona — RunLocalizationSync percorre o caminho planilha → StringTable que uma conclusão de importação percorre, e sem o pacote Unity Localization ele mostra o aviso de instalação e não muda nada.

Costura de provedor de origem (SheetForge.Editor.Sources)

TipoPapel e membros principais
ISheetSourceProviderO contrato do provedor. Id · DisplayNameKey · CreateTabSource(settings) · GetVisibility(settings) · CanAuthor(settings) · CreateReflectTarget(dispatcher, settings)
ISourceReflectTargetAlvo de gravação de volta. void Reflect()
SourceVisibilityQuais campos de configuração mostrar — 5 flags booleanas
SourceProviderRegistry (static)Descoberta/resolução. All · ResolveActive(SheetForgeSettings) e ResolveActive(string providerId) (resolve diretamente a partir de um id, sem ter um asset de configurações em mãos) · TryGet · InvalidateCache
ITabSourceAbstração de busca. Description · Task<TabSourceResult> FetchAsync()
TabSourceResultAbas (nome → TSV bruto) + diagnósticos + formatos por aba; saída parcial permitida. Create estático
TabSourceFormat (enum)Tsv · Csv · Xlsx · GoogleSheet

Pontos de extensão do Data Studio (SheetForge.Editor.Studio)

Do lado do Editor porque devolvem UIElements ou tocam estado de janela — a mesma assimetria justificada de ISheetSourceProvider. Os quatro contratos são descobertos pelo TypeCache (construtor sem parâmetros; sem chamada de registro), e todos são chamados dentro de try/catch. A própria janela (DataStudioWindow) é internal.

Qualquer coisa expressável como dado pertence ao vocabulário Core ISheetForgeStudioPlugin em vez disso, que também renderiza no navegador. Estas são as válvulas de escape sem teto para o que a descrição não consegue dizer.

As últimas quatro entradas não são contratos, mas ferramentas que um widget montado pode usar:

  • os próprios valores de skin somente leitura da janela, para que ele possa parecer que pertence a ela;
  • o dropdown de chave, para que um widget de célula escolha chaves da mesma forma que a célula embutida faz;
  • e o reset do cache de descoberta, para que os seus próprios testes possam redescobrir uma sonda.
TipoCategoriaPapel e membros principais
IStudioGraphWidgetinterfaceUma faixa de domínio acima do canvas de grafo (o Core não distribui nenhuma). bool AppliesTo(StudioGraphContext) · VisualElement Create(StudioGraphContext) (recriado a cada reconstrução do grafo — não guarde estado; null não adiciona nada)
StudioGraphContextsealed classSomente leitura: Tab e FocusRecordId (o terminus) · SheetRecord FocusRecord (null quando não resolvido) · Tables · ReferenceIndex References · CodeRegistries. Dois eixos aposentados permanecem por compatibilidade de assinatura e são marcados [Obsolete]: ShapeId (sempre "record") e ModeId (sempre vazio). Comparar qualquer um dos dois compila e nunca é verdadeiro, então o compilador agora avisa isso, em vez de deixar um ramo morto — exclua a checagem. Sem superfície de preparação — widgets são somente exibição (ctor internal: a janela o monta)
IStudioCellEditorProviderinterfaceDesenha uma célula de grade para um tipo nomeado. string TypeName (corresponde a um tipo do CellParserRegistry ou nome de wrapper, Ordinal; vazio remove) · VisualElement CreateEditor(StudioCellEditorContext) — retornar null recusa aquela célula, e o widget embutido assume. Uma reivindicação duplicada no mesmo nome de tipo avisa e mantém a primeira encontrada
StudioCellEditorContextsealed classO que o widget de célula recebe: Tab · FieldName · TypeToken Type · CurrentRawText (texto canônico com a preparação aplicada) · Action<string> Commit (um ato único — seu próprio passo de undo) · Action<string> CommitTyping (uma sequência de teclas — coalescida por célula) · Func<string,IReadOnlyList<string>> ReferenceKeys (as mesmas chaves candidatas que o seletor embutido oferece). Os dois commits passam pelo portão de preparação da janela (ctor internal: a janela o monta)
IStudioInspectorActioninterfaceUm botão extra no inspector de nó. string LabelKey (chave Loc; não registrada = mostrada ao pé da letra, vazia = nome do tipo) · bool AppliesTo(StudioInspectorContext) · void Execute(StudioInspectorContext)
StudioInspectorContextsealed classLeitura: Tab · RecordId · SheetRecord Record · Tables · References · CodeRegistries. Mutação mediada: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells, ambos detalhados abaixo da tabela. Serviços: Action<string,int,string> FocusCell · Action RequestRebuild. A AuthoringSession deliberadamente não é exposta
IStudioPanelProviderinterfaceUm painel UIToolkit arbitrário no painel à direita do Studio — a válvula de escape ao lado do StudioPanelDescriptor descritivo. string Id · string TitleKey · bool AppliesTo(StudioSurfaceContext) · VisualElement CreatePanel(StudioSurfaceContext) (null não desenha nada neste tick). Registre um painel descritivo sob o mesmo Id e cada host usa o que consegue desenhar: o editor prefere este, o navegador desenha o descritivo — então "até onde o navegador vai, o editor vai até o fim" não precisa de um segundo contrato. O elemento vive um tick de recomputação, então não guarda estado
StudioPalettestatic classValores de cor, espaçamento e tipo somente leitura, com os quais a própria janela pinta, para que um widget que você monta combine com a janela, em vez de codificar hex fixo. Cada slot resolve no momento da leitura, então widgets seguem o modo de brilho e a predefinição de cor de graça. Escolher os valores (predefinições, brilho, padrões) permanece internal — widgets seguem a paleta, eles não a repintam. A lista de membros está abaixo da tabela
StudioThemestatic classApenas quatro membros: CategoryColor(category) (o mesmo tom determinístico que a janela dá àquela categoria) · Np(text) (interpolação segura em um rótulo rich-text) · Mono / ApplyMono(element) (a política de fonte mono: somente chaves, endereços e números — fontes mono não têm glifos CJK). Tudo o mais neste tipo é internal
StudioKeyPickerstatic classUm membro: Show(Rect screenAnchor, string targetTab, IReadOnlyList<string> candidates, Action<string> picked, string acceptsLabel = null) — o mesmo dropdown que a célula de referência embutida abre, para um widget de célula que precisa alcançar uma chave dentro da sua própria notação. Ele escolhe uma chave entre os candidatos que você fornece e a devolve; criar um registro, deixar a célula vazia, alternar múltiplos itens de uma lista e perguntar qual porta recebe a escolha são regras próprias da célula de referência embutida, então não estão nesta fachada. picked é obrigatório (ArgumentNullException antes de qualquer janela ser criada); sem candidatos e nada a oferecer, ele registra em log em vez de abrir uma lista vazia. O próprio tipo da janela permanece internal
StudioPluginRegistrystatic classUm membro público: InvalidateCache() — descarta o cache de descoberta por reload, para que uma sonda que os seus próprios testes acabaram de habilitar seja encontrada de novo (a mesma cortesia que PluginRegistry e SourceProviderRegistry já ofereciam; este era o registry que faltava). As listas descobertas permanecem internal: nada de fora consegue ler ou substituir o que a janela vai montar

StudioInspectorContext — os dois delegates de preparação:

  • StageCell recebe aba, recordId, campo e texto bruto canônico. A janela registra o passo de Undo, incrementa a geração da projeção e prepara o endereço lógico.
  • StageCells faz o mesmo para várias células que precisam mudar juntas: um único passo de Undo nativo, tudo ou nada. Se uma sequer não puder ser preparada, a sessão não é tocada em nada.

Uma falha é silenciosa em tela de qualquer forma, e somente o portão se explica. Uma origem somente leitura, um pipeline já em execução, ou uma aba baseada em workbook escreve o seu motivo no console. Uma lista vazia, uma gravação sem a sua aba ou campo, e uma chave de registro que não resolve para nenhuma linha não fazem nada e não dizem nada.

StudioPalette — os membros:

  • 33 slots de cor: Canvas · Panel · Band · Chrome · Surface · Chip · Selection · PendingCell · Line · LineSoft · GridLine · LineHover · Text · TextMuted · TextFaint · RefText · OnAccent · Accent · AccentDim · Warning · Danger · Ok · SheetTone · CodeTone · EditedCell · NewRowCell · NewRowLine · DangerChip · DangerPanel · Scrim · Wire · WireDot · GridDot.
  • IsDark.
  • Espaçamento: SectionSpace · RowSpace · RuleHeight · ButtonHeight · PrimaryButtonHeight · GlyphWidth.
  • Tamanhos de tipo: HeadingFontSize · SectionFontSize · CaptionFontSize.
  • FromRgb(uint) · ToHex(uint).

Aprovação de Push (SheetForge.Editor.Push)

TipoPapel
IPushApproverbool Approve(PushPlan, string humanSummary) · bool ApproveStructureRewrite(string, bool hasLiveConflicts) — rejeitar = zero envios
AutoPushApproverSempre aprova (para testes/automação)

Motor de autoria (SheetForge.Editor.Structure / .Pipeline / .Export)

TipoPapel e membros principais
AuthoringSessionDona do estado de preparação (serializável — Undo grátis + sobrevivência ao reload). Edits · IsolatedEdits · NewRows · StructOps · Reorders · TabRenames · EnumMembers (adições de membro de planilha de enum preparadas) · AssetRegistrations (registros do Addressables preparados — em nível de projeto, então eles não participam dos portões por aba, mas contam para a entrada no reflect, para o descarte e para o resumo do diff) · HasAssetRegistrations · StageAssetRegistration(r) (o mesmo guid, ou o mesmo grupo para uma criação de grupo, substitui no lugar — a última intenção vence; um registro sem identidade é recusado) · RemoveAssetRegistrationsWhere(predicate) · SetStaged · ResolveBaselineEdits · RemapFieldName/RecordId/Tab · StageTabRename · EffectiveStructOps · PendingStructCount · TabNames · TryGetBaselineTable · LastProjectionResult · ClearAll (limpa os registros também)
AuthoringDispatcherO orquestrador do reflect. ctor (session, callbacks, baselines) · Reflect() · BuildProjectionResult() (consulta de projeção livre de efeito colateral) · IReadOnlyDictionary<string,string> BuildProjectedTabs() (a mesma projeção como TSV por aba — o que um alvo de gravação de volta está prestes a enviar, pré-visualizável sem gravar) · void FinalizeReflectSuccess(IReadOnlyList<string> writtenTabs, IReadOnlyList<TabRenameEntry> committedRenames = null) (o final que a própria gravação de volta de uma origem precisa alcançar: poda de retenção para as abas que gravou, o limite ClearUndo, e a reimportação automática — os caminhos embutidos rodam o mesmo corpo privado, então um provedor externo termina exatamente da mesma forma que eles; uma lista vazia é um no-op que mantém a preparação intacta) · Session · Callbacks · Baselines
AuthoringDispatchCallbacks13 delegates gerais de preocupação de visualização + IPushApproverResolveSettings · RenderReport (Action<ImportReport>, tolerante a null) · TriggerReimport · ConfirmKeyRenames · ConfirmTabRenames (tolerante a null) · ClearUndo · Rebuild · … Os delegates de diálogo embutidos Local/Google vivem no pacote opcional BuiltInSourceDialogs
BuiltInSourceDialogsPacote opcional de 14 delegates de diálogo embutidos das origens Local/Google, separado de AuthoringDispatchCallbacks — provedores externos nunca precisam deles. NotifyLocalDone recebe cinco argumentos; o último é a linha de resumo de registro do Addressables para o diálogo de conclusão (null quando nada foi preparado)
BaselineStore (.Export)Snapshots de baseline em TSV normalizado, por aba

Tipos de valor de preparação (SheetForge.Editor.Structure; StagedCellEdit/StagedNewRow estão em SheetForge.Editor.Windows)

TipoPapel
StagedCellEdit (struct)Uma edição preparada — TabName · RowOrdinal · FieldName · RawText · RecordId (chave lógica)
StagedNewRowUma nova linha preparada — TabName · FieldNames · CellTexts
StructureOpUma operação de estrutura — Kind · coordenadas · textos · permutação Order
StructureOpKind (enum)AddColumn · RemoveColumn · AddMarker · RemoveMarker · RemoveDataRow · ReorderColumns · ReorderDataRows · RenameColumn · EditColumnType · EditColumnDesc · SetColumnOverlap · SetSheetStyle
TabReorderEntryEstado de reordenação por aba — Tab · ColOrder · RowOrder
TabRenameEntry (struct)OldName · NewName
StagedEnumMember (struct)Um "adicionar este membro a este enum" preparado — TabName (qual planilha de enum; vazio = procurar em todas) · EnumName · Member. Em nível de sessão, e não um StructureOp, pelo mesmo motivo que uma renomeação de aba é: uma planilha de enum não tem tabela, esquema nem coluna-chave, então o endereço (aba, registro, campo) de uma edição de célula não consegue nomear "o próximo membro deste enum". Público apenas porque AuthoringSession.EnumMembers é (CS0050)
StagedAssetRegistration (struct)Uma alteração preparada nas configurações do Addressables do projeto, feita ao soltar ou escolher um asset em uma célula AssetRef@GroupStagedAssetRegistrationKind Kind · Guid (o asset; um sub-asset prepara o seu pai) · Group · FromGroup (somente movimentações) · Address (o nome do arquivo sem a extensão para uma entrada nova; um asset já registrado mantém o seu endereço) · AssetPath (para exibição). Fábricas Add(guid, group, address, assetPath) · Move(guid, fromGroup, group, address, assetPath) · CreateGroup(group). Executado depois que a gravação da planilha for bem-sucedida, e então limpo. Público apenas porque AuthoringSession.AssetRegistrations é (CS0050), como StagedEnumMember
StagedAssetRegistrationKind (enum)Add · Move · CreateGroup
TabBaselineAnchor (struct)TabName · Fingerprint · RecordCount
IsolatedEditUma edição que falhou ao reancorar — Edit · Reason
IsolationReason (enum)Renomeação externa / exclusão externa / conflito de chave

Auxiliares de autoria (SheetForge.Editor.Windows / .Structure)

TipoPapel
KeyRenamePlanner (static)Planejamento de renomeação de chave + propagação entre abas. Plan(…) · KeyRenamePlan aninhado · struct irmã KeyRename
RecordIdMinter (static, puro)Sugestões de id. Suggest · DetectCommonPrefix · Uniquify · StagedNewRowKeys
IntIdMinter (static, puro)Sugestão do próximo IntId para um novo registro — Suggest(existingIds)max + 1. Um eixo separado de RecordIdMinter, e nunca reutiliza uma lacuna excluída
ProjectionErrorMapper (static, puro)Coordenada de erro → endereço lógico. TryMap(…) · LogicalAddress aninhado
EphemeralSoApply (static)Sobreposição de valor preparado no SO (temporária). Apply(…) · InvalidateIndex(…) · Report / SkipReason / SkippedEdit aninhados

Assembly Runtime (SheetForge.Runtime)

autoReferenced — utilizável a partir do código do jogo sem uma referência de asmdef.

TipoPapel e membros principais
SheetForgeDatabases (static)O carregador de runtime — o caminho de carregamento sancionado. const AddressPrefix = "SheetForge/" · AddressFor(tab) · LoadAsync(tab) · LoadAsync<TDatabase>(tab) · Release(handle) / Release<TDatabase>(db). Os auxiliares de endereço são strings simples e sempre compilam; LoadAsync e Release só existem sob SHEETFORGE_ADDRESSABLES, a version-define definida quando o com.unity.addressables está instalado — o que é o que permite o produto compilar sem o pacote
DefinitionDatabase (SO abstrato)Base de todo Database gerado por aba. abstract TabName · abstract Count · virtual IReadOnlyList<object> RecordsUntyped · virtual InvalidateIndex(). RecordsUntyped é a forma sancionada de enumerar uma aba cozida (bake) sem conhecer o seu tipo gerado — um segundo baker ou um inspector que percorre todas as abas antes precisava usar reflection sobre o campo privado records, o que transformava um nome de campo em um contrato não declarado que quebraria silenciosamente no dia em que o codegen o renomeasse. Trate a lista como somente leitura (a planilha é canônica). O padrão é vazio, então código gerado de antes deste membro existir continua compilando e rodando; uma reimportação emite a sobrescrita
RecordRef (struct)O valor de referência serializado dentro de SOs do bake (id em string, resolvido na consulta). Id · IsEmpty
IntRef (struct)O valor de referência serializado de chave inteira dentro de SOs do bake — o gêmeo de RecordRef para campos IntId@Tab. Como 0 é um id válido, um bit hasValue sustenta IsEmpty. Id · IsEmpty. O codegen emite um campo IntId@Tab como IntRef, e TryGet(IntRef) no Database gerado o consome
LocRef (struct)A referência de localização serializada dentro de SOs do bake — uma célula LocRef@Tab. Table (a aba de localização, que é o nome da coleção StringTable) · Key · long KeyId (0 significa "ainda não resolvido": uma importação faz o bake de 0 e a ponte preenche o id real depois de uma sincronização de tabelas, então uma referência sobrevive à renomeação de uma chave) · IsEmpty. Ela sempre compila — código gerado e assets do bake nunca contêm um tipo do pacote de localização, e é isso o que mantém o pacote opcional
LocRefExtensions (static)Um único membro: LocalizedString ToLocalizedString(this LocRef) — ele aponta por KeyId quando este não é 0, e pelo nome da chave caso contrário, e uma referência vazia se converte em um LocalizedString vazio. Ele só existe quando o com.unity.localization está instalado, sob a version-define SHEETFORGE_LOCALIZATION — o mesmo arranjo que o SHEETFORGE_ADDRESSABLES usa para a camada do Addressables
SheetForgeRuntimeInfo (static)const Version

Tipos gerados (padrão — por projeto, não é API distribuída)

Para cada aba Foo, o codegen emite no seu generatedNamespace:

public sealed partial class FooDefinition    // one strongly-typed field per column; @desc → doc/tooltip
public sealed partial class FooDatabase : DefinitionDatabase
{
    // TabName, Count, SchemaFingerprint, Records, RecordsUntyped override,
    // lazy _byId/_byIntId lookups, InvalidateIndex override
}

Carregue com SheetForgeDatabases.LoadAsync<FooDatabase>("Foo").

As duas classes são emitidas como partial, então você pode adicionar membros derivados — uma propriedade computada, uma implementação de interface, um operador — no seu próprio arquivo ao lado do gerado, e uma reimportação não vai sobrescrevê-lo.

Um limite: não adicione campos serializados na sua parte. O ScriptableObject cozido (bake) é reconstruído a partir da planilha a cada importação, então qualquer coisa que só a sua parte serializa volta ao seu padrão. Se um valor pertence aos dados, ele pertence a uma coluna.

(A palavra-chave partial não toca no SchemaFingerprint, que é computado somente a partir do esquema, então tornar as classes partial não invalidou um único bake existente.)


Outros assemblies

  • SheetForge.Setup — o bootstrap sem dependências para a ausência do Addressables. Nenhuma API pública (tudo internal; ele existe para mostrar uma janela de orientação).

  • SheetForge.PluginDemo (um asmdef mesclado + um asmdef Demo.Editor; o namespace do conteúdo permanece SheetForge.Skills) — o pacote de exemplo de referência, não é API do produto. Contém:

    • SkillsPlugin (sete interfaces de plugin — base, validador, aresta, template, grafo, registro de código, tema);
    • Modifier + ModifierCellParser (tipo de célula personalizado), ModifierStatEdgeContributor (contribuidor de aresta);
    • ExamplePipelineAugmenter / ExampleReactiveAugmenter (sobreposições de canvas), ExampleCodeAtoms (o registro de código _Refs);
    • ExampleStudioUi (ações declarativas, painel, selo de coluna e hint de editor de célula), ExampleImportObserver (observador de pipeline);
    • ExampleStageStripWidget / ExampleInspectorAction / ExampleStudioPanel (pontos de extensão Editor do Data Studio, pintados a partir da paleta pública), ExampleLocStrings (registra esses rótulos em dois idiomas — no assembly principal, para que o navegador também os mostre);
    • uma declaração SheetForgePluginCompat em nível de assembly;
    • SkillRunner (consumo em runtime), tipos Example* gerados no namespace padrão SheetForge.Generated (o isolamento é feito pelo prefixo Example*, não por um namespace separado).

    O exemplo sem plugin SheetForge.CoreDemo é distribuído com zero asmdefs (compila dentro de Assembly-CSharp).

Páginas relacionadas