diff --git a/src/mol-plugin-state/manager/structure/hierarchy.ts b/src/mol-plugin-state/manager/structure/hierarchy.ts index c8b4388371cc09b32b325442bee0514f28f7733a..7810b6c6907767bdef99a48f850cf8f7f5b885d5 100644 --- a/src/mol-plugin-state/manager/structure/hierarchy.ts +++ b/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); } diff --git a/src/mol-plugin-state/transforms/model.ts b/src/mol-plugin-state/transforms/model.ts index 5a3887efcef8c85999bfe6ab8f09c0d88494524d..36e7d89f533a7fb5a7e3374d697aa26111cce550 100644 --- a/src/mol-plugin-state/transforms/model.ts +++ b/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); diff --git a/src/mol-plugin-ui/state/common.tsx b/src/mol-plugin-ui/state/common.tsx index e0528b2b308077c8cebd23c983d970f704eaa0d7..9a7544aa16a7259717cd7df99322535bbe27ca06 100644 --- a/src/mol-plugin-ui/state/common.tsx +++ b/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() { diff --git a/src/mol-plugin-ui/structure/source.tsx b/src/mol-plugin-ui/structure/source.tsx index 7d10f10a741208c22f62e6c77cb0bd6dfa902e6d..553826fceffc00b5448e9a22d006c1d6e6efed7f 100644 --- a/src/mol-plugin-ui/structure/source.tsx +++ b/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() {