Skip to content
Snippets Groups Projects
Commit e0598c77 authored by David Sehnal's avatar David Sehnal
Browse files

add StateBuilder.updateInState, fix in model-server

parent fef058ed
No related branches found
No related tags found
No related merge requests found
...@@ -9,6 +9,7 @@ import { TransientTree } from '../tree/transient'; ...@@ -9,6 +9,7 @@ import { TransientTree } from '../tree/transient';
import { StateObject, StateObjectCell } from '../object'; import { StateObject, StateObjectCell } from '../object';
import { StateTransform } from '../transform'; import { StateTransform } from '../transform';
import { StateTransformer } from '../transformer'; import { StateTransformer } from '../transformer';
import { State } from 'mol-state/state';
export { StateBuilder } export { StateBuilder }
...@@ -24,7 +25,7 @@ namespace StateBuilder { ...@@ -24,7 +25,7 @@ namespace StateBuilder {
lastUpdate?: StateTransform.Ref lastUpdate?: StateTransform.Ref
} }
interface State { interface BuildState {
tree: TransientTree, tree: TransientTree,
editInfo: EditInfo editInfo: EditInfo
} }
...@@ -38,7 +39,7 @@ namespace StateBuilder { ...@@ -38,7 +39,7 @@ namespace StateBuilder {
} }
export class Root implements StateBuilder { export class Root implements StateBuilder {
private state: State; private state: BuildState;
get editInfo() { return this.state.editInfo; } get editInfo() { return this.state.editInfo; }
to<A extends StateObject>(ref: StateTransform.Ref) { return new To<A>(this.state, ref, this); } to<A extends StateObject>(ref: StateTransform.Ref) { return new To<A>(this.state, ref, this); }
...@@ -90,8 +91,30 @@ namespace StateBuilder { ...@@ -90,8 +91,30 @@ namespace StateBuilder {
return new To(this.state, t.ref, this.root); 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<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>) { update<T extends StateTransformer<any, A, any>>(paramsOrTransformer: T, provider?: (old: StateTransformer.Params<T>) => StateTransformer.Params<T>) {
let params: any; let params: any;
if (provider) { if (provider) {
...@@ -115,7 +138,7 @@ namespace StateBuilder { ...@@ -115,7 +138,7 @@ namespace StateBuilder {
getTree(): StateTree { return this.state.tree.asImmutable(); } 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; this.ref = ref;
if (!this.state.tree.transforms.has(ref)) { if (!this.state.tree.transforms.has(ref)) {
throw new Error(`Could not find node '${ref}'.`); throw new Error(`Could not find node '${ref}'.`);
......
...@@ -30,7 +30,7 @@ const perf = new PerformanceMonitor(); ...@@ -30,7 +30,7 @@ const perf = new PerformanceMonitor();
let _propertyProvider: ModelPropertiesProvider; let _propertyProvider: ModelPropertiesProvider;
function propertyProvider() { function propertyProvider() {
if (_propertyProvider) return _propertyProvider; if (_propertyProvider) return _propertyProvider;
_propertyProvider = createModelPropertiesProviderFromConfig(); _propertyProvider = createModelPropertiesProviderFromConfig() || (() => []);
return _propertyProvider; return _propertyProvider;
} }
...@@ -156,7 +156,7 @@ const _model_server_stats_fields: CifField<number, Stats>[] = [ ...@@ -156,7 +156,7 @@ const _model_server_stats_fields: CifField<number, Stats>[] = [
const _model_server_result: CifWriter.Category<Job> = { const _model_server_result: CifWriter.Category<Job> = {
name: 'model_server_result', 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> = { const _model_server_error: CifWriter.Category<string> = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment