diff --git a/src/mol-state/state/builder.ts b/src/mol-state/state/builder.ts index ec0bab0c3c2e4c245a4c614b39d4fd912adc736a..824cf3561eb8af52533f44bab4c222f581d42669 100644 --- a/src/mol-state/state/builder.ts +++ b/src/mol-state/state/builder.ts @@ -9,6 +9,7 @@ import { TransientTree } from '../tree/transient'; import { StateObject, StateObjectCell } from '../object'; import { StateTransform } from '../transform'; import { StateTransformer } from '../transformer'; +import { State } from 'mol-state/state'; export { StateBuilder } @@ -24,7 +25,7 @@ namespace StateBuilder { lastUpdate?: StateTransform.Ref } - interface State { + interface BuildState { tree: TransientTree, editInfo: EditInfo } @@ -38,7 +39,7 @@ namespace StateBuilder { } export class Root implements StateBuilder { - private state: State; + private state: BuildState; get editInfo() { return this.state.editInfo; } to<A extends StateObject>(ref: StateTransform.Ref) { return new To<A>(this.state, ref, this); } @@ -90,8 +91,30 @@ namespace StateBuilder { return new To(this.state, t.ref, this.root); } + /** + * Updates a transform in an instantiated tree, passing the transform's source into the providers + * + * This only works if the transform source is NOT updated by the builder. Use at own discression. + */ + updateInState<T extends StateTransformer<any, A, any>>(transformer: T, state: State, provider: (old: StateTransformer.Params<T>, a: StateTransformer.From<T>) => StateTransformer.Params<T>): Root { + const old = this.state.tree.transforms.get(this.ref)!; + const cell = state.cells.get(this.ref); + if (!cell || !cell.sourceRef) throw new Error('Source cell is not present in the tree.'); + const parent = state.cells.get(cell.sourceRef); + if (!parent || !parent.obj) throw new Error('Parent cell is not present or computed.'); + + const params = provider(old.params as any, parent.obj as any); + + if (this.state.tree.setParams(this.ref, params)) { + this.editInfo.count++; + this.editInfo.lastUpdate = this.ref; + } + + return this.root; + } + update<T extends StateTransformer<any, A, any>>(transformer: T, params: (old: StateTransformer.Params<T>) => StateTransformer.Params<T>): Root - update(params: any): Root + update<T extends StateTransformer<any, A, any> = StateTransformer<any, A, any>>(params: StateTransformer.Params<T>): Root update<T extends StateTransformer<any, A, any>>(paramsOrTransformer: T, provider?: (old: StateTransformer.Params<T>) => StateTransformer.Params<T>) { let params: any; if (provider) { @@ -115,7 +138,7 @@ namespace StateBuilder { getTree(): StateTree { return this.state.tree.asImmutable(); } - constructor(private state: State, ref: StateTransform.Ref, private root: Root) { + constructor(private state: BuildState, ref: StateTransform.Ref, private root: Root) { this.ref = ref; if (!this.state.tree.transforms.has(ref)) { throw new Error(`Could not find node '${ref}'.`); diff --git a/src/servers/model/server/query.ts b/src/servers/model/server/query.ts index f1079596487273caec14432f1fbbc0afc7274063..a9cd4c754a90e9d56ab0c23554feee44b589673e 100644 --- a/src/servers/model/server/query.ts +++ b/src/servers/model/server/query.ts @@ -30,7 +30,7 @@ const perf = new PerformanceMonitor(); let _propertyProvider: ModelPropertiesProvider; function propertyProvider() { if (_propertyProvider) return _propertyProvider; - _propertyProvider = createModelPropertiesProviderFromConfig(); + _propertyProvider = createModelPropertiesProviderFromConfig() || (() => []); return _propertyProvider; } @@ -156,7 +156,7 @@ const _model_server_stats_fields: CifField<number, Stats>[] = [ const _model_server_result: CifWriter.Category<Job> = { name: 'model_server_result', - instance: (job) => CifWriter.categoryInstance(_model_server_result_fields,{ data: job, rowCount: 1 }) + instance: (job) => CifWriter.categoryInstance(_model_server_result_fields, { data: job, rowCount: 1 }) }; const _model_server_error: CifWriter.Category<string> = {