From 72dd2fbe76a16a220d044c6df7a3b3e4d08bbf80 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Wed, 21 Nov 2018 16:51:38 +0100 Subject: [PATCH] mol-plugin: tweaks --- src/mol-plugin/index.ts | 6 ++--- src/mol-plugin/state/actions/basic.ts | 36 +++++++++++++-------------- src/mol-util/param-definition.ts | 1 + 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/mol-plugin/index.ts b/src/mol-plugin/index.ts index dca8203d8..648029b6d 100644 --- a/src/mol-plugin/index.ts +++ b/src/mol-plugin/index.ts @@ -10,7 +10,7 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; import { PluginCommands } from './command'; import { PluginSpec } from './spec'; -import { DownloadAtomicStructure, CreateComplexRepresentation, OpenAtomicStructure } from './state/actions/basic'; +import { DownloadStructure, CreateComplexRepresentation, OpenStructure } from './state/actions/basic'; import { StateTransforms } from './state/transforms'; import { PluginBehaviors } from './behavior'; @@ -21,8 +21,8 @@ function getParam(name: string, regex: string): string { const DefaultSpec: PluginSpec = { actions: [ - PluginSpec.Action(DownloadAtomicStructure), - PluginSpec.Action(OpenAtomicStructure), + PluginSpec.Action(DownloadStructure), + PluginSpec.Action(OpenStructure), PluginSpec.Action(CreateComplexRepresentation), PluginSpec.Action(StateTransforms.Data.Download), PluginSpec.Action(StateTransforms.Data.ParseCif), diff --git a/src/mol-plugin/state/actions/basic.ts b/src/mol-plugin/state/actions/basic.ts index 152e549b0..95e00158c 100644 --- a/src/mol-plugin/state/actions/basic.ts +++ b/src/mol-plugin/state/actions/basic.ts @@ -17,32 +17,30 @@ import { StateTreeBuilder } from 'mol-state/tree/builder'; // TODO: "structure parser provider" -export { DownloadAtomicStructure } -namespace DownloadAtomicStructure { - export type Sources = 'pdbe-updated' | 'rcsb' | 'bcif-static' | 'url' - export type Source = ObtainStructureHelpers.MapParams<Sources, typeof ObtainStructureHelpers.ControlMap> +export { DownloadStructure } +namespace DownloadStructure { + export type Source = PD.NamedParamUnion<ObtainStructureHelpers.ControlMap> export interface Params { source: Source } } namespace ObtainStructureHelpers { - export const SourceOptions: [DownloadAtomicStructure.Sources, string][] = [ - ['pdbe-updated', 'PDBe Updated'], - ['rcsb', 'RCSB'], - ['bcif-static', 'BinaryCIF (static PDBe Updated)'], - ['url', 'URL'] - ]; export const ControlMap = { 'pdbe-updated': PD.Text('1cbs', { label: 'Id' }), 'rcsb': PD.Text('1tqn', { label: 'Id' }), 'bcif-static': PD.Text('1tqn', { label: 'Id' }), 'url': PD.Group({ url: PD.Text(''), isBinary: PD.Boolean(false) }, { isExpanded: true }) } - export function getControls(key: string) { return (ControlMap as any)[key]; } - - export type MapParams<P extends DownloadAtomicStructure.Sources, Map extends { [K in P]: PD.Any }> = P extends DownloadAtomicStructure.Sources ? PD.NamedParams<Map[P]['defaultValue'], P> : never + export type ControlMap = typeof ControlMap + export const SourceOptions: [keyof ControlMap, string][] = [ + ['pdbe-updated', 'PDBe Updated'], + ['rcsb', 'RCSB'], + ['bcif-static', 'BinaryCIF (static PDBe Updated)'], + ['url', 'URL'] + ]; - export function getUrl(src: DownloadAtomicStructure.Source): Download.Params { + export function getControls(key: string) { return (ControlMap as any)[key]; } + export function getUrl(src: DownloadStructure.Source): Download.Params { switch (src.name) { case 'url': return src.params; case 'pdbe-updated': return { url: `https://www.ebi.ac.uk/pdbe/static/entry/${src.params.toLowerCase()}_updated.cif`, isBinary: false, label: `PDBe: ${src.params}` }; @@ -52,7 +50,7 @@ namespace ObtainStructureHelpers { } } } -const DownloadAtomicStructure = StateAction.create<PluginStateObject.Root, void, DownloadAtomicStructure.Params>({ +const DownloadStructure = StateAction.create<PluginStateObject.Root, void, DownloadStructure.Params>({ from: [PluginStateObject.Root], display: { name: 'Download Structure', @@ -76,11 +74,11 @@ const DownloadAtomicStructure = StateAction.create<PluginStateObject.Root, void, const url = ObtainStructureHelpers.getUrl(params.source); const data = b.toRoot().apply(StateTransforms.Data.Download, url); - return state.update(atomicStructureTree(data)); + return state.update(createStructureTree(data)); } }); -export const OpenAtomicStructure = StateAction.create<PluginStateObject.Root, void, { file: File }>({ +export const OpenStructure = StateAction.create<PluginStateObject.Root, void, { file: File }>({ from: [PluginStateObject.Root], display: { name: 'Open Structure', @@ -90,11 +88,11 @@ export const OpenAtomicStructure = StateAction.create<PluginStateObject.Root, vo 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(atomicStructureTree(data)); + return state.update(createStructureTree(data)); } }); -function atomicStructureTree(b: StateTreeBuilder.To<PluginStateObject.Data.Binary | PluginStateObject.Data.String>): StateTree { +function createStructureTree(b: StateTreeBuilder.To<PluginStateObject.Data.Binary | PluginStateObject.Data.String>): StateTree { const root = b .apply(StateTransforms.Data.ParseCif) .apply(StateTransforms.Model.TrajectoryFromMmCif, {}) diff --git a/src/mol-util/param-definition.ts b/src/mol-util/param-definition.ts index 5f1f2b7ec..a31e1e2c8 100644 --- a/src/mol-util/param-definition.ts +++ b/src/mol-util/param-definition.ts @@ -146,6 +146,7 @@ export namespace ParamDefinition { } export interface NamedParams<T = any, K = string> { name: K, params: T } + export type NamedParamUnion<P extends Params, K = keyof P> = K extends any ? NamedParams<P[K]['defaultValue'], K> : never export interface Mapped<T> extends Base<NamedParams<T>> { type: 'mapped', select: Select<string>, -- GitLab