diff --git a/src/mol-plugin/behavior/dynamic/custom-props/rcsb/assembly-symmetry.ts b/src/mol-plugin/behavior/dynamic/custom-props/rcsb/assembly-symmetry.ts index 9d89a9c89cbf2edc61553cdebfde909671f0734d..dfe688f6190a4a2c0744845b9e5f0cd4c9b2804a 100644 --- a/src/mol-plugin/behavior/dynamic/custom-props/rcsb/assembly-symmetry.ts +++ b/src/mol-plugin/behavior/dynamic/custom-props/rcsb/assembly-symmetry.ts @@ -89,7 +89,8 @@ export const InitAssemblySymmetry3D = StateAction.build({ plugin.log.error(`Assembly Symmetry: ${e}`) return } - const tree = state.build().to(ref).apply(AssemblySymmetry3D); + const tree = state.build().to(ref) + .applyOrUpdateTagged(AssemblySymmetry.Tag.Representation, AssemblySymmetry3D); await state.updateTree(tree).runInContext(ctx); })); @@ -131,7 +132,9 @@ const AssemblySymmetry3D = PluginStateTransform.BuiltIn({ await AssemblySymmetryProvider.attach({ runtime: ctx, fetch: plugin.fetch }, a.data) const assemblySymmetry = AssemblySymmetryProvider.get(a.data).value if (!assemblySymmetry || assemblySymmetry.symbol === 'C1') { - return StateTransformer.UpdateResult.Null + // this should NOT be StateTransformer.UpdateResult.Null + // because that keeps the old object + return StateTransformer.UpdateResult.Recreate } const props = { ...b.data.repr.props, ...newParams } await b.data.repr.createOrUpdate(props, a.data).runInContext(ctx); @@ -184,10 +187,10 @@ export const AssemblySymmetryPreset = StructureRepresentationPresetProvider({ } }); -async function tryCreateAssemblySymmetry(plugin: PluginContext, structure: StateObjectRef<PluginStateObject.Molecule.Structure>, params?: StateTransformer.Params<AssemblySymmetry3D>, initialState?: Partial<StateTransform.State>) { +export async function tryCreateAssemblySymmetry(plugin: PluginContext, structure: StateObjectRef<PluginStateObject.Molecule.Structure>, params?: StateTransformer.Params<AssemblySymmetry3D>, initialState?: Partial<StateTransform.State>) { const state = plugin.state.data; const assemblySymmetry = state.build().to(structure) - .apply(AssemblySymmetry3D, params, { state: initialState }); + .applyOrUpdateTagged(AssemblySymmetry.Tag.Representation, AssemblySymmetry3D, params, { state: initialState }); await plugin.updateDataState(assemblySymmetry, { revertOnError: true }); return assemblySymmetry.selector } \ No newline at end of file diff --git a/src/mol-plugin/behavior/dynamic/custom-props/rcsb/ui/assembly-symmetry.tsx b/src/mol-plugin/behavior/dynamic/custom-props/rcsb/ui/assembly-symmetry.tsx index ff1e851ac8c279b8272d79ede327bdb9d5a2330f..bab4c360a346efece4eb70623f3074ca0a7f1f40 100644 --- a/src/mol-plugin/behavior/dynamic/custom-props/rcsb/ui/assembly-symmetry.tsx +++ b/src/mol-plugin/behavior/dynamic/custom-props/rcsb/ui/assembly-symmetry.tsx @@ -7,16 +7,15 @@ import * as React from 'react'; import { CollapsableState, CollapsableControls } from '../../../../../../mol-plugin-ui/base'; import { ApplyActionControl } from '../../../../../../mol-plugin-ui/state/apply-action'; -import { InitAssemblySymmetry3D, AssemblySymmetry3D, AssemblySymmetryPreset } from '../assembly-symmetry'; -import { AssemblySymmetryProvider, AssemblySymmetryProps, AssemblySymmetryDataProvider } from '../../../../../../mol-model-props/rcsb/assembly-symmetry'; +import { InitAssemblySymmetry3D, AssemblySymmetry3D, AssemblySymmetryPreset, tryCreateAssemblySymmetry } from '../assembly-symmetry'; +import { AssemblySymmetryProvider, AssemblySymmetryProps, AssemblySymmetryDataProvider, AssemblySymmetry } from '../../../../../../mol-model-props/rcsb/assembly-symmetry'; import { ParameterControls } from '../../../../../../mol-plugin-ui/controls/parameters'; import { ParamDefinition as PD } from '../../../../../../mol-util/param-definition'; import { StructureHierarchyManager } from '../../../../../../mol-plugin-state/manager/structure/hierarchy'; -import { StateAction } from '../../../../../../mol-state'; +import { StateAction, StateSelection } from '../../../../../../mol-state'; import { PluginStateObject } from '../../../../../../mol-plugin-state/objects'; import { PluginContext } from '../../../../../context'; import { Task } from '../../../../../../mol-task'; -import { PluginCommands } from '../../../../../commands'; interface AssemblySymmetryControlState extends CollapsableState { isBusy: boolean @@ -104,7 +103,17 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy params.properties[AssemblySymmetryProvider.descriptor.name] = values; await this.plugin.builders.structure.insertStructureProperties(s.cell, params); } - this.forceUpdate() + + const components = this.plugin.managers.structure.hierarchy.currentComponentGroups[0]; + if (values.symmetryIndex === -1) { + const name = components[0]?.representations[0]?.cell.transform.params?.colorTheme.name; + if (name === AssemblySymmetry.Tag.Cluster) { + await this.plugin.managers.structure.component.updateRepresentationsTheme(components, { color: 'default' }) + } + } else { + tryCreateAssemblySymmetry(this.plugin, s.cell) + await this.plugin.managers.structure.component.updateRepresentationsTheme(components, { color: AssemblySymmetry.Tag.Cluster as any }) + } } paramsOnChange = (options: AssemblySymmetryProps) => { @@ -112,7 +121,7 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy } get hasAssemblySymmetry3D() { - return !!this.pivot.genericRepresentations?.filter(r => r.cell.transform.transformer.id === AssemblySymmetry3D.id)[0] + return !this.pivot.cell.parent || !!StateSelection.findTagInSubtree(this.pivot.cell.parent.tree, this.pivot.cell.transform.ref, AssemblySymmetry.Tag.Representation); } get enable() { @@ -142,7 +151,5 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy const EnableAssemblySymmetry3D = StateAction.build({ from: PluginStateObject.Molecule.Structure, })(({ a, ref, state }, plugin: PluginContext) => Task.create('Enable Assembly Symmetry', async ctx => { - const action = InitAssemblySymmetry3D.create({}) - await PluginCommands.State.ApplyAction(plugin, { state, action, ref }) await AssemblySymmetryPreset.apply(ref, Object.create(null), plugin) })); \ No newline at end of file