Skip to content
Snippets Groups Projects
Commit eaffdc6a authored by David Sehnal's avatar David Sehnal
Browse files

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

parent 0b1e6100
No related branches found
No related tags found
No related merge requests found
...@@ -8,12 +8,10 @@ ...@@ -8,12 +8,10 @@
import { setSubtreeVisibility } from '../../../mol-plugin/behavior/static/state'; import { setSubtreeVisibility } from '../../../mol-plugin/behavior/static/state';
import { PluginCommands } from '../../../mol-plugin/commands'; import { PluginCommands } from '../../../mol-plugin/commands';
import { PluginContext } from '../../../mol-plugin/context'; 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 { SetUtils } from '../../../mol-util/set';
import { TrajectoryHierarchyPresetProvider } from '../../builder/structure/hierarchy-preset'; import { TrajectoryHierarchyPresetProvider } from '../../builder/structure/hierarchy-preset';
import { PluginComponent } from '../../component'; 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'; import { buildStructureHierarchy, HierarchyRef, ModelRef, StructureComponentRef, StructureHierarchy, StructureRef, TrajectoryRef } from './hierarchy-state';
export class StructureHierarchyManager extends PluginComponent { export class StructureHierarchyManager extends PluginComponent {
...@@ -167,33 +165,14 @@ export class StructureHierarchyManager extends PluginComponent { ...@@ -167,33 +165,14 @@ export class StructureHierarchyManager extends PluginComponent {
}); });
} }
private _updateStructure(s: StructureRef, params: any, recreateRepresentation: boolean) { async updateStructure(s: StructureRef, params: any) {
return this.plugin.dataTransaction(async () => { await this.plugin.dataTransaction(async () => {
if (recreateRepresentation) {
const root = StateTree.getDecoratorRoot(this.dataState.tree, s.cell.transform.ref); const root = StateTree.getDecoratorRoot(this.dataState.tree, s.cell.transform.ref);
const children = this.dataState.tree.children.get(root).toArray(); const children = this.dataState.tree.children.get(root).toArray();
await this.remove(children, false); await this.remove(children, false);
}
await this.plugin.state.updateTransform(this.plugin.state.data, s.cell.transform.ref, params, 'Structure Type'); 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'); await this.plugin.builders.structure.representation.applyPreset(s.cell.transform.ref, 'auto');
} }, { canUndo: 'Structure Type' });
}, { 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);
}
PluginCommands.Camera.Reset(this.plugin); PluginCommands.Camera.Reset(this.plugin);
} }
......
...@@ -279,6 +279,9 @@ const StructureFromModel = PluginStateTransform.BuiltIn({ ...@@ -279,6 +279,9 @@ const StructureFromModel = PluginStateTransform.BuiltIn({
to: SO.Molecule.Structure, to: SO.Molecule.Structure,
params(a) { return RootStructureDefinition.getParams(a && a.data); } params(a) { return RootStructureDefinition.getParams(a && a.data); }
})({ })({
canAutoUpdate({ newParams }) {
return !RootStructureDefinition.isSymmetryType(newParams.type);
},
apply({ a, params }, plugin: PluginContext) { apply({ a, params }, plugin: PluginContext) {
return Task.create('Build Structure', async ctx => { return Task.create('Build Structure', async ctx => {
return RootStructureDefinition.create(plugin, ctx, a.data, params && params.type); return RootStructureDefinition.create(plugin, ctx, a.data, params && params.type);
......
...@@ -187,9 +187,9 @@ abstract class TransformControlBase<P, S extends TransformControlBase.ComponentS ...@@ -187,9 +187,9 @@ abstract class TransformControlBase<P, S extends TransformControlBase.ComponentS
// const showBack = this.isUpdate() && !(this.state.busy || this.state.isInitial); // const showBack = this.isUpdate() && !(this.state.busy || this.state.isInitial);
const canApply = this.canApply(); const canApply = this.canApply();
return this.props.autoHideApply && !canApply if (this.props.autoHideApply && (!canApply || this.canAutoApply(this.state.params))) return null;
? null
: <div className='msp-transform-apply-wrap'> 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> <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}> {/* {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 <Icon name='back' /> Back
......
...@@ -13,6 +13,7 @@ import { ActionMenu } from '../controls/action-menu'; ...@@ -13,6 +13,7 @@ import { ActionMenu } from '../controls/action-menu';
import { Button, IconButton } from '../controls/common'; import { Button, IconButton } from '../controls/common';
import { ParameterControls } from '../controls/parameters'; import { ParameterControls } from '../controls/parameters';
import { StructureFocusControls } from './focus'; import { StructureFocusControls } from './focus';
import { UpdateTransformControl } from '../state/update-transform';
interface StructureSourceControlState extends CollapsableState { interface StructureSourceControlState extends CollapsableState {
isBusy: boolean, isBusy: boolean,
...@@ -231,7 +232,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo ...@@ -231,7 +232,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
updateStructure = (params: any) => { updateStructure = (params: any) => {
const { selection } = this.plugin.managers.structure.hierarchy; const { selection } = this.plugin.managers.structure.hierarchy;
const s = selection.structures[0]; const s = selection.structures[0];
this.plugin.managers.structure.hierarchy.updateStructure(s, params); return this.plugin.managers.structure.hierarchy.updateStructure(s, params);
} }
get structureType() { get structureType() {
...@@ -241,7 +242,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo ...@@ -241,7 +242,7 @@ export class StructureSourceControls extends CollapsableControls<{}, StructureSo
const params = s.cell.params?.definition; const params = s.cell.params?.definition;
if (!params) return null; 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() { renderControls() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment