diff --git a/src/mol-plugin/state/actions/basic.ts b/src/mol-plugin/state/actions/basic.ts index b1b2bacc5299487861a5c245db23909bbd512038..bb7a990df0dc084cdb1f27bd7d54d9602ced27ad 100644 --- a/src/mol-plugin/state/actions/basic.ts +++ b/src/mol-plugin/state/actions/basic.ts @@ -60,7 +60,7 @@ const DownloadStructure = StateAction.create<PluginStateObject.Root, void, Downl description: 'Load a structure from PDBe and create its default Assembly and visual' }, params: () => ({ source: PD.Mapped('bcif-static', ObtainStructureHelpers.SourceOptions, ObtainStructureHelpers.getControls) }), - apply({ params, state }) { + run({ params, state }) { const b = state.build(); // const query = MolScriptBuilder.struct.generator.atomGroups({ @@ -85,12 +85,10 @@ export const OpenStructure = StateAction.build({ display: { name: 'Open Structure', description: 'Load a structure from file and create its default Assembly and visual' }, from: PluginStateObject.Root, params: { file: PD.File({ accept: '.cif,.bcif' }) } -})({ - apply({ params, state }) { - const b = state.build(); - const data = b.toRoot().apply(StateTransforms.Data.ReadFile, { file: params.file, isBinary: /\.bcif$/i.test(params.file.name) }); - return state.update(createStructureTree(data)); - } +})(({ params, state }) => { + const b = state.build(); + const data = b.toRoot().apply(StateTransforms.Data.ReadFile, { file: params.file, isBinary: /\.bcif$/i.test(params.file.name) }); + return state.update(createStructureTree(data)); }); function createStructureTree(b: StateTreeBuilder.To<PluginStateObject.Data.Binary | PluginStateObject.Data.String>): StateTree { @@ -125,18 +123,16 @@ function complexRepresentation(root: StateTreeBuilder.To<PluginStateObject.Molec sizeTheme: { name: 'uniform', params: PD.getDefaultValues(UniformSizeThemeParams) }, }) root.apply(StateTransforms.Model.StructureComplexElement, { type: 'spheres' }); - // TODO: create spheres visual + // TODO: create spheres visual } export const CreateComplexRepresentation = StateAction.build({ display: { name: 'Create Complex', description: 'Split the structure into Sequence/Water/Ligands/... ' }, from: PluginStateObject.Molecule.Structure -})({ - apply({ ref, state }) { - const root = state.build().to(ref); - complexRepresentation(root); - return state.update(root.getTree()); - } +})(({ ref, state }) => { + const root = state.build().to(ref); + complexRepresentation(root); + return state.update(root.getTree()); }); export const UpdateTrajectory = StateAction.build({ @@ -145,32 +141,30 @@ export const UpdateTrajectory = StateAction.build({ action: PD.Select<'advance' | 'reset'>('advance', [['advance', 'Advance'], ['reset', 'Reset']]), by: PD.makeOptional(PD.Numeric(1, { min: -1, max: 1, step: 1 })) } -})({ - apply({ params, state }) { - const models = state.select(q => q.rootsOfType(PluginStateObject.Molecule.Model) - .filter(c => c.transform.transformer === StateTransforms.Model.ModelFromTrajectory)); - - const update = state.build(); - - if (params.action === 'reset') { - for (const m of models) { - update.to(m.transform.ref).update(StateTransforms.Model.ModelFromTrajectory, - () => ({ modelIndex: 0 })); - } - } else { - for (const m of models) { - const parent = StateSelection.findAncestorOfType(state.tree, state.cells, m.transform.ref, [PluginStateObject.Molecule.Trajectory]); - if (!parent || !parent.obj) continue; - const traj = parent.obj as PluginStateObject.Molecule.Trajectory; - update.to(m.transform.ref).update(StateTransforms.Model.ModelFromTrajectory, - old => { - let modelIndex = (old.modelIndex + params.by!) % traj.data.length; - if (modelIndex < 0) modelIndex += traj.data.length; - return { modelIndex }; - }); - } - } +})(({ params, state }) => { + const models = state.select(q => q.rootsOfType(PluginStateObject.Molecule.Model) + .filter(c => c.transform.transformer === StateTransforms.Model.ModelFromTrajectory)); + + const update = state.build(); - return state.update(update); + if (params.action === 'reset') { + for (const m of models) { + update.to(m.transform.ref).update(StateTransforms.Model.ModelFromTrajectory, + () => ({ modelIndex: 0 })); + } + } else { + for (const m of models) { + const parent = StateSelection.findAncestorOfType(state.tree, state.cells, m.transform.ref, [PluginStateObject.Molecule.Trajectory]); + if (!parent || !parent.obj) continue; + const traj = parent.obj as PluginStateObject.Molecule.Trajectory; + update.to(m.transform.ref).update(StateTransforms.Model.ModelFromTrajectory, + old => { + let modelIndex = (old.modelIndex + params.by!) % traj.data.length; + if (modelIndex < 0) modelIndex += traj.data.length; + return { modelIndex }; + }); + } } + + return state.update(update); }); \ No newline at end of file diff --git a/src/mol-state/action.ts b/src/mol-state/action.ts index 47b9540b2134bd12e18714b541ecaa898da65984..1b178246fbc2fe31d421b4c116db744492117813 100644 --- a/src/mol-state/action.ts +++ b/src/mol-state/action.ts @@ -42,7 +42,7 @@ namespace StateAction { /** * Apply an action that modifies the State specified in Params. */ - apply(params: ApplyParams<A, P>, globalCtx: unknown): T | Task<T>, + run(params: ApplyParams<A, P>, globalCtx: unknown): T | Task<T>, /** Test if the transform can be applied to a given node */ isApplicable?(a: A, globalCtx: unknown): boolean @@ -69,7 +69,7 @@ namespace StateAction { from: def.from, display: def.display, params: def.params as Transformer.Definition<Transformer.From<T>, any, Transformer.Params<T>>['params'], - apply({ cell, state, params }) { + run({ cell, state, params }) { const tree = state.build().to(cell.transform.ref).apply(transformer, params); return state.update(tree); } @@ -88,7 +88,7 @@ namespace StateAction { } export interface Define<A extends StateObject, P> { - <T>(def: DefinitionBase<A, T, P>): StateAction<A, T, P>, + <T>(def: DefinitionBase<A, T, P> | DefinitionBase<A, T, P>['run']): StateAction<A, T, P>, } function root(info: Type<any, any>): Define<any, any> { @@ -106,7 +106,9 @@ namespace StateAction { : !!info.params ? info.params as any : void 0, - ...def + ...(typeof def === 'function' + ? { run: def } + : def) }); } diff --git a/src/mol-state/state.ts b/src/mol-state/state.ts index e9ed797ff0b91449b4b43d3fbf4303ae70b49f75..75f801a682472e0cffe640268c5b49ba8122cbfa 100644 --- a/src/mol-state/state.ts +++ b/src/mol-state/state.ts @@ -104,7 +104,7 @@ class State { if (!cell) throw new Error(`'${ref}' does not exist.`); if (cell.status !== 'ok') throw new Error(`Action cannot be applied to a cell with status '${cell.status}'`); - return runTask(action.definition.apply({ ref, cell, a: cell.obj!, params, state: this }, this.globalContext), ctx); + return runTask(action.definition.run({ ref, cell, a: cell.obj!, params, state: this }, this.globalContext), ctx); }); }