Browse Source

seperated autoAttach from property params in custom property transform

Alexander Rose 5 years ago
parent
commit
46cfb42cce

+ 1 - 1
src/apps/basic-wrapper/index.ts

@@ -63,7 +63,7 @@ class BasicWrapper {
 
         return parsed
             .apply(StateTransforms.Model.ModelFromTrajectory, { modelIndex: 0 })
-            .apply(StateTransforms.Model.CustomModelProperties, { properties: [StripedResidues.propertyProvider.descriptor.name] }, { ref: 'props', state: { isGhost: false } })
+            .apply(StateTransforms.Model.CustomModelProperties, { autoAttach: [StripedResidues.propertyProvider.descriptor.name], properties: {} }, { ref: 'props', state: { isGhost: false } })
             .apply(StateTransforms.Model.StructureAssemblyFromModel, { id: assemblyId || 'deposited' }, { ref: 'asm' });
     }
 

+ 1 - 1
src/examples/proteopedia-wrapper/index.ts

@@ -94,7 +94,7 @@ class MolStarProteopediaWrapper {
         const model = this.state.build().to(StateElements.Model);
 
         const s = model
-            .apply(StateTransforms.Model.CustomModelProperties, { properties: [EvolutionaryConservation.propertyProvider.descriptor.name] }, { ref: StateElements.ModelProps, state: { isGhost: false } })
+            .apply(StateTransforms.Model.CustomModelProperties, { autoAttach: [EvolutionaryConservation.propertyProvider.descriptor.name], properties: {} }, { ref: StateElements.ModelProps, state: { isGhost: false } })
             .apply(StateTransforms.Model.StructureAssemblyFromModel, { id: assemblyId || 'deposited' }, { ref: StateElements.Assembly });
 
         s.apply(StateTransforms.Model.StructureComplexElement, { type: 'atomic-sequence' }, { ref: StateElements.Sequence });

+ 18 - 7
src/mol-model-props/common/custom-property.ts

@@ -41,21 +41,32 @@ namespace CustomProperty {
 
         /** Get params for all applicable property providers */
         getParams(data?: Data) {
-            const params: PD.Params = {}
+            const propertiesParams: PD.Params = {}
+            const autoAttachOptions: [string, string][] = []
+            const autoAttachDefault: string[] = []
             if (data) {
-            const values = this.providers.values();
+                const values = this.providers.values();
                 while (true) {
                     const v = values.next()
                     if (v.done) break
+
                     const provider = v.value
                     if (!provider.isApplicable(data)) continue
-                    params[provider.descriptor.name] = PD.Group({
-                        autoAttach: PD.Boolean(this.defaultAutoAttachValues.get(provider.descriptor.name)!),
-                        ...provider.getParams(data),
-                    }, { label: v.value.label })
+
+                    autoAttachOptions.push([provider.descriptor.name, provider.label])
+                    if (this.defaultAutoAttachValues.get(provider.descriptor.name)) {
+                        autoAttachDefault.push(provider.descriptor.name)
+                    }
+
+                    propertiesParams[provider.descriptor.name] = PD.Group({
+                        ...provider.getParams(data)
+                    }, { label: provider.label })
                 }
             }
-            return params
+            return {
+                autoAttach: PD.MultiSelect(autoAttachDefault, autoAttachOptions),
+                properties: PD.Group(propertiesParams, { isFlat: true })
+            }
         }
 
         setDefaultAutoAttach(name: string, value: boolean) {

+ 9 - 7
src/mol-plugin/state/transforms/model.ts

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author David Sehnal <david.sehnal@gmail.com>
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
@@ -713,12 +713,13 @@ const CustomModelProperties = PluginStateTransform.BuiltIn({
         });
     }
 });
-async function attachModelProps(model: Model, ctx: PluginContext, taskCtx: RuntimeContext, params: PD.Values<PD.Params>) {
+async function attachModelProps(model: Model, ctx: PluginContext, taskCtx: RuntimeContext, params: ReturnType<CustomModelProperties['createDefaultParams']>) {
     const propertyCtx = { runtime: taskCtx, fetch: ctx.fetch }
-    for (const name of Object.keys(params)) {
+    const { autoAttach, properties } = params
+    for (const name of Object.keys(properties)) {
         const property = ctx.customModelProperties.get(name)
         const props = params[name as keyof typeof params]
-        if (props.autoAttach) {
+        if (autoAttach.includes(name)) {
             try {
                 await property.attach(propertyCtx, model, props)
             } catch (e) {
@@ -747,12 +748,13 @@ const CustomStructureProperties = PluginStateTransform.BuiltIn({
         });
     }
 });
-async function attachStructureProps(structure: Structure, ctx: PluginContext, taskCtx: RuntimeContext, params: PD.Values<PD.Params>) {
+async function attachStructureProps(structure: Structure, ctx: PluginContext, taskCtx: RuntimeContext, params: ReturnType<CustomStructureProperties['createDefaultParams']>) {
     const propertyCtx = { runtime: taskCtx, fetch: ctx.fetch }
-    for (const name of Object.keys(params)) {
+    const { autoAttach, properties } = params
+    for (const name of Object.keys(properties)) {
         const property = ctx.customStructureProperties.get(name)
         const props = params[name as keyof typeof params]
-        if (props.autoAttach) {
+        if (autoAttach.includes(name)) {
             try {
                 await property.attach(propertyCtx, structure, props)
             } catch (e) {