Browse Source

mol-plugin-ui: do not auto-apply symmetry structure types

David Sehnal 5 years ago
parent
commit
eaffdc6a98

+ 8 - 29
src/mol-plugin-state/manager/structure/hierarchy.ts

@@ -8,12 +8,10 @@
 import { setSubtreeVisibility } from '../../../mol-plugin/behavior/static/state';
 import { PluginCommands } from '../../../mol-plugin/commands';
 import { PluginContext } from '../../../mol-plugin/context';
-import { StateTransform, StateTransformer, StateTree } from '../../../mol-state';
+import { StateTransform, StateTree } from '../../../mol-state';
 import { SetUtils } from '../../../mol-util/set';
 import { TrajectoryHierarchyPresetProvider } from '../../builder/structure/hierarchy-preset';
 import { PluginComponent } from '../../component';
-import { RootStructureDefinition } from '../../helpers/root-structure';
-import { StateTransforms } from '../../transforms';
 import { buildStructureHierarchy, HierarchyRef, ModelRef, StructureComponentRef, StructureHierarchy, StructureRef, TrajectoryRef } from './hierarchy-state';
 
 export class StructureHierarchyManager extends PluginComponent {
@@ -167,33 +165,14 @@ export class StructureHierarchyManager extends PluginComponent {
         });
     }
 
