Referencia de la API — La superficie pública
Esta página enumera todos los tipos públicos de los ensamblados del producto. Cualquier cosa que no aparezca aquí es internal por diseño; la superficie pública es deliberadamente estrecha.
- Core (
SheetForge.Core+SheetForge.Core.Tooling): 137 tipos públicos (Core: 131, Core.Tooling: 6). Core.Tooling es la mitad exclusiva del editor que contiene servicios en tiempo de importación como el reporting y la planificación de Push — nada de ella se distribuye en las builds del jugador. - Editor: 53 tipos públicos de nivel superior más sus tipos anidados públicos.
- Runtime: 7 tipos, más las salidas generadas.
Esta es exactamente la superficie contra la que compilan las pruebas de simulación de consumidor (sin InternalsVisibleTo).
Contrato de detección (no es un tipo): un asset independiente también puede detectar que SheetForge está instalado en tiempo de compilación mediante el símbolo de definición de scripting
SHEETFORGEque autorregistra el ensamblado Editor. Es un define, no un tipo público, así que no aparece en las tablas de abajo — consulta Creación de plugins ▸ Detectar SheetForge desde otro asset. (Distinto deSHEETFORGE_ADDRESSABLES, un version-define interno que solo indica si el paquete Addressables está presente.)
Convenciones: las firmas están abreviadas (… = consulta los documentos XML del código fuente); "puro" significa sin UnityEngine / sin E/S.
Ensamblado Core (SheetForge.Core) — C# puro
Sin UnityEngine, sin E/S, sin red, sin conocimiento de dominio. Impuesto por el compilador: Core no hace referencia a nada.
Contratos de registro de plugin (SheetForge.Core.Plugins)
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
ISheetForgePlugin | interface | El contrato base de plugin de dominio. string Name · RegisterEnums(EnumRegistry) · RegisterCellParsers(CellParserRegistry) |
ISheetForgeValidatorPlugin | interface | Complemento opcional para reglas de validación. RegisterValidators(DomainValidatorRegistry) |
ISheetForgeEdgePlugin | interface | Complemento opcional para declaraciones de aristas. RegisterEdgeContributors(EdgeContributorRegistry) |
ISheetForgeMarkerPlugin | interface | Complemento opcional para marcadores estructurales personalizados. RegisterStructuralMarkers(MarkerRegistry) |
ISheetForgeTemplatePlugin | interface | Complemento opcional para plantillas de "Crear hoja". RegisterTemplates(TemplateRegistry) |
ISheetForgeGraphPlugin | interface | Complemento opcional que registra overrides de lienzo de Data Studio por pestaña. RegisterGraphShapes(GraphShapeRegistry) |
ISheetForgeCodeRegistryPlugin | interface | Complemento opcional para destinos de referencia propiedad del código (pestañas virtuales bloqueadas). RegisterCodeRegistries(CodeRegistryCatalog) |
ISheetForgeThemePlugin | interface | Complemento opcional para preajustes de color de ventana. RegisterThemes(ThemeRegistry) |
ISheetForgeStudioPlugin | interface | Complemento opcional para superficies de creación declarativas (acciones, paneles, insignias de columna, pistas de editor de celda). RegisterStudioUi(StudioUiRegistry). En Core en lugar de Editor, así que un solo registro se renderiza tanto en el editor de UIToolkit como en el navegador |
ISheetForgeStringsPlugin | interface | Complemento opcional que registra las propias cadenas de UI del paquete por idioma. RegisterStrings(StringOverlayRegistry). Reemplaza el par ISheetForgeLocPlugin / PluginLocRegistry del lado del Editor, ya retirado, que solo podía llegar al editor |
ISheetForgePipelinePlugin | interface | Complemento opcional que registra observadores de canalización. RegisterPipelineObservers(PipelineObserverRegistry) |
Composición y compatibilidad (SheetForge.Core.Plugins)
El descubrimiento es por host — TypeCache de Unity en el editor, el escaneo del ensamblado subido del navegador en la web. Todo lo que viene después (instanciación, ordenamiento, aislamiento y la barrera de compatibilidad) es una única función compartida del Core, que es lo que evita que los dos hosts se desalineen slot por slot.
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
PluginComposition | static class | La única vía de ensamblaje. Una instancia por tipo, con cast a cada contrato que implementa. Los dos miembros y la separación de diagnósticos están debajo de la tabla |
PluginSet | sealed class | El resultado ensamblado — doce slots: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes · Strings · StudioUi · PipelineObservers. Un slot nuevo llega a ambos hosts al añadirse aquí |
SheetForgePluginCompatAttribute | sealed attribute (assembly) | [assembly: SheetForgePluginCompat(SheetForgePluginFormat.Current, MinHostVersion = "…", PluginVersion = "…")]. int FormatVersion · string MinHostVersion (comparación numérica por puntos; null/vacío = sin requisito) · string PluginVersion (solo visualización, nunca se compara). Se lee sin instanciar nada, y se juzga por ensamblado — un ensamblado rechazado pierde todos los registros en lugar de cargar a medias. Ausente = generación Minimum, sin requisito de host |
SheetForgePluginFormat | static class | Las constantes de generación: const int Current · const int Minimum. Solo se mueve si el propio formato de plugin se reemplaza — el crecimiento puramente aditivo mantiene el número donde está |
PluginComposition — los dos miembros:
IReadOnlyList<Type> ContractTypes— el filtro de descubrimiento. Su orden es fijo, porque decide el orden en que aparecen los diagnósticos.PluginSet Compose(IReadOnlyList<Type> candidateTypes, string hostVersion, ErrorCollector errors, ICollection<string> failures, Func<string,bool> isProductKey = null)— la propia llamada de ensamblaje.
Se mantienen separados dos tipos de problema. Los conflictos de registro y los rechazos de compatibilidad se convierten en diagnósticos estructurados en errors; los errores de implementación — fallo de construcción, un callback que lanza una excepción — se convierten en líneas en inglés en failures, y pasar null ahí los descarta.
El predicado final isProductKey es cómo se impone la regla "un plugin no puede sobrescribir una clave del producto" de la superposición de cadenas sin que Core llegue a ver nunca las tablas de idioma: la regla vive aquí, el host solo suministra el material. Omite el predicado y solo esa regla se salta.
Registros (SheetForge.Core.Model / .Validation / .Edges)
| Tipo | Rol y miembros clave |
|---|---|
EnumRegistry | Nombre de enum → tipo CLR (material para el codegen). Register<TEnum>() · Register(name, memberNames) · TryGetMembers · TryGetClrTypeName · TryGetClrAssemblyName · RegisteredEnumNames. Otros tres miembros se detallan debajo de la tabla |
CellParserRegistry | Nombre de tipo → analizador de celda (abierto-cerrado). Un registro duplicado lanza una excepción. Register(ICellValueParser) · TryGet · TryGetCustomRenderer · RegisteredTypeNames · RegisterWrapper(ICellWrapperType) · TryGetWrapper · RegisteredWrapperNames (tipos wrapper) |
DomainValidatorRegistry | Lista de validadores de solo adición, con el orden preservado. Register(IDomainValidator) · Validators |
EdgeContributorRegistry | Lista de contribuyentes de solo adición, con el orden preservado. Register(IEdgeContributor) · Contributors |
MarkerRegistry | Nombre de marcador (sin @) → marcador estructural personalizado. Una colisión con un marcador integrado (SheetSyntax.ReservedMarkers — @name/@type/@desc/@overlap/@style/@enum/@loc) / un duplicado / un identificador inválido lanza una excepción. Register(IStructuralMarkerDefinition) · TryGet · IsEmpty · RegisteredMarkerNames · AppendMarkerTokens |
TemplateRegistry | Clave de plantilla de "Crear hoja" → plantilla. Una clave vacía/duplicada, un nombre de visualización vacío, cero pestañas, o un TSV de pestaña vacío lanzan una excepción. Register(DataTemplate) · TryGet · Templates · IsEmpty |
EnumRegistry — los tres miembros en detalle:
EnumRegistry(EnumRegistry parent)— un hijo que lee a través de un padre y solo se registra en sí mismo. El padre contiene los enums CLR registrados por plugin durante todo el domain reload, el hijo los definidos en hoja de esta importación, así que una importación nunca muta la caché compartida. Registrar un nombre que el padre ya posee lanza una excepción en lugar de sombrearlo.Contains(name)— propio y luego el padre, Ordinal.SetClrTypeName(name, fullTypeName)— rellena un nombre CLR después de un registro solo de string. El nombre de ensamblado queda vacío porque el tipo todavía no existe.
Plantillas de "Crear hoja" (SheetForge.Core.Model)
| Tipo | Rol y miembros clave |
|---|---|
DataTemplate | Una plantilla registrada por un plugin: string Key (identidad de registro) · string DisplayName (texto propiedad del plugin) · IReadOnlyList<DataTemplateTab> Tabs (una o más) |
DataTemplateTab | Una pestaña de una plantilla: string TabName · string Tsv (un TSV normalizado completo — filas de marcador más datos de ejemplo) |
Tipos de celda personalizados (SheetForge.Core.Model)
| Tipo | Rol y miembros clave |
|---|---|
ICellValueParser | Analiza una celda escalar. Fallo = recopilar en context.Errors + devolver false (nunca lanzar una excepción). string TypeName · bool TryParse(CellParseContext, string, out object) |
ICustomCellType | Ayudante opcional de codegen/ciclo de ida y vuelta. Type ValueType · bool TryRender(object, out string text, out string reason) |
IReferencingCellType | Capacidad opcional que un ICellValueParser registrado también puede implementar para que una clave enterrada en su propia notación reciba el tratamiento completo de RecordId@Tab — integridad + sugerencias, propagación de renombrado de clave que preserva la carga útil, aristas y puertos de grafo, el selector ▾, detección de huérfanos, reglas de listas desplegables exportadas. Se descubre haciendo cast del parser ya registrado (sin canal de registro separado). bool TryGetTokenKey(elementText, out key) · string MakeToken(key) · bool TryRetargetToken(elementText, newKey, out newText) · bool TryRemoveToken(elementText, key, out newText) (resultado vacío = el elemento desaparece) · bool TryRewriteKeys(elementText, IReadOnlyDictionary<string,string> renames, out newText). Una llamada = un elemento (toda la celda, o un elemento separado por ;), así que una carga útil no puede contener ;; @target debe nombrar una pestaña de hoja real (UnknownTargetTab en caso contrario). Nunca lanza — false/null significa "no se puede interpretar", y las reescrituras preservan el residuo |
IRefBearingValue | La mitad del lado del valor de lo anterior, implementada por el valor analizado: IEnumerable<string> ReferencedKeys (el orden de declaración = orden de diagnóstico y de presupuesto de sugerencias; las entradas null/vacías se omiten). El escáner lee esto; los hooks de texto de arriba reescriben la celda. Se necesitan ambos — un valor analizado no puede restaurar la notación del autor, y el texto no se puede validar sin leerse |
ICellWrapperType | Una forma de valor wrapper genérica MyWrapper<T> (p. ej., Pair<int> = 1~2) — el wrapper posee la sintaxis externa y el Core analiza el 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 | El IR analizado de una celda wrapper — lleva la estrategia del wrapper + expone los CellValue internos (de modo que las referencias internas pasan por la validación, el renombrado de clave/pestaña y la exportación). ICellWrapperType Wrapper · IReadOnlyList<CellValue> Inner |
IStructuralMarkerDefinition | Una fila @marker personalizada (valores por columna, validados columna por columna — generaliza @overlap). string MarkerName (sin @) · string Description · void ValidateCell(MarkerCellContext) |
MarkerCellContext | Una llamada de validación de celda de marcador. string MarkerName · string RawText · string FieldName · CellCoordinate Coordinate · void Reject(string reason, string suggestion = null) (→ MarkerCellInvalid) |
CellParseContext | El contexto de una llamada de análisis. TypeToken Type · CellCoordinate Coordinate · ErrorCollector Errors · EnumRegistry Enums |
Constantes de la gramática de hoja (SheetForge.Core.Model)
Un paquete que lee o escribe texto de celda funciona con la misma gramática que usa el importador — dividir una celda de lista, componer una cadena @type, comprobar si un nombre ya está en uso.
Estas constantes son la única fuente de verdad de esa gramática, así que un paquete nunca vuelve a declarar su propio separador: un carácter copiado se desincroniza el día que la gramática cambie. Las listas se entregan de solo lectura, así que nada de lo que haga un paquete puede cambiar la gramática en sí. La notación que describen está documentada por completo en la página Sintaxis de la hoja — esto es el asidero programático sobre ella.
| Tipo | Clase | Función |
|---|---|---|
SheetSyntax | clase estática | La gramática de la hoja como constantes, agrupadas más abajo |
Marcadores
CommentPrefix(#) ·MarkerPrefix(@).- Una constante por cada fila de marcador integrado:
NameMarker·TypeMarker·DescMarker·OverlapMarker·StyleMarker·EnumMarker·LocMarker. RequiredMarkers— los tres que toda hoja debe llevar.ReservedMarkers— todos los nombres integrados. Consúltalo antes de nombrar un marcador personalizado: una colisión se rechaza en el registro.
Separadores
ListSeparator(;) — entre elementos de una lista.EntrySeparator(,),FieldSeparator(:),SectionSeparator(|),KeyTimeSeparator(@) — las capas dentro de un solo valor, razón por la cual;nunca aparece en el texto propio de un valor.StyleKeyValueSeparator(=) — dentro de una celda@style.
Notación de @type
OptionalSuffix(?) ·DefaultSeparator(=) ·TargetSeparator(@, como enRecordId@Tab).ListTypeName·ListOpen(List<) ·ListClose(>).
Nombres de tipo
- Una constante por cada nombre integrado:
IntTypeName·FloatTypeName·BoolTypeName·StringTypeName·RecordIdTypeName·IntIdTypeName·AssetRefTypeName·LocRefTypeName·ColorTypeName·AnimationCurveTypeName·GradientTypeName·EnumTypeName. BuiltinScalarTypeseIsBuiltinScalarTypeName(name)— responden "¿este nombre ya es integrado?" antes de que se registre un analizador con él.StyleKeyNames(title,color) ·LocReservedColumns(smart,comment).
Valores
TrueCanonical/FalseCanonical— el texto canónico debool.NumberCellStyles— elNumberStylescon el que se lee cada celda numérica. Los separadores de miles quedan excluidos y la cultura es siempre invariante, así que una coma decimal local falla de forma ruidosa en lugar de cambiar el número en silencio.
Validación de dominio (SheetForge.Core.Validation)
| Tipo | Rol y miembros clave |
|---|---|
IDomainValidator | Regla entre columnas/entre pestañas. Las infracciones van a ctx.Errors como DomainRuleViolation con los 4 elementos. string Name · Validate(DomainValidationContext) |
DomainValidationContext | Tables (pestaña → SheetTable) · KeyIndices · AssetKeys (null = omitido) · Errors |
Costura de aristas (SheetForge.Core.Validation / .Edges)
| Tipo | Rol y miembros clave |
|---|---|
ReferenceScanner (static) | Única fuente de verdad para la enumeración de ocurrencias de referencias. Scan(tables) · ScanTable · ScanField · IsReferenceField(TypeToken), más los dos predicados de referencia detallados debajo de la tabla |
RefKeyKind (enum) | Si una referencia coincide con el espacio de clave de tipo string (RecordId) o entero (IntId). Lo devuelve ReferenceScanner.GetReferenceKind; los consumidores se ramifican según él. Solo adición |
ReferenceOccurrence (struct) | Una ocurrencia — Kind · FromTab · RowNumber · ColumnNumber · FieldName · TargetTab · TargetId · ToCoordinate() |
ReferenceOccurrenceKind (enum) | Scalar · ListElement · ExplicitDefault · WrapperElement · CustomElement (una referencia que un IRefBearingValue declaró fuera de su propia notación — coordenadas a nivel de celda, ya que el layout interno pertenece a ese tipo). Solo adición, así que los valores existentes conservan su significado |
IEdgeContributor | Declara aristas que el escáner no puede ver. Sin diagnósticos. string Name · ContributeEdges(EdgeContributionContext, ICollection<EdgeSpec>) |
EdgeSpec | Una arista — FromTab/FromRecordId/ToTab/ToRecordId (+ opcionalmente FieldName, PayloadTab/PayloadRecordId para aristas de registro, Label) |
EdgeContributionContext | Tables + KeyIndices de solo lectura (sin recolector de errores — las aristas no son validación) |
IAuthorableEdgeContributor | Capacidad opcional que un IEdgeContributor también puede implementar para que su arista se pueda editar en el lienzo de grafo. bool TryPlanConnect(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out EdgeCellWrite) · bool TryPlanDisconnect(EdgeAuthoringContext, RecordEdge, out EdgeCellWrite) — false = no se prepara nada y la affordance se deshabilita con un motivo; ambos se ejecutan dentro de try/catch |
IEdgeTokenEditor | Capacidad opcional que un IEdgeContributor también puede implementar para que el resto de su token (todo lo que no es la clave) se pueda editar en el inspector de cable. bool TryDescribeToken(EdgeAuthoringContext, RecordEdge, out EdgeTokenDescription) · bool TryPlanSetModifier(EdgeAuthoringContext, RecordEdge, string newModifier, out EdgeCellWrite) — ambos leen la misma celda (una arista sabe a dónde apunta, no cómo se escribe hoy), false = la fila se oculta o se deshabilita honestamente; ambos se ejecutan dentro de try/catch |
EdgeTokenDescription | Qué es un token y cómo editar su resto — TokenText (el fragmento a resaltar) · ModifierText · HasModifier · ModifierLabel · IsChoice · Options / OptionLabels. new EdgeTokenDescription(tokenText) = sin resto, así que no se dibuja ninguna fila; el constructor de elección recae en texto libre cuando la lista de opciones está vacía |
IBatchAuthorableEdgeContributor | Capacidad opcional, hermana de IAuthorableEdgeContributor (no una herencia): planes de conectar/desconectar como una lista de escrituras de celda, para datos donde un gesto debe cambiar varias celdas emparejadas a la vez. bool TryPlanConnectMany(EdgeAuthoringContext, fromTab, fromRecordId, toTab, toRecordId, out IReadOnlyList<EdgeCellWrite>) · bool TryPlanDisconnectMany(EdgeAuthoringContext, RecordEdge, out IReadOnlyList<EdgeCellWrite>) — toda la lista se prepara como un solo paso de undo o ninguno; los contribuyentes singulares siguen funcionando (fallback), y el batch gana cuando una clase implementa ambos |
IVirtualNodeFactory | Capacidad opcional: gestos de "crear" en el lienzo que no son una fila de hoja nueva. IReadOnlyList<VirtualNodeKind> KindsFor(EdgeAuthoringContext, tab, recordId) (se llama por cada construcción de menú — mantenlo ligero) · bool TryPlanCreate(EdgeAuthoringContext, tab, recordId, VirtualNodeKind, out IReadOnlyList<EdgeCellWrite>) — false = la sesión queda intacta. Un plan no puede apuntar a un registro creado en el mismo gesto |
VirtualNodeKind (struct) | Un tipo creable — Id (se devuelve textualmente al elegir) · Label (texto de menú ya traducido; / anida) · IsUsable. Seguro ante null, seguro ante default |
IEdgeSlotDeclarer | Capacidad opcional: puertos que un nodo (virtual) abre sin necesitar una arista en vivo. IReadOnlyList<DeclaredSlot> DeclareSlots(EdgeAuthoringContext, nodeTab, nodeRecordId) — los slots declarados se suman al menú de conectar, al selector de puerto y a las filas de puerto de la tarjeta; se llama por cada render, así que las implementaciones deben ser ligeras y sin efectos secundarios |
DeclaredSlot (struct) | Un slot declarado — FieldName (único por nodo; debe coincidir con el FieldName de la arista del contribuyente para que los cables se anclen) · TargetTab · IsList · IsUsable. Seguro ante null, seguro ante default |
EdgeAuthoringContext | La entrada de planificación — Tables + string CellText(tab, recordId, field), que devuelve la celda tal como se lee ahora (baseline más preparación), así que dos enlaces hechos seguidos se ven entre sí |
EdgeCellWrite (struct) | El plan: TabName · RecordId · FieldName · NewRawText (vacío = limpiar) · IsAddressable. Direccionado por clave, no por número de fila |
ReferenceScanner — los dos predicados de referencia:
GetReferencedTab(TypeToken)— el único predicado que todo consumidor pregunta, "¿es esto una referencia, y hacia dónde?". Responde paraRecordId@Tab, paraIntId@Tab(el espacio de clave entero), para el interior de un wrapper, y para un tipo personalizado marcadoIsCustomReference. Por eso una sola adhesión opcional — y, paraIntId@Tab, una ampliación de este predicado — los activa todos a la vez.GetReferenceKind(TypeToken)→RefKeyKind— si la referencia compara contra el espacio de clave de tipo string o entero, así que la propagación de renombrado, la lista desplegable y el selector se ramifican correctamente.GetReferenceKind(TypeToken, tables)— la sobrecarga consciente de la tabla.
Una referencia del core declara su propio espacio (RecordId / IntId). Un tipo personalizado de referencia no tiene notación para decirlo — MyType@Tab es la única forma de escribirlo — así que su espacio se deriva de la identidad de la pestaña destino: una clave propia RecordId significa espacio de tipo string, IntId solo significa espacio entero, y una pestaña desconocida o unas tables null recae en espacio de tipo string, la misma respuesta que da la sobrecarga que solo toma el token. Esa derivación es lo que permite que una implementación existente de IReferencingCellType apunte a una pestaña con clave IntId sin cambiar ni una línea.
Índice del grafo de referencias (SheetForge.Core.Edges)
Una instantánea inmutable que fusiona las referencias escaneadas por el core y las aristas de los contribuyentes en un solo modelo, indexado en ambos sentidos. Material de visualización — nunca produce diagnósticos (los Diagnostics de la proyección siguen siendo la única fuente de verdad para los problemas).
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
RecordEdge (struct) | value | Una arista. RecordEdgeOrigin Origin · FromTab · FromRecordId (vacío para aristas a nivel de campo) · FieldName · RowNumber / ColumnNumber (base 1; 0 = nivel de campo/pestaña) · ToTab · ToRecordId (el id pretendido incluso sin resolver) · bool IsDangling (fijado en el momento de construcción) · Label · PayloadTab / PayloadRecordId (aristas de registro) |
RecordEdgeOrigin (enum) | — | CoreReference (leído de una celda RecordId@Tab — tiene coordenadas) · Contributor (declarado por un IEdgeContributor — a nivel de registro) |
ReferenceIndex | sealed class | La instantánea. estático Build(tables, keyIndices, contributorEdges, codeRegistries, extraKeys = null) (los tres últimos pueden ser null; extraKeys = pestaña → claves que existen pero todavía no están analizadas, p. ej. filas que una superficie de creación acaba de preparar, así que los enlaces hacia ellas no se dibujan como rotos) · AllEdges (orden determinista: from-tab Ordinal → fila → columna → ocurrencia) · OutEdges(tab, recordId) / InEdges(tab, recordId) (nunca null) · int InCount(tab, recordId) · bool TryGetRowKey(tab, rowNumber, out recordId) · DanglingEdges |
Lienzo de registros de Data Studio (SheetForge.Core.Graphing)
El lienzo decide qué dibujar por sí mismo: recorre el índice de referencias hacia afuera desde el registro que abriste (el término) y dispone el resultado de forma determinista. Un plugin no reemplaza esa imagen — la añade. Datos puros en todo momento: las columnas son celdas de cuadrícula, no píxeles, y los colores son un string Category libre que la ventana mapea a una paleta.
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
IRecordCanvasAugmenter | interface | El override de lienzo de una pestaña, llamado después de que se ensambla el cierre. Augment(GraphBuildContext, CanvasAugmentBuilder, string terminusTab, string terminusRecordId). No añadir nada deja la imagen del core tal cual. Una excepción la captura la ventana y se convierte en una advertencia de consola en inglés. La identidad pertenece a los datos — un nodo virtual pierde ante un registro real de la misma clave. La presentación, el hint de visualización, no |
CanvasAugmentBuilder | sealed class | La superficie de escritura, solo cuatro cosas — miembros y reglas debajo de la tabla |
GraphShapeRegistry | sealed class | Nombre de pestaña → override de lienzo. Register(tabName, IRecordCanvasAugmenter) (pestaña duplicada / nombre vacío / null lanzan excepción) · TryGet · IsEmpty |
GraphBuildContext | sealed class | La entrada de solo lectura del override. Tables (pestaña → SheetTable) · ReferenceIndex References · IReadOnlyList<CodeRegistrySource> CodeRegistries (vacío, nunca null). Sin recolector de errores — un lienzo es visualización, no validación |
GraphSpecBuilder | sealed class | El ayudante de ensamblaje del grafo. constructor (GraphBuildContext) · estático NodeKey(tab, recordId) (la única verdad a la que apuntan los cables) · AddNode(GraphNodeSpec) (gana el primer (Key, Column)) · AddWire(GraphWireSpec) · AddWire(fromKey, toKey, label, fromTab, fromRecordId, fieldName, isCyclic = false, cyclicNote = null) (la sobrecarga que también nombra la celda en la que se escribe el enlace, que es lo que hace editable el cable) |
GraphSpec | sealed class | El resultado ensamblado que dibuja el lienzo — Nodes · Wires (el ensamblaje pasa por el builder; el constructor es internal) |
GraphNodeSpec | sealed class | Un nodo. Key · Tab · RecordId · Title · Subtitle · Category · CellCoordinate Address · Column / Row (celdas de cuadrícula que el lienzo ya resolvió — se transportan aquí, no se eligen) · IsFocus (el término) · IsMissing · InCount · IsCyclic |
GraphWireSpec | sealed class | Un cable. FromKey · ToKey · Label · IsCyclic · CyclicNote, más la celda propietaria opcional: FromTab · FromRecordId · FieldName · RecordEdge? SourceEdge (null = cable solo de visualización; el lienzo entonces dice que no se puede editar). Los cinco argumentos de visualización no cambian, así que las llamadas existentes compilan y se renderizan igual |
IAuthorableGraphShape | interface | Capacidad opcional que un IRecordCanvasAugmenter también puede implementar. IReadOnlyList<string> CreatableTabs(GraphBuildContext, string tabName) — dónde puede el lienzo crear un registro (vacío = en ningún lugar). Los dos valores predeterminados sin ella están debajo de la tabla |
CanvasAugmentBuilder — la superficie de escritura. Solo cuatro cosas:
AddNode(tab, recordId, title = null, category = null)/AddNode(tab, recordId, title, category, CellCoordinate address)— un nodo virtual para una identidad que no es un registro de hoja (una clave de evento, un átomo de código); la pestaña puede estar vacía.AddEdge(fromTab, fromRecordId, toTab, toRecordId, label = null, fieldName = null, fieldOnTarget = false, isCyclic = false, cyclicNote = null)— una arista extra que el escáner del core no puede ver. NombrarfieldNameindica en qué celda se escribe el enlace,fieldOnTargetindica que esa celda está en la llegada en lugar de la salida, y el par de ciclo marca un bucle para visualización con la nota que solo el dominio conoce.SetLayer(tab, recordId, layer)— un hint de capa absoluto (0 = más a la izquierda, negativo = más a la izquierda todavía, todo se desplaza a la derecha para compensar).SetLayerRelative(tab, recordId, offset)— lo mismo contado desde el término (−1 = una columna a su izquierda), resuelto contra la columna del término antes de que cualquier hint la moviera.SetSubtitle(tab, recordId, subtitle)— un hint de visualización, lo único que se aplica a registros que ya existen y a registros que no están en pantalla (el selector de conectar los lee).
Los elementos con clave vacía se ignoran, y lo recopilado es interno, porque las reglas de fusión viven en un solo lugar. Cada ampliación es al final, así que un override escrito contra una superficie anterior sigue compilando.
IAuthorableGraphShape — los dos valores predeterminados sin ella:
- La lista de pestañas creables que esta capacidad reemplaza — el eje que también decide si un lienzo se abre siquiera y hasta dónde llega el barrido de filas pendientes — cubre toda pestaña alcanzable desde la pestaña de foco siguiendo el esquema transitivamente.
- La cascada de enlace que el usuario realmente ve empieza desde las pestañas a las que apuntan los puertos actualmente dibujados.
Ambas descartan las pestañas de registro de código y las pestañas sin columna clave. Una pestaña que esto devuelve y que ningún puerto dibujado acepta permanece listada en la cascada de enlace con su motivo adjunto, y las propias barreras de la ventana se siguen aplicando encima.
Preajustes de color (SheetForge.Core.Theming)
| Tipo | Rol y miembros clave |
|---|---|
ThemeRegistry | Id de preajuste → tema. Los ids en blanco, los duplicados y los dos ids integrados reservados lanzan una excepción. Register(SheetForgeTheme) · TryGet · Themes · IsEmpty · IsBuiltInId(id) · BuiltInDefaultId · BuiltInHighContrastId |
SheetForgeTheme | Un preajuste de color. Id · DisplayName · DarkColors / LightColors (IReadOnlyDictionary<ThemeColorSlot, uint>, copiado en la construcción) · TryGetColor(dark, slot, out rgb) · IsEmpty |
ThemeColorSlot | enum — los 33 roles de color que un preajuste puede sobrescribir (superficies, líneas, texto, colores semánticos, marcas de preparación, superficies de fallo, scrim, grafo). Los colores son 0xRRGGBB: Core no hace referencia a ningún tipo del motor, y los rellenos translúcidos derivan de un color de slot más un alfa fijo. Solo adición. |
Un preajuste sobrescribe solo los slots que nombra; todos los demás slots mantienen el valor predeterminado del producto, así que un preajuste se mantiene válido a medida que se añaden slots. Registrar nunca aplica un preajuste — el usuario elige uno en Preferences ▸ SheetForge ▸ Theme.
Superficies de creación declarativas (SheetForge.Core.Studio)
Un plugin describe qué mostrar — la carcasa como datos, el predicado y el efecto como delegados — y cada host lo dibuja con sus propios widgets: UIToolkit en el editor, React en el navegador. Ningún número de layout aparece en ningún lugar. Qué decir es del plugin, cómo colocarlo es del renderizador.
Cada enum aquí es de solo adición, así que un registro conserva su significado a medida que crece el vocabulario.
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
StudioUiRegistry | sealed class | Lo que llena RegisterStudioUi. AddAction(StudioActionDescriptor) · AddPanel(StudioPanelDescriptor) · AddColumnBadge(StudioColumnBadgeDescriptor) · AddCellEditorHint(StudioCellEditorHint) · Actions / Panels / ColumnBadges / CellEditorHints · IsEmpty |
StudioUiNode | sealed class | Un fragmento descrito, inmutable, construido mediante fábricas estáticas — las fábricas, las propiedades de lectura y la regla de URL están debajo de la tabla |
StudioUiNodeKind | enum | Los 13 tipos de arriba (Row … Link) |
StudioActionDescriptor | sealed class | Un verbo. Id (único) · LabelKey (una clave de Loc; no registrada se muestra textualmente) · StudioActionPlacement Placement · Func<StudioSurfaceContext,bool> AppliesTo · Action<StudioSurfaceContext> Execute · ConfirmKey (opcional — el host pregunta esa frase primero). El host vuelve a comprobar AppliesTo al invocar, así que una entrada de menú obsoleta responde con un no-op honesto y un redibujado |
StudioActionPlacement | enum | Inspector · RowContextMenu · TopbarMenu · ColumnHeaderMenu · CanvasNodeMenu. Cada asiento llena campos de contexto distintos — el asiento de fila lleva el registro, el de columna el nombre de columna, el de lienzo el registro de ese nodo |
StudioPanelDescriptor | sealed class | Un panel en el panel derecho de Studio. Id · TitleKey · Func<StudioSurfaceContext,StudioUiNode> Build — reconstruido en cada ciclo de recálculo, así que no guarda estado. Sin ningún panel registrado, el panel no se dibuja en absoluto |
StudioColumnBadgeDescriptor | sealed class | Una insignia junto a un encabezado de columna. Func<StudioSurfaceContext,string,string,StudioUiNode> Provide (contexto, pestaña, campo) — null significa nada en esa columna |
StudioCellEditorHint | sealed class | "Usa este widget integrado para este tipo" — elegir un tipo en lugar de suministrar uno. TypeName (un nombre de tipo exacto de CellParserRegistry; una celda de lista coincide por el nombre de su elemento; las celdas wrapper conservan el texto canónico y nunca coinciden) · StudioCellEditorArchetype Archetype · GetOptions (solo dropdown — Func<context, tab, field, IReadOnlyList<StudioCellOption>>) · SliderMin / SliderMax · ToggleTrueValue / ToggleFalseValue. Cuatro constructores, uno por cada forma de material. Se consulta después de que un IStudioCellEditorProvider registrado decline y antes de las ramas integradas; la pista de un paquete se consulta antes que las pistas integradas de abajo, así que registrar una bajo Color, AnimationCurve o Gradient anula el editor predeterminado para ese tipo. Un List<> cuya pista de elemento sea ColorPicker, CurveEditor o GradientEditor se convierte en un editor de chips en ambos hosts |
StudioCellEditorArchetype | enum | Dropdown · MultilineText · Slider · Toggle · ColorPicker (texto de celda #RRGGBB / #RRGGBBAA) · CurveEditor (texto de celda = la notación canónica de CurveValue) · GradientEditor (texto de celda = la notación canónica de GradientValue). Solo se añade — los dos más nuevos son 5 y 6 |
BuiltinCellEditorHints | static class | Las tres pistas que el propio Core declara — Color → ColorPicker, AnimationCurve → CurveEditor, Gradient → GradientEditor — recorriendo el mismo camino que las pistas de un paquete, así que el editor y el navegador no pueden elegir widgets distintos para ellas. IReadOnlyList<StudioCellEditorHint> All (orden fijo) · bool TryGet(typeName, out hint) (Ordinal). Los hosts consultan primero StudioUiRegistry.CellEditorHints y recurren a esta tabla como respaldo |
StudioCellOption | sealed class | Un candidato de dropdown — Value (el texto canónico escrito en la celda) · Label (lo que lee una persona; por defecto Value) |
StudioSurfaceContext | sealed class | La única costura que una extensión ve y a través de la cual actúa. Lectura: Tables · ReferenceIndex References · CodeRegistries · Tab · RecordId · Field · ActionArgument (el valor que confirmó un nodo Input). Mutación mediada, y nada más: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells (un paso de Undo, todo o nada) · Action<string,string> FocusRecord · Action RequestRebuild. La preparación pasa por la propia barrera de la ventana, así que un origen de solo lectura, una canalización en ejecución o una pestaña respaldada por un libro la bloquean con un motivo (constructor internal: el host lo ensambla) |
StudioUiNode — fábricas, lecturas y la regla de URL:
- Fábricas:
Row·Label·Chip·Badge·Button·Rule·Heading·KeyValue·Table(headerRow, rows)·List·Progress·Input·Link, másWithTooltip(text), que devuelve un nuevo nodo en lugar de cambiar este. - Lecturas:
Kind·Text·Tooltip·ThemeColorSlot? Tone(nunca un color codificado, así que sigue el tema) ·ActionId·Detail·Ratio·Url·Children. - estático
bool IsAllowedUrl(url)— solohttp/https. Un predicado que ambos hosts consultan, así que no pueden discrepar sobre qué es seguro abrir.
Cadenas de UI de plugin (SheetForge.Core.Model)
| Tipo | Rol y miembros clave |
|---|---|
StringOverlayRegistry | Recolector y superposición de consulta para las cadenas de UI registradas por plugin; Loc.Tr (editor) y t() (navegador) la consultan antes que las tablas del producto. Register(key, language, value) · Register(key, IReadOnlyDictionary<string,string> byLanguage) · bool TryGet(key, language, out value) · RegisteredKeys. La coincidencia de idioma y los cuatro rechazos están debajo de la tabla |
StringOverlayRegistry — coincidencia y rechazos. language es un código IETF ("en", "ko", "zh-Hans", "pt-BR", …), comparado sin distinguir mayúsculas/minúsculas. La búsqueda recae en idioma solicitado → inglés → fallo, y el fallback vive aquí para que ambos hosts respondan de forma idéntica.
Se rechazan cuatro registros, cada uno registrando un motivo dirigido al desarrollador en lugar de fallar en silencio:
- una clave integrada del producto — una superposición puede añadir claves, nunca sobrescribir las propias frases o rutas de menú del producto;
- una clave+idioma que otro paquete ya registró — gana el primero encontrado, porque de lo contrario el orden de instalación decidiría la pantalla;
- una clave o un valor vacíos;
- un código de idioma que el producto no conoce, que nunca se pliega a inglés.
Observación de la canalización (SheetForge.Core.Plugins / .Model)
| Tipo | Rol y miembros clave |
|---|---|
IPipelineObserver | Notificación de solo lectura. void OnImportCompleted(PipelineRunView view) — una vez por cada ciclo de importación explícito, al final de este, con éxito o con fallo. Deliberadamente no hay ningún hook que altere un valor o añada un diagnóstico (eso le corresponde a un tipo de celda y a IDomainValidator), ni ninguno que se ejecute en el pre-flight de preparación. Una excepción se aísla con su motivo recopilado; la salida de la importación no cambia. Los puntos de observación futuros llegan como interfaces de capacidad hermanas, con cast desde el observador registrado, así que una implementación escrita hoy sigue compilando |
PipelineObserverRegistry | Lista de observadores de solo adición, con el orden preservado. Register(IPipelineObserver) · Observers |
PipelineRunView | La instantánea inmutable que recibe un observador — Success (validación, es decir, si se ensambló un registro; los resultados de codegen/bake se leen de los diagnósticos) · Tables (las pestañas que se analizaron; en una ejecución fallida, solo faltan las pestañas que no se pudieron analizar, porque "sin ensamblaje parcial" es una regla de salida, no de observación) · Diagnostics (la misma lista que muestra el informe) · SkippedTabs · EnumTabs. Las colecciones se copian en la construcción, y el constructor es internal, así que ninguna instantánea a medio construir puede entregarse a un observador |
Registros de código (SheetForge.Core.Graphing)
Destinos de referencia que viven en código, expuestos a la superficie de creación como pestañas virtuales bloqueadas. Consumidos por Data Studio (barra lateral / grafo / inspector), no por el validador de importación.
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
CodeRegistryCatalog | sealed class | Raíz de registro. Register(CodeRegistrySource) (null / nombre de pestaña vacío / nombre de pestaña duplicado lanzan excepción) · TryGet(tabName, out source) · Sources · IsEmpty |
CodeRegistrySource | sealed class | Una pestaña virtual bloqueada. string TabName · IReadOnlyList<CodeRegistryEntry> Entries (el orden de registro = orden de visualización) |
CodeRegistryEntry | sealed class | Una entrada. string Key (a qué puede apuntar una referencia) · string Label · IReadOnlyList<string> Raises (null se normaliza a vacío). Core trata los tres como strings opacos |
El modelo de lectura del IR (SheetForge.Core.Model)
| Tipo | Rol y miembros clave |
|---|---|
SheetTable | La salida de análisis de una pestaña. SheetSchema Schema · IReadOnlyList<SheetRecord> Records |
SheetSchema | string TabName · Fields · TryGetField(name, out FieldSchema) · SheetStyle Style (los metadatos de visualización @style de la hoja) · bool IsLocalizationSheet (el marcador @loc está presente) · IReadOnlyList<LocaleColumn> LocaleColumns (las columnas de configuración regional en el orden de columna original — vacía en una hoja que no es una hoja de localización, nunca null) · TryGetLocaleColumn(localeCode, out LocaleColumn) (búsqueda por código, sin distinguir mayúsculas de minúsculas) · TryGetSourceLocale(out LocaleColumn) (la primera columna de configuración regional; false cuando no hay ninguna) |
SheetStyle | El valor de la fila @style — metadatos de visualización de una hoja. string Title (etiqueta de grupo de la barra lateral) · string ColorHex (#RRGGBB tal como se escribió) · bool HasColor · estático None (sin estilo). Nunca lo leen el codegen, el bake ni la huella del esquema |
LocaleColumn (struct) | Una columna de configuración regional de una hoja de localización — lo que la fila @loc escribió en esa columna. string Code (el código exactamente tal como está escrito; el Core valida la forma de la ortografía, nunca si la configuración regional existe) · string FieldName · int ColumnNumber (base 1) · bool IsSource (la primera columna de configuración regional — la que leen las vistas previas en línea y en la que escribe la generación automática de claves) |
SheetRecord | int RowNumber (original, base 1) · Values (campo → CellValue) · TryGet · indexador |
FieldSchema | Name · TypeToken Type · Description · ColumnNumber · DefaultValue · AllowOverlap · IReadOnlyDictionary<string,string> MarkerValues (nombre de marcador personalizado → el texto de celda de esta columna) |
TypeToken | La celda @type analizada. RawText · TypeName · TypeArgument · TargetName · IsList · IsOptional · HasExplicitDefault · DefaultValueText · AllowsEmptyCell · IsSelfKey · IsIntId (solo la clave entera propia de esta pestaña — la forma de referencia IntId@Tab se lee mediante TargetName + ReferenceScanner.GetReferencedTab, igual que RecordId@Tab) · TypeToken InnerToken / IsWrapper (tipos wrapper — interno recursivo) · IsCustomReference (esta columna es MyType@Tab donde el parser implementa IReferencingCellType; ReferenceScanner.GetReferencedTab es el único predicado que lo lee, que es cómo cada consumidor se activó sin un cambio de firma) · AssetTypeName (el <Type> de AssetRef@Group<Type> tal como se escribió, null cuando no hay restricción; el Core solo almacena el nombre — resolverlo es tarea de IAssetTypeResolver — y también se estampa en el token AssetRef dentro de una lista o un wrapper). Los tres parámetros finales del constructor (innerToken, isCustomReference, assetTypeName) tienen valor predeterminado, así que las llamadas existentes compilan, y los constructores anteriores de 8 y 10 argumentos se conservan como sobrecargas, de manera que los ensamblados de plugin ya compilados siguen funcionando sin necesidad de recompilar |
CellValue (struct) | Un valor de celda tipado; sin nulls (IsDefaulted marca los valores predeterminados materializados). object Value · IsDefaulted · AsList · estático Of / Defaulted |
RecordId (struct) | Un valor de clave (igualdad Ordinal). string Value · IsEmpty |
RecordRefValue (struct) | El valor de una celda RecordId@Tab. TargetTab · Id |
IntRefValue (struct) | El valor de una celda IntId@Tab — el gemelo de clave entera de RecordRefValue. string TargetTab · int Id · bool IsEmpty · estático Empty(tab) (un IntId@Tab? opcional que no apunta a nada) |
LocRefValue (struct) | El valor de una celda LocRef@Tab — el gemelo de localización de RecordRefValue, mantenido como un tipo aparte para que un consumidor sepa con solo mirar el valor que apunta a una tabla de strings. string TargetTab · string Key · bool IsEmpty · estático Empty(tab) · ReferencedKeys. Implementa IRefBearingValue, así que el escáner de referencias lo trata exactamente igual que a una referencia del núcleo |
AssetRefValue (struct) | El valor de una celda AssetRef@Group. Group · Key (la clave de un sub-asset es parent[sub]) |
EnumValue (struct) | El valor de una celda Enum<T> (un par de strings — la conversión a CLR es tarea del bake). EnumName · MemberName |
Referencias de asset tipadas (SheetForge.Core.Model)
El <Type> en AssetRef@Group<Type> lo resuelve el host — el Core no conoce ni el motor ni los ensamblados del proyecto — y el Core solo juzga el resultado. Todo lo de aquí son datos puros.
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
IAssetTypeResolver | interface | AssetTypeResolution Resolve(string rawName) — un nombre entra, un veredicto sale; el mismo nombre siempre obtiene la misma respuesta (las implementaciones pueden cachear). Se inyecta en ImportPipeline por separado de AssetKeyIndex, así que los nombres de tipo se resuelven incluso en un proyecto que todavía no tiene ajustes de Addressables; cuando no se inyecta ningún resolver (headless, navegador) los diagnósticos de nombre de tipo simplemente no se producen. La implementación del Editor resuelve contra los tipos de asset derivados de UnityEngine.Object que el proyecto tiene cargados (sin lista blanca; componentes y tipos de solo editor excluidos) |
AssetTypeResolution | sealed class | El veredicto para un nombre — RawName · AssetTypeResolutionStatus Status · FullName (nombre completo CLR, tipos anidados con +; solo Resolved y NotReferenceable) · AssemblyName (el ensamblado que el ensamblado complementario generado debe referenciar — establecido para tipos de definición de ensamblado, null para módulos del motor y nombres no resueltos) · Candidates (nunca null: los candidatos ambiguos, o sugerencias de coincidencia más cercana para un nombre desconocido). Fábricas Resolved(raw, fullName, assemblyName) · Unknown(raw, suggestions) · Ambiguous(raw, candidates) · NotReferenceable(raw, fullName, assemblyName) |
AssetTypeResolutionStatus | enum | Resolved · Unknown (no existe tal tipo) · Ambiguous (el nombre corto coincide con varios tipos — escribe el nombre completo) · NotReferenceable (el tipo vive en un ensamblado predefinido como Assembly-CSharp, que el código generado no puede referenciar) |
El codegen lee el diccionario resuelto que produce la canalización y emite AssetReferenceT<global::FullName> para un nombre resuelto; un nombre que no encuentra en ese diccionario nunca se emite tal cual — el campo recae en AssetReference y se recopila una advertencia AssetTypeUnresolvedFallback. El nombre completo resuelto también se mezcla en la huella del esquema.
Tipos de valor visuales (SheetForge.Core.Model)
Modelos de valor libres del motor para los tres tipos visuales integrados. Cada uno es inmutable, IEquatable, y posee su propia forma de texto (TryParse / Render) — la misma notación que documenta la página de Sintaxis de la hoja — así que un tipo de plugin que almacena un color, una curva o un degradado puede reutilizarlos en lugar de inventar una segunda notación. El Editor hace bake de ellos en UnityEngine.Color / AnimationCurve / Gradient y los vuelve a leer; el navegador los muestrea mediante los evaluadores de abajo en lugar de reimplementar las matemáticas.
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
ColorValue | readonly struct | Cuatro bytes R · G · B · A · estático Default (#00000000) · estático TryParse(text, out value, out error) (acepta #RGB / #RGBA / #RRGGBB / #RRGGBBAA) · Render() (mayúsculas, seis dígitos cuando es opaco) |
CurveValue | sealed class | Keys (ascendente en el tiempo) · PreWrap / PostWrap · estático Empty (sin claves — el único estado sin forma de texto; Render() da "") · estático Create(keys, preWrap, postWrap) — la única vía de construcción: ordena por tiempo, rechaza tiempos duplicados, y aplica CurveTangentSolver para que "el modo gana" se cumpla desde el momento en que existe una curva · estático TryParse (claves de 2/4/7/8 campos, Once aceptado como alias de ClampForever, tangentes Infinity/-Infinity) · Render() (claves de 8 campos, sufijo de ajuste solo cuando se necesita) |
CurveKey | readonly struct | Time · Value · InTangent · OutTangent · InWeight · OutWeight · CurveWeightedMode WeightedMode · CurveTangentMode LeftMode / RightMode · bool Broken; un constructor de diez argumentos sin normalización propia |
CurveWrap | enum | ClampForever · Loop · PingPong · Default — el vocabulario de ajuste de Unity por nombre (el mapeo del valor a WrapMode es tarea del baker) |
CurveTangentMode | enum | Free = 0 · Auto = 1 · Linear = 2 · Constant = 3 · ClampedAuto = 4 — nombre y valor idénticos a AnimationUtility.TangentMode, así que el baker mapea por nombre y nunca toca los bits de tangente empaquetados de Unity |
CurveWeightedMode | [Flags] enum | None = 0 · In = 1 · Out = 2 · Both = 3 — qué lado de una clave usa tangentes ponderadas (Bezier) |
CurveTangentSolver | static class | CurveKey[] Apply(IReadOnlyList<CurveKey> sortedKeys) — deriva los números de tangente que dicta un modo, aplicando las etapas en el orden del motor (Linear en su propio lado → ClampedAuto en ambos lados → Auto en ambos lados → Constant en su propio lado), dejando intactos los lados Free y los pesos. CurveValue.Create lo llama, así que rara vez hace falta invocarlo directamente |
CurveEvaluator | static class | float Evaluate(CurveValue, float time) · float[] Sample(CurveValue, int count) (count ≥ 2, distribuidos uniformemente desde la primera hasta la última clave) — Hermite entre claves, Bezier ponderado en los lados cuyo indicador de peso está activado, una retención cuando una tangente es infinita, y los cuatro comportamientos de ajuste fuera del rango de claves; verificado contra AnimationCurve.Evaluate en curvas aleatorias |
GradientValue | sealed class | ColorKeys · AlphaKeys (de 1 a 8 cada una, ascendentes en el tiempo) · GradientBlend Mode · GradientColorSpace ColorSpace · estático Default (blanco, totalmente opaco, Blend) · estático Create(colorKeys, alphaKeys, mode, colorSpace) (valida los recuentos y los rangos 0…1, cuantiza los tiempos a 16 bits como hace Unity, ordena de forma estable) · estático TryParse (tres o cuatro secciones separadas por ` |
GradientColorKey | readonly struct | ColorValue Color (el alfa se ignora — el alfa tiene sus propias claves) · float Time |
GradientAlphaKey | readonly struct | float Alpha · float Time |
GradientBlend | enum | Blend · Fixed · PerceptualBlend |
GradientColorSpace | enum | Uninitialized (no escrito; se lee como Gamma) · Gamma · Linear — solo PerceptualBlend se ve afectado |
GradientEvaluator | static class | ColorValue Evaluate(GradientValue, float time) · ColorValue[] Sample(GradientValue, int count) — mezcla lineal, escalonada o perceptual (Oklab), con las claves de alfa mezcladas por separado, redondeadas a bytes; verificado contra Gradient.Evaluate en degradados aleatorios |
Errores y resultados (SheetForge.Core.Model / .Reporting)
| Tipo | Rol y miembros clave |
|---|---|
ImportError | Error estructurado y neutral respecto a la configuración regional. Code · Severity · Coordinate · ActualValue · Expected · Suggestion |
ImportErrorCode (enum, 105) | El catálogo completo del "por qué" — las familias que cubre se listan debajo de la tabla. Solo adición, porque las tablas de renderizado se basan en los valores de los miembros |
ImportSeverity (enum) | Error (bloquea la salida) · Warning |
CellCoordinate (struct) | Pestaña · fila base 1 · columna base 1 · campo; calcula la letra de columna de la hoja de cálculo. Fábricas ForTab / ForRow |
ErrorCollector | El receptor de "recopilarlo todo". All · HasErrors · ErrorCount · Add |
ImportResult | La salida de la canalización. Invariante: Success == false ⇔ Registry == null. Success · Registry · Diagnostics · SkippedTabs · EnumTabs (pestañas leídas como hojas de definición de enum, así que nunca se analizan como tablas de datos — se mantienen aparte de SkippedTabs, que significa "todavía sin tabla escrita", para que el recuento de omitidas del informe siga siendo veraz; ambos son conjuntos de preservación que conservan el código generado, los assets horneados y las direcciones de esas pestañas) · estático Succeeded / Failed |
ImportReport (.Reporting, ensamblado SheetForge.Core.Tooling) | La entrada de los renderizadores de informes — Timestamp · SourceDescription · TabCount · RecordCount · Success · Diagnostics · ErrorCount · WarningCount · SkippedTabCount (cuántas de TabCount fueron hojas vacías omitidas en lugar de importadas — el encabezado lo imprime para que un recuento de pestañas no se confunda con "todas importadas") |
ImportReportText (.Reporting, ensamblado SheetForge.Core.Tooling, static) | Renderiza un informe al propio string legible para humanos del producto, sin escribir nada en la consola y sin añadir enlace de salto ni línea de coordenadas de máquina (eso pertenece a la convención propia de la consola). string Render(ImportReport report, IReadOnlyDictionary<string,string> languageTable = null, string operationName = null) — omite la tabla para inglés; el nombre de la operación, cuando se omite, se lee de la misma tabla para que la frase nunca mezcle dos idiomas. Quien llama desde el Editor normalmente quiere SheetForgeActions.RenderReportText(report), que rellena el idioma actual del editor (un ensamblado puro no puede leer EditorPrefs) |
ImportErrorCode — las familias que cubre:
- marcadores, esquema, tipos, celdas, claves/referencias y claves de asset;
- orígenes/archivos, csv/xlsx, identificadores de codegen, addressables, baseline/exportación, Google/autenticación/Push y plantillas;
- plugins —
PluginRegistrationConflict, másPluginIncompatiblecuando la declaración de compatibilidad de un ensamblado cae fuera de lo que este host lee; - IntId —
DuplicateIntId, y para referenciasIntId@Tab:UnresolvedIntId·TargetTabHasNoIntId; @overlapyDomainRuleViolation;- hojas de definición de enum —
EnumSheetMarkerConflict·DuplicateEnumName·EnumSheetEmptyColumn·InvalidEnumIdentifier·InvalidEnumUnderlyingType·InvalidEnumMemberValue; DropdownNotSupportedByFormat, que es una advertencia en lugar de un error;- referencias de asset tipadas —
UnknownAssetType·AmbiguousAssetType·AssetTypeNotReferenceable(una vez por columna, en la fila@type),AssetTypeMismatchpor celda, y la advertencia de codegenAssetTypeUnresolvedFallback.
Índices y utilidades (SheetForge.Core.Validation / .Model / .Parsing / .Unparse)
| Tipo | Rol y miembros clave |
|---|---|
TabKeyIndex | La información de clave de una pestaña — la columna de clave de tipo string más el conjunto de clave entera IntId de la pestaña, así que tanto las referencias RecordId@Tab como IntId@Tab se resuelven contra él. TabName · KeyField · HasKeyColumn · Keys · Contains(id) |
KeyIndexBuilder (static) | Construye los índices de clave (las claves de tipo string y el conjunto de clave entera IntId, en una sola pasada), reporta errores de clave, valida columnas IntId. Build(SheetTable, ErrorCollector) · ValidateIntIdColumns |
AssetKeyIndex | Grupo → conjunto de claves válidas (el Editor lo llena a partir del catálogo de Addressables, incluidas las claves de sub-asset; inyectar null = omitir la validación de assets). Register(group, keys) · HasGroup · HasKey · KeysOf · GroupNames, más la capa de tipos que usa AssetRef@Group<Type>: RegisterTyped(group, key, satisfiedTypeFullNames) (la clave y la clausura de nombres completos de tipo bajo los que se puede cargar — su propio tipo, sus bases, sus interfaces, los tipos de sus sub-assets; volver a registrar une la clausura) · HasTypeInfo(group, key) · SatisfiesType(group, key, typeFullName). Una clave registrada con el Register simple no tiene clausura y queda exenta de la comprobación de tipo en lugar de fallarla |
LocalizationCoverage (static) | La cobertura por configuración regional y las claves huérfanas de una hoja de localización. Un cálculo puro que devuelve listas en lugar de recolectar errores, porque una celda sin traducir y una clave sin usar son estados normales y no salidas que haya que bloquear. IReadOnlyList<LocaleCoverage> Compute(SheetTable) · IReadOnlyList<string> FindOrphanKeys(locTabName, tables) (las claves a las que no apunta nada; deliberadamente conservador — toda forma de referencia que el escáner conoce cuenta como un uso, así que una traducción viva nunca se llama huérfana) |
LocaleCoverage (sealed class) | La cobertura de una configuración regional. LocaleColumn Locale · int TotalKeys · int TranslatedKeys · IReadOnlyList<string> MissingKeys (en el orden de fila de la hoja, nunca null) · bool IsComplete |
TextSuggestion (static) | Sugerencias de coincidencia más cercana (Levenshtein acotado, determinista). FindNearest · Distance · DistanceWithin |
BuiltinCellParsers (static) | CreateDefaultRegistry() — los 12 analizadores integrados (int, float, bool, string, Enum, RecordId, AssetRef, IntId, LocRef, Color, AnimationCurve, Gradient). |
CanonicalValueRenderer (static) | Valor → string de celda canónico (exportación/Push). TryRender(…) (delega un ColorValue / CurveValue / GradientValue a su propio Render(); una curva sin claves se renderiza como la celda vacía) · RenderFloat(float) (ida y vuelta más corta) |
Plan de Push (SheetForge.Core.Unparse)
Públicos porque IPushApprover.Approve(PushPlan) los expone; datos puros.
| Tipo | Rol |
|---|---|
PushPlan (ensamblado SheetForge.Core.Tooling, igual que las tres filas siguientes) | El plan de envío completo. Tabs · HasWork |
PushTabPlan | Una pestaña: Writes · Appends · Deletes (clave + número de fila; DeleteNotices sigue siendo la vista de solo clave) |
PlannedCellWrite | Una escritura de celda — coordenadas, celda del baseline, nuevo valor/texto, indicador de familia de string |
PlannedRowAppend | Una fila añadida — textos de celda completos + columnas de familia de string |
Ensamblado Editor (SheetForge.Editor)
Ajustes, localización, composición (SheetForge.Editor.Pipeline / .Localization)
| Tipo | Rol y miembros clave |
|---|---|
SheetForgeSettings (SO) | El asset de ajustes. Campos: sourceProviderId (único eje de selección de origen; vacío = LocalFile integrado) · localFolderPath · bakeOutputFolder · generatedCodeFolder · generatedNamespace · exportFolderPath · exportFormat · spreadsheetId · googleAccessMode · serviceAccountKeyPath · gidMap (lista de GidMapEntry { tabName, gid }). Propiedades resueltas Effective*. |
Loc (static) | El punto de entrada de la localización. Tr(key) · TrContent(…) · Table · constante MenuRoot. Tr se resuelve en cuatro pasos: string registrado por plugin (idioma actual, luego inglés — la superposición posee ese fallback, consulta StringOverlayRegistry) → tabla integrada (idioma actual, luego inglés) → la propia clave. Hay exactamente un canal de registro para las cadenas de plugin, así que "cuál registro gana" nunca se convierte en una pregunta |
PluginRegistry (static) | Descubre los plugins mediante TypeCache, y entrega los candidatos a PluginComposition.Compose. Build · BuildValidators · BuildEdgeContributors · BuildStructuralMarkers · BuildTemplates · BuildGraphShapes · BuildCodeRegistries · BuildThemes · BuildAll (paquete) · InvalidateCache() (descarta la caché de duración del reload — la misma convención que SourceProviderRegistry.InvalidateCache; también descarta la caché de la barrera de compatibilidad, así que un conjunto de descubrimiento cambiado se vuelve a juzgar). El paquete y el aislamiento de slots están debajo de la tabla |
ImportEvents (static) | Bus de eventos del lado del Editor — un contrato público: los assets externos pueden suscribirse. event Action<ImportCompletedArgs> ImportCompleted · RaiseImportCompleted(ImportCompletedArgs) se disparan solo cuando una importación se ejecutó hasta el final, pasando por el bake, así que un suscriptor puede leer los assets generados mediante bake. event Action<BaselineUpdatedArgs> BaselineUpdated · RaiseBaselineUpdated(BaselineUpdatedArgs) se disparan siempre que se guardó una instantánea de hoja — incluida una ejecución que falló la validación — que es cómo una superficie de creación se refresca ante una importación en cuarentena. Dos ejes, deliberadamente no fusionados: uno significa "las hojas se movieron", el otro "los assets se movieron" |
BaselineUpdatedArgs (sealed) | Carga útil de guardado de baseline. IReadOnlyList<string> Tabs (las pestañas escritas en la instantánea) · bool Quarantined (si la instantánea recién guardada falló la validación) |
SheetForgeActions (static) | La fachada de ejecución — el mismo ciclo que ejecuta un clic de menú, invocable desde un script de CI, un hook de build o tu propio botón. RunImport() · RunExport() · RunPush() · RunHealthCheck() · RunLocalizationSync() (cada uno delega; la resolución de ajustes, la barrera de Addressables, la exclusión mutua, los modales de confirmación, la barra de progreso y la reanudación codegen→compilación→bake se quedan todos dentro del producto) · bool IsBusy · bool TryBeginExclusiveScope(out IDisposable scope) (false + scope = null cuando algo ya está en ejecución; el scope es lo que libera, y un segundo Dispose no puede liberar la ejecución de otra persona) · string RenderReportText(ImportReport) (las propias frases del producto en el idioma actual del editor, sin escribir en la consola). La semántica de finalización está debajo de la tabla |
SheetForgeEditorInfo (static, namespace SheetForge.Editor) | Ancla del ensamblado Editor — const Version, el espejo de SheetForgeRuntimeInfo para activar funciones según la superficie del lado del editor |
ImportCompletedArgs (sealed) | Carga útil de finalización que se pasa a los suscriptores. IReadOnlyList<string> Tabs (pestañas incorporadas mediante bake en esta finalización) · string BakeFolder (carpeta de los Database-SO). Patrón de objeto de argumentos — los campos futuros no romperán la firma del evento. |
GoogleSheetAccessMode (enum) | SheetsApi (con autenticación, escribible) · ExportUrl (sin autenticación, de solo lectura) |
ExportFormat (enum) | Tsv · Csv · Xlsx · Json · MatchSource |
PluginRegistry — el paquete y el aislamiento de slots. El PluginBundle anidado expone el PluginSet Set ensamblado — la única verdad de doce slots, que es cómo se lee un slot recién crecido sin ampliar el paquete — más nueve ventanas de conveniencia sobre él: Enums · Parsers · Validators · EdgeContributors · Markers · Templates · GraphShapes · CodeRegistries · Themes. Los constructores anteriores de seis y ocho argumentos se mantienen como sobrecargas que ponen los registros posteriores en vacío por defecto, lo que se comporta igual que las versiones anteriores a esos contratos.
El aislamiento es del Core, no de este tipo: un plugin que lanza una excepción al registrarse se reporta por nombre y se omite, y todos los demás slots y plugins se siguen registrando.
SheetForgeActions — semántica de finalización. RunImport/RunPush son fire-and-forget. Sus cuerpos son async void porque el hilo principal del editor no puede bloquearse en E/S de red, así que el retorno no es la finalización — suscríbete a ImportEvents.ImportCompleted para eso. RunExport/RunHealthCheck/RunLocalizationSync se completan de forma síncrona — RunLocalizationSync recorre la ruta hoja → StringTable que recorre la finalización de una importación, y sin el paquete Unity Localization muestra el aviso de instalación y no cambia nada.
Costura de proveedor de origen (SheetForge.Editor.Sources)
| Tipo | Rol y miembros clave |
|---|---|
ISheetSourceProvider | El contrato del proveedor. Id · DisplayNameKey · CreateTabSource(settings) · GetVisibility(settings) · CanAuthor(settings) · CreateReflectTarget(dispatcher, settings) |
ISourceReflectTarget | El destino de escritura de vuelta. void Reflect() |
SourceVisibility | Qué campos de ajustes mostrar — 5 indicadores bool |
SourceProviderRegistry (static) | Descubrimiento/resolución. All · ResolveActive(SheetForgeSettings) y ResolveActive(string providerId) (resuelve directamente desde un id, sin tener un asset de ajustes a mano) · TryGet · InvalidateCache |
ITabSource | La abstracción de obtención (fetch). Description · Task<TabSourceResult> FetchAsync() |
TabSourceResult | Pestañas (nombre → TSV en bruto) + diagnósticos + formatos por pestaña; se permite salida parcial. Create estático |
TabSourceFormat (enum) | Tsv · Csv · Xlsx · GoogleSheet |
Puntos de extensión de Data Studio (SheetForge.Editor.Studio)
Del lado del Editor porque tocan UIElements / estado de ventana — la misma asimetría justificada que ISheetSourceProvider. Los cuatro contratos los descubre TypeCache (constructor sin parámetros; sin llamada de registro), y todos se llaman dentro de try/catch. La propia ventana (DataStudioWindow) es internal.
Cualquier cosa expresable como datos pertenece en su lugar al vocabulario ISheetForgeStudioPlugin del Core, que también se renderiza en el navegador. Estas son las vías de escape sin techo para lo que la descripción no puede decir.
Las últimas cuatro entradas no son contratos sino herramientas que un widget montado puede usar:
- los propios valores de skin de solo lectura de la ventana, para que pueda parecer que pertenece ahí;
- el menú desplegable de claves, para que un widget de celda elija claves de la misma manera que la celda integrada;
- y el reinicio de la caché de descubrimiento, para que tus propias pruebas puedan volver a descubrir una sonda.
| Tipo | Clase | Rol y miembros clave |
|---|---|---|
IStudioGraphWidget | interface | Una franja de dominio encima del lienzo de grafo (Core no incluye ninguna). bool AppliesTo(StudioGraphContext) · VisualElement Create(StudioGraphContext) (se recrea en cada reconstrucción del grafo — no mantiene estado; null no añade nada) |
StudioGraphContext | sealed class | Solo lectura: Tab y FocusRecordId (el término) · SheetRecord FocusRecord (null cuando no se resuelve) · Tables · ReferenceIndex References · CodeRegistries. Dos ejes retirados permanecen por compatibilidad de firma y están marcados [Obsolete]: ShapeId (siempre "record") y ModeId (siempre vacío). Comparar cualquiera de los dos compila y nunca es verdadero, así que ahora el compilador lo dice en lugar de dejar una rama muerta — elimina la comprobación. Sin superficie de preparación — los widgets son solo de visualización (constructor internal: la ventana lo ensambla) |
IStudioCellEditorProvider | interface | Dibuja una celda de cuadrícula para un tipo con nombre. string TypeName (coincide con un tipo de CellParserRegistry o un nombre de wrapper, Ordinal; vacío se excluye) · VisualElement CreateEditor(StudioCellEditorContext) — devolver null declina esa celda y el widget integrado toma el control. Una reclamación duplicada sobre el mismo nombre de tipo avisa y conserva la primera encontrada |
StudioCellEditorContext | sealed class | Lo que recibe el widget de celda: Tab · FieldName · TypeToken Type · CurrentRawText (texto canónico con la preparación aplicada) · Action<string> Commit (un acto puntual — su propio paso de undo) · Action<string> CommitTyping (una ráfaga de teclas — se fusiona por celda) · Func<string,IReadOnlyList<string>> ReferenceKeys (las mismas claves candidatas que ofrece el selector integrado). Ambos commits pasan por la barrera de preparación de la ventana (constructor internal: la ventana lo ensambla) |
IStudioInspectorAction | interface | Un botón extra en el inspector de nodo. string LabelKey (clave de Loc; no registrada = se muestra textualmente, vacía = nombre del tipo) · bool AppliesTo(StudioInspectorContext) · void Execute(StudioInspectorContext) |
StudioInspectorContext | sealed class | Lectura: Tab · RecordId · SheetRecord Record · Tables · References · CodeRegistries. Mutación mediada: Action<string,string,string,string> StageCell · Action<IReadOnlyList<EdgeCellWrite>> StageCells, ambos detallados debajo de la tabla. Servicios: Action<string,int,string> FocusCell · Action RequestRebuild. El AuthoringSession deliberadamente no se expone |
IStudioPanelProvider | interface | Un panel arbitrario de UIToolkit en el panel derecho de Studio — la vía de escape junto al StudioPanelDescriptor descriptivo. string Id · string TitleKey · bool AppliesTo(StudioSurfaceContext) · VisualElement CreatePanel(StudioSurfaceContext) (null no dibuja nada ese ciclo). Registra un panel descriptivo bajo el mismo Id y cada host toma lo que puede dibujar: el editor prefiere este, el navegador dibuja el descriptivo — así que "hasta donde llega el navegador, todo el camino en el editor" no necesita un segundo contrato. El elemento vive un ciclo de recálculo, así que no guarda estado |
StudioPalette | static class | Valores de color, espaciado y tipo de solo lectura con los que la propia ventana pinta, para que un widget que montes coincida con la ventana en lugar de codificar hex a mano. Cada slot se resuelve en el momento de la lectura, así que los widgets siguen el modo de brillo y el preajuste de color gratis. Elegir los valores (preajustes, brillo, predeterminados) permanece internal — los widgets siguen la paleta, no la repintan. La lista de miembros está debajo de la tabla |
StudioTheme | static class | Solo cuatro miembros: CategoryColor(category) (el mismo tono determinista que la ventana le da a esa categoría) · Np(text) (interpolación segura en una etiqueta de rich-text) · Mono / ApplyMono(element) (la política de fuente monoespaciada: solo claves, direcciones y números — las fuentes mono no tienen glifos CJK). Todo lo demás en este tipo es internal |
StudioKeyPicker | static class | Un miembro: Show(Rect screenAnchor, string targetTab, IReadOnlyList<string> candidates, Action<string> picked, string acceptsLabel = null) — el mismo menú desplegable que abre la celda de referencia integrada, para un widget de celda que necesita llegar a una clave dentro de su propia notación. Elige una clave de los candidatos que suministras y la devuelve. Crear un registro, dejar la celda vacía, marcar varios elementos de una lista y preguntar qué puerto recibe la elección son reglas propias de la celda de referencia integrada, así que no están en esta fachada. picked es obligatorio (ArgumentNullException antes de crear ninguna ventana). Sin candidatos y sin nada que ofrecer, registra en el log en lugar de abrir una lista vacía. El tipo de ventana en sí permanece internal |
StudioPluginRegistry | static class | Un miembro público: InvalidateCache() — descarta la caché de descubrimiento por reload para que una sonda que tus propias pruebas acaban de habilitar se vuelva a encontrar (la misma cortesía que ya ofrecían PluginRegistry y SourceProviderRegistry; este era el registro que faltaba). Las listas descubiertas permanecen internal: nada de fuera puede leer o reemplazar lo que la ventana va a montar |
StudioInspectorContext — los dos delegados de preparación:
- StageCell recibe tab, recordId, field y texto canónico en bruto. La ventana registra el paso de Undo, incrementa la generación de proyección y prepara la dirección lógica.
- StageCells hace lo mismo para varias celdas que deben cambiar juntas: un solo paso de Undo nativo, todo o nada. Si una sola no se puede preparar, la sesión no se toca en absoluto.
Un fallo es silencioso en pantalla de todas formas, y solo la barrera se explica a sí misma. Un origen de solo lectura, una canalización ya en ejecución, o una pestaña respaldada por libro escriben su motivo en la consola. Una lista vacía, una escritura sin su pestaña o campo, y una clave de registro que no resuelve a ninguna fila no hacen nada y no dicen nada.
StudioPalette — los miembros:
- 33 slots de color:
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.- Espaciado:
SectionSpace·RowSpace·RuleHeight·ButtonHeight·PrimaryButtonHeight·GlyphWidth. - Tamaños de tipo:
HeadingFontSize·SectionFontSize·CaptionFontSize. FromRgb(uint)·ToHex(uint).
Aprobación de Push (SheetForge.Editor.Push)
| Tipo | Rol |
|---|---|
IPushApprover | bool Approve(PushPlan, string humanSummary) · bool ApproveStructureRewrite(string, bool hasLiveConflicts) — rechazar = cero envío |
AutoPushApprover | Siempre aprueba (para pruebas/automatización) |
Motor de creación (SheetForge.Editor.Structure / .Pipeline / .Export)
| Tipo | Rol y miembros clave |
|---|---|
AuthoringSession | El propietario del estado en preparación (serializable — Undo gratuito + supervivencia a la recarga). Edits · IsolatedEdits · NewRows · StructOps · Reorders · TabRenames · EnumMembers (adiciones de miembro a hoja de enum en preparación) · AssetRegistrations (registros de Addressables preparados — a nivel de proyecto, así que no participan en las barreras por pestaña, pero sí cuentan para la entrada al reflejo, el descarte y el resumen del diff) · HasAssetRegistrations · StageAssetRegistration(r) (el mismo guid, o el mismo grupo para una creación de grupo, reemplaza en el sitio — gana la última intención; un registro sin identidad se rechaza) · RemoveAssetRegistrationsWhere(predicate) · SetStaged · ResolveBaselineEdits · RemapFieldName/RecordId/Tab · StageTabRename · EffectiveStructOps · PendingStructCount · TabNames · TryGetBaselineTable · LastProjectionResult · ClearAll (también limpia los registros) |
AuthoringDispatcher | El orquestador del reflejo. Constructor (session, callbacks, baselines) · Reflect() · BuildProjectionResult() (consulta de proyección sin efectos secundarios) · IReadOnlyDictionary<string,string> BuildProjectedTabs() (la misma proyección como TSV por pestaña — lo que un destino de escritura de vuelta está a punto de enviar, previsualizable sin escribir) · void FinalizeReflectSuccess(IReadOnlyList<string> writtenTabs, IReadOnlyList<TabRenameEntry> committedRenames = null) (el final al que tiene que llegar la propia escritura de vuelta de un origen: la poda de retención para las pestañas que escribió, el límite ClearUndo, y la reimportación automática — las rutas integradas ejecutan el mismo cuerpo privado, así que un proveedor externo termina exactamente igual que ellas; una lista vacía es un no-op que mantiene la preparación intacta) · Session · Callbacks · Baselines |
AuthoringDispatchCallbacks | 13 delegados generales de aspectos de la vista + IPushApprover — ResolveSettings · RenderReport (Action<ImportReport>, tolera null) · TriggerReimport · ConfirmKeyRenames · ConfirmTabRenames (tolera null) · ClearUndo · Rebuild · … Los delegados de diálogo integrados de Local/Google viven en el paquete opcional BuiltInSourceDialogs |
BuiltInSourceDialogs | Paquete opcional de 14 delegados de diálogo de los orígenes integrados Local/Google, separado de AuthoringDispatchCallbacks — los proveedores externos nunca los necesitan. NotifyLocalDone toma cinco argumentos; el último es la línea de resumen de registro de Addressables para el diálogo de finalización (null cuando no se preparó nada) |
BaselineStore (.Export) | Instantáneas de baseline en TSV normalizado, por pestaña |
Tipos de valor de preparación (SheetForge.Editor.Structure; StagedCellEdit/StagedNewRow están en SheetForge.Editor.Windows)
| Tipo | Rol |
|---|---|
StagedCellEdit (struct) | Una edición en preparación — TabName · RowOrdinal · FieldName · RawText · RecordId (clave lógica) |
StagedNewRow | Una fila nueva en preparación — TabName · FieldNames · CellTexts |
StructureOp | Una operación de estructura — Kind · coordenadas · textos · permutación Order |
StructureOpKind (enum) | AddColumn · RemoveColumn · AddMarker · RemoveMarker · RemoveDataRow · ReorderColumns · ReorderDataRows · RenameColumn · EditColumnType · EditColumnDesc · SetColumnOverlap · SetSheetStyle |
TabReorderEntry | El estado de reordenamiento por pestaña — Tab · ColOrder · RowOrder |
TabRenameEntry (struct) | OldName · NewName |
StagedEnumMember (struct) | Un "añadir este miembro a este enum" en preparación — TabName (qué hoja de enum; vacío = buscar en todas) · EnumName · Member. A nivel de sesión en lugar de un StructureOp, por la misma razón que un renombrado de pestaña: una hoja de enum no tiene tabla, ni esquema, ni columna clave, así que la dirección (pestaña, registro, campo) de una edición de celda no puede nombrar "el siguiente miembro de este enum". Público solo porque AuthoringSession.EnumMembers lo es (CS0050) |
StagedAssetRegistration (struct) | Un cambio en preparación a los ajustes de Addressables del proyecto, hecho al soltar o elegir un asset en una celda AssetRef@Group — StagedAssetRegistrationKind Kind · Guid (el asset; un sub-asset prepara a su padre) · Group · FromGroup (solo movimientos) · Address (el nombre del archivo sin extensión para una entrada nueva; un asset ya registrado conserva su dirección) · AssetPath (para mostrar). Fábricas Add(guid, group, address, assetPath) · Move(guid, fromGroup, group, address, assetPath) · CreateGroup(group). Se ejecuta después de que la escritura de la hoja tenga éxito, y luego se limpia. Público solo porque AuthoringSession.AssetRegistrations lo es (CS0050), igual que StagedEnumMember |
StagedAssetRegistrationKind (enum) | Add · Move · CreateGroup |
TabBaselineAnchor (struct) | TabName · Fingerprint · RecordCount |
IsolatedEdit | Una edición cuyo reanclaje falló — Edit · Reason |
IsolationReason (enum) | Renombrado externo / eliminación externa / conflicto de clave |
Ayudantes de creación (SheetForge.Editor.Windows / .Structure)
| Tipo | Rol |
|---|---|
KeyRenamePlanner (static) | Planificación de renombrado de clave + propagación entre pestañas. Plan(…) · KeyRenamePlan anidado · struct hermano KeyRename |
RecordIdMinter (static, pure) | Sugerencias de id. Suggest · DetectCommonPrefix · Uniquify · StagedNewRowKeys |
IntIdMinter (static, pure) | Sugerencia del siguiente IntId para un registro nuevo — Suggest(existingIds) → max + 1. Un eje separado de RecordIdMinter, y nunca reutiliza un hueco eliminado |
ProjectionErrorMapper (static, pure) | Coordenada de error → dirección lógica. TryMap(…) · LogicalAddress anidado |
EphemeralSoApply (static) | Superposición temporal de valores en preparación sobre el SO. Apply(…) · InvalidateIndex(…) · Report / SkipReason / SkippedEdit anidados |
Ensamblado Runtime (SheetForge.Runtime)
autoReferenced — utilizable desde el código del juego sin una referencia de asmdef.
| Tipo | Rol y miembros clave |
|---|---|
SheetForgeDatabases (static) | El cargador de runtime — la ruta de carga sancionada. const AddressPrefix = "SheetForge/" · AddressFor(tab) · LoadAsync(tab) · LoadAsync<TDatabase>(tab) · Release(handle) / Release<TDatabase>(db). Los ayudantes de dirección son strings simples y siempre compilan; LoadAsync y Release solo existen bajo SHEETFORGE_ADDRESSABLES, el version-define que se activa cuando com.unity.addressables está instalado — que es lo que permite que el producto compile sin el paquete |
DefinitionDatabase (abstract SO) | La base de todo Database generado por pestaña. abstract TabName · abstract Count · virtual IReadOnlyList<object> RecordsUntyped · virtual InvalidateIndex(). RecordsUntyped es la forma sancionada de enumerar una pestaña horneada (bake) sin conocer su tipo generado — un segundo baker o un inspector que recorre todas las pestañas solía tener que usar reflexión sobre el campo privado records, lo que convertía un nombre de campo en un contrato no declarado que se rompería en silencio el día que el codegen lo renombrara. Trata la lista como de solo lectura (la hoja es canónica). Su valor predeterminado es vacío, así que el código generado de antes de que este miembro existiera sigue compilando y funcionando; una reimportación emite el override |
RecordRef (struct) | El valor de referencia serializado dentro de los SO generados mediante bake (id de tipo string, resuelto en la consulta). Id · IsEmpty |
IntRef (struct) | El valor de referencia serializado de clave entera dentro de los SO generados mediante bake — el gemelo de RecordRef para los campos IntId@Tab. Como 0 es un id válido, un bit hasValue respalda IsEmpty. Id · IsEmpty. El codegen emite un campo IntId@Tab como IntRef, y TryGet(IntRef) en la Database generada lo consume |
LocRef (struct) | La referencia de localización serializada dentro de los SO generados mediante bake — una celda LocRef@Tab. Table (la pestaña de localización, que es el nombre de la colección StringTable) · Key · long KeyId (0 significa "aún no resuelto": una importación hace bake de 0 y el puente rellena el id real después de una sincronización de tabla, así que una referencia sobrevive al renombrado de una clave) · IsEmpty. Siempre compila — el código generado y los assets generados mediante bake nunca contienen un tipo del paquete de localización, que es lo que mantiene el paquete opcional |
LocRefExtensions (static) | Un único miembro: LocalizedString ToLocalizedString(this LocRef) — apunta por KeyId cuando ese no es 0 y por nombre de clave en caso contrario, y una referencia vacía se convierte en un LocalizedString vacío. Existe solo cuando com.unity.localization está instalado, bajo el version-define SHEETFORGE_LOCALIZATION — la misma disposición que usa SHEETFORGE_ADDRESSABLES para la capa de Addressables |
SheetForgeRuntimeInfo (static) | const Version |
Tipos generados (patrón — por proyecto, no es API distribuida)
Para cada pestaña Foo, el codegen emite en tu 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
}Carga con SheetForgeDatabases.LoadAsync<FooDatabase>("Foo").
Ambas clases se emiten como partial, así que puedes añadir miembros derivados — una propiedad calculada, una implementación de interfaz, un operador — en tu propio archivo junto al generado, y una reimportación no lo sobrescribirá. Un límite: no añadas campos serializados en tu parte. El ScriptableObject horneado (bake) se reconstruye desde la hoja en cada importación, así que cualquier cosa que solo serialice tu parte vuelve a su valor predeterminado — si un valor pertenece a los datos, pertenece a una columna. (La palabra clave partial no afecta a SchemaFingerprint, que se calcula solo a partir del esquema, así que hacer las clases partial no invalidó ni un solo bake existente.)
Otros ensamblados
-
SheetForge.Setup— el bootstrap sin dependencias para la ausencia de Addressables. Sin API pública (todo internal; existe para mostrar una ventana de orientación). -
SheetForge.PluginDemo(un asmdef combinado + un asmdef Demo.Editor; el namespace del contenido sigue siendoSheetForge.Skills) — el paquete de ejemplo de referencia, no es API del producto. Contiene:SkillsPlugin(siete interfaces de plugin — base, validador, arista, plantilla, grafo, registro de código, tema);Modifier+ModifierCellParser(tipo de celda personalizado),ModifierStatEdgeContributor(contribuyente de aristas);ExamplePipelineAugmenter/ExampleReactiveAugmenter(overrides de lienzo),ExampleCodeAtoms(el registro de código_Refs);ExampleStudioUi(acciones declarativas, panel, insignia de columna y pista de editor de celda),ExampleImportObserver(observador de canalización);ExampleStageStripWidget/ExampleInspectorAction/ExampleStudioPanel(puntos de extensión del Editor de Data Studio, pintados desde la paleta pública),ExampleLocStrings(registra esas etiquetas en dos idiomas — en el ensamblado principal, así que el navegador también las muestra);- una declaración
SheetForgePluginCompata nivel de ensamblado; SkillRunner(consumo en runtime), tiposExample*generados en el espacio de nombres predeterminadoSheetForge.Generated(el aislamiento es mediante el prefijoExample*, no un espacio de nombres separado).
El ejemplo sin plugin
SheetForge.CoreDemose distribuye con cero asmdefs (compila dentro deAssembly-CSharp).
Páginas relacionadas
- Creación de plugins — los contratos en uso, con ejemplos completos
- Núcleo de creación — los tipos del motor en contexto
- Capacidades y límites — los límites de comportamiento de estas API