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() {