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
SHEETFORGEque 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 deSHEETFORGE_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)
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
ISheetForgePlugin | interface | O contrato base de plugin de domínio. string Name · RegisterEnums(EnumRegistry) · RegisterCellParsers(CellParserRegistry) |
ISheetForgeValidatorPlugin | interface | Complemento opcional para regras de validação. RegisterValidators(DomainValidatorRegistry) |
ISheetForgeEdgePlugin | interface | Complemento opcional para declarações de aresta. RegisterEdgeContributors(EdgeContributorRegistry) |
ISheetForgeMarkerPlugin | interface | Complemento opcional para marcadores estruturais personalizados. RegisterStructuralMarkers(MarkerRegistry) |
ISheetForgeTemplatePlugin | interface | Complemento opcional para templates de "Criar planilha". RegisterTemplates(TemplateRegistry) |
ISheetForgeGraphPlugin | interface | Complemento opcional que registra sobreposições de canvas do Data Studio por aba. RegisterGraphShapes(GraphShapeRegistry) |
ISheetForgeCodeRegistryPlugin | interface | Complemento opcional para alvos de referência que pertencem ao código (abas virtuais travadas). RegisterCodeRegistries(CodeRegistryCatalog) |
ISheetForgeThemePlugin | interface | Complemento opcional para predefinições de cor das janelas. RegisterThemes(ThemeRegistry) |
ISheetForgeStudioPlugin | interface | Complemento 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 |
ISheetForgeStringsPlugin | interface | Complemento 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 |
ISheetForgePipelinePlugin | interface | Complemento 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.
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
PluginComposition | static class | O ú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 |
PluginSet | sealed class | O 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 |
SheetForgePluginCompatAttribute | sealed 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 |
SheetForgePluginFormat | static class | As 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)
| Tipo | Papel e membros principais |
|---|---|
EnumRegistry | Nome 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 |
CellParserRegistry | Nome 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) |
DomainValidatorRegistry | Lista de validadores somente-anexação, ordem preservada. Register(IDomainValidator) · Validators |
EdgeContributorRegistry | Lista de contribuidores somente-anexação, ordem preservada. Register(IEdgeContributor) · Contributors |
MarkerRegistry | Nome 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 |
TemplateRegistry | Chave 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)
| Tipo | Papel e membros principais |
|---|---|
DataTemplate | Um template registrado por um plugin: string Key (identidade no registry) · string DisplayName (texto de propriedade do plugin) · IReadOnlyList<DataTemplateTab> Tabs (uma ou mais) |
DataTemplateTab | Uma 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)
| Tipo | Papel e membros principais |
|---|---|
ICellValueParser | Faz 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) |
ICustomCellType | Auxiliar opcional de codegen/round-trip. Type ValueType · bool TryRender(object, out string text, out string reason) |
IReferencingCellType | Capacidade 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 |
IRefBearingValue | A 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 |
ICellWrapperType | Uma 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) |
WrapperValue | O 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 |
IStructuralMarkerDefinition | Uma linha @marker personalizada (valores por coluna, validados coluna por coluna — generaliza @overlap). string MarkerName (sem @) · string Description · void ValidateCell(MarkerCellContext) |
MarkerCellContext | Uma 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) |
CellParseContext | O 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.
| Tipo | Espécie | Papel |
|---|---|---|
SheetSyntax | classe estática | A 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 emRecordId@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. BuiltinScalarTypeseIsBuiltinScalarTypeName(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 debool.NumberCellStyles— oNumberStylescom 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)
| Tipo | Papel e membros principais |
|---|---|
IDomainValidator | Regra entre colunas/entre abas. Violações → ctx.Errors como DomainRuleViolation com os 4 elementos. string Name · Validate(DomainValidationContext) |
DomainValidationContext | Tables (aba → SheetTable) · KeyIndices · AssetKeys (null = ignorado) · Errors |
Costura de aresta (SheetForge.Core.Validation / .Edges)
| Tipo | Papel 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 |
IEdgeContributor | Declara arestas que o scanner não consegue ver. Sem diagnósticos. string Name · ContributeEdges(EdgeContributionContext, ICollection<EdgeSpec>) |
EdgeSpec | Uma aresta — FromTab/FromRecordId/ToTab/ToRecordId (+ opcional FieldName, PayloadTab/PayloadRecordId para arestas de registro, Label) |
EdgeContributionContext | Tables + KeyIndices somente leitura (sem coletor de erro — arestas não são validação) |
IAuthorableEdgeContributor | Capacidade 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 |
IEdgeTokenEditor | Capacidade 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 |
EdgeTokenDescription | O 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 |
IBatchAuthorableEdgeContributor | Capacidade 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 |
IVirtualNodeFactory | Capacidade 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 |
IEdgeSlotDeclarer | Capacidade 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 |
EdgeAuthoringContext | A 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 paraRecordId@Tab, paraIntId@Tab(o espaço de chave inteira), para o interior de um wrapper, e para um tipo personalizado marcado comIsCustomReference. É por isso que um único opt-in — e, paraIntId@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).
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
RecordEdge (struct) | valor | Uma 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) |
ReferenceIndex | sealed class | O 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.
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
IRecordCanvasAugmenter | interface | A 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 |
CanvasAugmentBuilder | sealed class | A superfície de gravação, apenas quatro coisas — membros e regras abaixo da tabela |
GraphShapeRegistry | sealed class | Nome da aba → sobreposição de canvas. Register(tabName, IRecordCanvasAugmenter) (aba duplicada / nome vazio / null lança exceção) · TryGet · IsEmpty |
GraphBuildContext | sealed class | A 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 |
GraphSpecBuilder | sealed class | O 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) |
GraphSpec | sealed class | O resultado montado que o canvas desenha — Nodes · Wires (a montagem passa pelo builder; o ctor é internal) |
GraphNodeSpec | sealed class | Um 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 |
GraphWireSpec | sealed class | Um 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 |
IAuthorableGraphShape | interface | Capacidade 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. NomearfieldNamediz em qual célula o vínculo está escrito,fieldOnTargetdiz 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)
| Tipo | Papel e membros principais |
|---|---|
ThemeRegistry | Id 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 |
SheetForgeTheme | Uma predefinição de cor. Id · DisplayName · DarkColors / LightColors (IReadOnlyDictionary<ThemeColorSlot, uint>, copiado na construção) · TryGetColor(dark, slot, out rgb) · IsEmpty |
ThemeColorSlot | enum — 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.
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
StudioUiRegistry | sealed class | O que RegisterStudioUi preenche. AddAction(StudioActionDescriptor) · AddPanel(StudioPanelDescriptor) · AddColumnBadge(StudioColumnBadgeDescriptor) · AddCellEditorHint(StudioCellEditorHint) · Actions / Panels / ColumnBadges / CellEditorHints · IsEmpty |
StudioUiNode | sealed class | Um 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 |
StudioUiNodeKind | enum | Os 13 tipos acima (Row … Link) |
StudioActionDescriptor | sealed class | Um 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 |
StudioActionPlacement | enum | Inspector · 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ó |
StudioPanelDescriptor | sealed class | Um 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 |
StudioColumnBadgeDescriptor | sealed class | Um selo ao lado de um cabeçalho de coluna. Func<StudioSurfaceContext,string,string,StudioUiNode> Provide (contexto, aba, campo) — null significa nada naquela coluna |
StudioCellEditorHint | sealed 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 |
StudioCellEditorArchetype | enum | Dropdown · 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 |
BuiltinCellEditorHints | static class | Os três hints que o próprio Core declara — Color → ColorPicker, AnimationCurve → CurveEditor, Gradient → GradientEditor — 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 |
StudioCellOption | sealed class | Um candidato de dropdown — Value (o texto canônico gravado na célula) · Label (o que uma pessoa lê; padrão = Value) |
StudioSurfaceContext | sealed class | A ú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, maisWithTooltip(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)— apenashttp/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)
| Tipo | Papel e membros principais |
|---|---|
StringOverlayRegistry | Coletor 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)
| Tipo | Papel e membros principais |
|---|---|
IPipelineObserver | Notificaçã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 |
PipelineObserverRegistry | Lista de observadores somente-anexação, ordem preservada. Register(IPipelineObserver) · Observers |
PipelineRunView | O 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.
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
CodeRegistryCatalog | sealed class | Raiz de registro. Register(CodeRegistrySource) (null / nome de aba vazio / nome de aba duplicado lança exceção) · TryGet(tabName, out source) · Sources · IsEmpty |
CodeRegistrySource | sealed class | Uma aba virtual travada. string TabName · IReadOnlyList<CodeRegistryEntry> Entries (ordem de registro = ordem de exibição) |
CodeRegistryEntry | sealed class | Uma 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)
| Tipo | Papel e membros principais |
|---|---|
SheetTable | A saída de parsing de uma aba. SheetSchema Schema · IReadOnlyList<SheetRecord> Records |
SheetSchema | string 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) |
SheetStyle | O 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) |
SheetRecord | int RowNumber (original, baseado em 1) · Values (campo → CellValue) · TryGet · indexador |
FieldSchema | Name · TypeToken Type · Description · ColumnNumber · DefaultValue · AllowOverlap · IReadOnlyDictionary<string,string> MarkerValues (nome do marcador personalizado → texto da célula desta coluna) |
TypeToken | Cé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.
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
IAssetTypeResolver | interface | AssetTypeResolution 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) |
AssetTypeResolution | sealed class | O 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) |
AssetTypeResolutionStatus | enum | Resolved · 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.
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
ColorValue | readonly struct | Quatro 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) |
CurveValue | sealed class | Keys (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) |
CurveKey | readonly struct | Time · Value · InTangent · OutTangent · InWeight · OutWeight · CurveWeightedMode WeightedMode · CurveTangentMode LeftMode / RightMode · bool Broken; um construtor de dez argumentos, sem normalização própria |
CurveWrap | enum | ClampForever · Loop · PingPong · Default — o vocabulário de wrap da Unity por nome (o mapeamento do valor para WrapMode pertence ao baker) |
CurveTangentMode | enum | Free = 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] enum | None = 0 · In = 1 · Out = 2 · Both = 3 — qual lado de uma chave usa tangentes ponderadas (Bezier) |
CurveTangentSolver | static class | CurveKey[] 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 |
CurveEvaluator | static class | float 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 |
GradientValue | sealed class | ColorKeys · 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 ` |
GradientColorKey | readonly struct | ColorValue Color (alfa ignorado — o alfa tem as suas próprias chaves) · float Time |
GradientAlphaKey | readonly struct | float Alpha · float Time |
GradientBlend | enum | Blend · Fixed · PerceptualBlend |
GradientColorSpace | enum | Uninitialized (não gravado; lido como Gamma) · Gamma · Linear — apenas PerceptualBlend é afetado |
GradientEvaluator | static class | ColorValue 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)
| Tipo | Papel e membros principais |
|---|---|
ImportError | Erro 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 |
ErrorCollector | Coletor de "colete tudo". All · HasErrors · ErrorCount · Add |
ImportResult | Saí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, maisPluginIncompatiblequando a declaração de compatibilidade de um assembly cai fora do que este host lê; - IntId —
DuplicateIntId, e para referênciasIntId@Tab,UnresolvedIntId·TargetTabHasNoIntId; @overlapeDomainRuleViolation;- 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),AssetTypeMismatchpor célula, e o aviso de codegenAssetTypeUnresolvedFallback.
Índices e utilitários (SheetForge.Core.Validation / .Model / .Parsing / .Unparse)
| Tipo | Papel e membros principais |
|---|---|
TabKeyIndex | Informaçã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 |
AssetKeyIndex | Grupo → 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.
| Tipo | Papel |
|---|---|
PushPlan (assembly SheetForge.Core.Tooling, assim como as três linhas abaixo) | O plano de envio inteiro. Tabs · HasWork |
PushTabPlan | Uma aba: Writes · Appends · Deletes (chave + número da linha; DeleteNotices continua sendo a visão somente de chave) |
PlannedCellWrite | Uma gravação de célula — coordenadas, célula do baseline, novo valor/texto, flag de família de string |
PlannedRowAppend | Uma 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)
| Tipo | Papel 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)
| Tipo | Papel e membros principais |
|---|---|
ISheetSourceProvider | O contrato do provedor. Id · DisplayNameKey · CreateTabSource(settings) · GetVisibility(settings) · CanAuthor(settings) · CreateReflectTarget(dispatcher, settings) |
ISourceReflectTarget | Alvo de gravação de volta. void Reflect() |
SourceVisibility | Quais 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 |
ITabSource | Abstração de busca. Description · Task<TabSourceResult> FetchAsync() |
TabSourceResult | Abas (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.
| Tipo | Categoria | Papel e membros principais |
|---|---|---|
IStudioGraphWidget | interface | Uma 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) |
StudioGraphContext | sealed class | Somente 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) |
IStudioCellEditorProvider | interface | Desenha 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 |
StudioCellEditorContext | sealed class | O 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) |
IStudioInspectorAction | interface | Um 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) |
StudioInspectorContext | sealed class | Leitura: 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 |
IStudioPanelProvider | interface | Um 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 |
StudioPalette | static class | Valores 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 |
StudioTheme | static class | Apenas 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 |
StudioKeyPicker | static class | Um 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 |
StudioPluginRegistry | static class | Um 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)
| Tipo | Papel |
|---|---|
IPushApprover | bool Approve(PushPlan, string humanSummary) · bool ApproveStructureRewrite(string, bool hasLiveConflicts) — rejeitar = zero envios |
AutoPushApprover | Sempre aprova (para testes/automação) |
Motor de autoria (SheetForge.Editor.Structure / .Pipeline / .Export)
| Tipo | Papel e membros principais |
|---|---|
AuthoringSession | Dona 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) |
AuthoringDispatcher | O 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 |
AuthoringDispatchCallbacks | 13 delegates gerais de preocupação de visualização + IPushApprover — ResolveSettings · 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 |
BuiltInSourceDialogs | Pacote 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)
| Tipo | Papel |
|---|---|
StagedCellEdit (struct) | Uma edição preparada — TabName · RowOrdinal · FieldName · RawText · RecordId (chave lógica) |
StagedNewRow | Uma nova linha preparada — TabName · FieldNames · CellTexts |
StructureOp | Uma operação de estrutura — Kind · coordenadas · textos · permutação Order |
StructureOpKind (enum) | AddColumn · RemoveColumn · AddMarker · RemoveMarker · RemoveDataRow · ReorderColumns · ReorderDataRows · RenameColumn · EditColumnType · EditColumnDesc · SetColumnOverlap · SetSheetStyle |
TabReorderEntry | Estado 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@Group — StagedAssetRegistrationKind 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 |
IsolatedEdit | Uma 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)
| Tipo | Papel |
|---|---|
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.
| Tipo | Papel 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 permaneceSheetForge.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
SheetForgePluginCompatem nível de assembly; SkillRunner(consumo em runtime), tiposExample*gerados no namespace padrãoSheetForge.Generated(o isolamento é feito pelo prefixoExample*, não por um namespace separado).
O exemplo sem plugin
SheetForge.CoreDemoé distribuído com zero asmdefs (compila dentro deAssembly-CSharp).
Páginas relacionadas
- Autoria de Plugins — os contratos em uso, com exemplos completos
- Kernel de Autoria — os tipos do motor em contexto
- Capacidades e Limites — os limites comportamentais dessas APIs