-    private _updateStructure(s: StructureRef, params: any, recreateRepresentation: boolean) {
-        return this.plugin.dataTransaction(async () => {
-            if (recreateRepresentation) {
-                const root = StateTree.getDecoratorRoot(this.dataState.tree, s.cell.transform.ref);
-                const children = this.dataState.tree.children.get(root).toArray();
-                await this.remove(children, false);
-            }
+    async updateStructure(s: StructureRef, params: any) {
+        await this.plugin.dataTransaction(async () => {
+            const root = StateTree.getDecoratorRoot(this.dataState.tree, s.cell.transform.ref);
+            const children = this.dataState.tree.children.get(root).toArray();
+            await this.remove(children, false);
             await this.plugin.state.updateTransform(this.plugin.state.data, s.cell.transform.ref, params, 'Structure Type');
-            if (recreateRepresentation) {
-                await this.plugin.builders.structure.representation.applyPreset(s.cell.transform.ref, 'auto');
-            }
-        }, { canUndo: 'Structure Type' })
-    }
-
-    async updateStructure(s: StructureRef, newParams: any) {
-        if (s.cell.transform.transformer === StateTransforms.Model.StructureFromModel) {
-            const old = s.cell.transform.params! as StateTransformer.Params<StateTransforms['Model']['StructureFromModel']>;
-            const params = newParams as StateTransformer.Params<StateTransforms['Model']['StructureFromModel']>;
-
-            if (RootStructureDefinition.isSymmetryType(old.type) && RootStructureDefinition.isSymmetryType(params.type)) {
-                await this._updateStructure(s, newParams, false);
-            } else {
-                await this._updateStructure(s, newParams, true);
-            }
-        } else {
-            await this._updateStructure(s, newParams, true);
-        }
+            await this.plugin.builders.structure.representation.applyPreset(s.cell.transform.ref, 'auto');
+        }, { canUndo: 'Structure Type' });
         PluginCommands.Camera.Reset(this.plugin);
     }
 

+ 3 - 0
src/mol-plugin-state/transforms/model.ts

@@ -279,6 +279,9 @@ const StructureFromModel = PluginStateTransform.BuiltIn({
     to: SO.Molecule.Structure,
     params(a) { return RootStructureDefinition.getParams(a && a.data); }
 })({
+    canAutoUpdate({ newParams }) {
+        return !RootStructureDefinition.isSymmetryType(newParams.type);
+    },
     apply({ a, params }, plugin: PluginContext) {
         return Task.create('Build Structure', async ctx => {
             return RootStructureDefinition.create(plugin, ctx, a.data, params && params.type);

+ 14 - 14
src/mol-plugin-ui/state/common.tsx

@@ -187,20 +187,20 @@ abstract class TransformControlBase<P, S extends TransformControlBase.ComponentS
         // const showBack = this.isUpdate() && !(this.state.busy || this.state.isInitial);
         const canApply = this.canApply();
 
-        return this.props.autoHideApply && !canApply
-            ? null
-            : <div className='msp-transform-apply-wrap'>
-                <button className='msp-btn msp-btn-block msp-form-control msp-transform-default-params' onClick={this.setDefault} disabled={this.state.busy} title='Set default params'><Icon name='cw' /></button>
-                {/* {showBack && <Button className='msp-btn msp-btn-block msp-form-control msp-transform-refresh msp-form-control' title='Refresh params' onClick={this.refresh} disabled={this.state.busy || this.state.isInitial}>
-                    <Icon name='back' /> Back
-                </Button>}
-                <div className={`msp-transform-apply${!showBack ? ' msp-transform-apply-wider' : ''}`}> */}
-                <div className={`msp-transform-apply-wider`}>
-                    <Button icon={canApply ? 'ok' : void 0} className={`msp-btn-commit msp-btn-commit-${canApply ? 'on' : 'off'}`} onClick={this.apply} disabled={!canApply}>
-                        {this.props.applyLabel || this.applyText()}
-                    </Button>
-                </div>
-            </div>;
+        if (this.props.autoHideApply && (!canApply || this.canAutoApply(this.state.params))) return null;
+
+        return <div className='msp-transform-apply-wrap'>
+            <button className='msp-btn msp-btn-block msp-form-control msp-transform-default-params' onClick={this.setDefault} disabled={this.state.busy} title='Set default params'><Icon name='cw' /></button>
+            {/* {showBack && <Button className='msp-btn msp-btn-block msp-form-control msp-transform-refresh msp-form-control' title='Refresh params' onClick={this.refresh} disabled={this.state.busy || this.state.isInitial}>
+                <Icon name='back' /> Back
+            </Button>}
+            <div className={`msp-transform-apply${!showBack ? ' msp-transform-apply-wider' : ''}`}> */}
+            <div className={`msp-transform-apply-wider`}>
+                <Button icon={canApply ? 'ok' : void 0} className={`msp-btn-commit msp-btn-commit-${canApply ? 'on' : 'off'}`} onClick={this.apply} disabled={!canApply}>
+                    {this.props.applyLabel || this.applyText()}
+                </Button>
+            </div>
+        </div>;
     }
 
     renderDefault() {

+ 3 - 2
src/mol-plugin-ui/structure/source.tsx

@@ -13,6 +13,7 @@ import { ActionMenu } from '../controls/action-menu';
 import { Button, IconButton } from '../controls/common';
 import { ParameterControls } from '../controls/parameters';
 import { StructureFocusControls } from './focus';
+import { UpdateTransformControl } from '../state/update-transform';
 
 interface StructureSourceControlState extends CollapsableState {
     isBusy: boolean,
@@ -231,7 +232,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
     updateStructure = (params: any) => {
         const { selection } = this.plugin.managers.structure.hierarchy;
         const s = selection.structures[0];
-        this.plugin.managers.structure.hierarchy.updateStructure(s, params);
+        return this.plugin.managers.structure.hierarchy.updateStructure(s, params);
     }
 
     get structureType() {
@@ -241,7 +242,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
         const params = s.cell.params?.definition;
         if (!params) return null;
 
-        return <ParameterControls params={params} values={s.cell.params?.values} onChangeValues={this.updateStructure} isDisabled={this.state.isBusy} />
+        return <UpdateTransformControl state={s.cell.parent} transform={s.cell.transform} customHeader='none' customUpdate={this.updateStructure} noMargin autoHideApply />
     }
 
     renderControls() {