Skip to content
Snippets Groups Projects
Commit b882a72d authored by Alexander Rose's avatar Alexander Rose
Browse files

refactored assembly-symmetry behavior

- use tag and applyOrUpdate
- set default color theme when off
parent 1eab4dac
No related branches found
No related tags found
No related merge requests found
...@@ -89,7 +89,8 @@ export const InitAssemblySymmetry3D = StateAction.build({ ...@@ -89,7 +89,8 @@ export const InitAssemblySymmetry3D = StateAction.build({
plugin.log.error(`Assembly Symmetry: ${e}`) plugin.log.error(`Assembly Symmetry: ${e}`)
return 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); await state.updateTree(tree).runInContext(ctx);
})); }));
...@@ -131,7 +132,9 @@ const AssemblySymmetry3D = PluginStateTransform.BuiltIn({ ...@@ -131,7 +132,9 @@ const AssemblySymmetry3D = PluginStateTransform.BuiltIn({
await AssemblySymmetryProvider.attach({ runtime: ctx, fetch: plugin.fetch }, a.data) await AssemblySymmetryProvider.attach({ runtime: ctx, fetch: plugin.fetch }, a.data)
const assemblySymmetry = AssemblySymmetryProvider.get(a.data).value const assemblySymmetry = AssemblySymmetryProvider.get(a.data).value
if (!assemblySymmetry || assemblySymmetry.symbol === 'C1') { 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 } const props = { ...b.data.repr.props, ...newParams }
await b.data.repr.createOrUpdate(props, a.data).runInContext(ctx); await b.data.repr.createOrUpdate(props, a.data).runInContext(ctx);
...@@ -184,10 +187,10 @@ export const AssemblySymmetryPreset = StructureRepresentationPresetProvider({ ...@@ -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 state = plugin.state.data;
const assemblySymmetry = state.build().to(structure) 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 }); await plugin.updateDataState(assemblySymmetry, { revertOnError: true });
return assemblySymmetry.selector return assemblySymmetry.selector
} }
\ No newline at end of file
...@@ -7,16 +7,15 @@ ...@@ -7,16 +7,15 @@
import * as React from 'react'; import * as React from 'react';
import { CollapsableState, CollapsableControls } from '../../../../../../mol-plugin-ui/base'; import { CollapsableState, CollapsableControls } from '../../../../../../mol-plugin-ui/base';
import { ApplyActionControl } from '../../../../../../mol-plugin-ui/state/apply-action'; import { ApplyActionControl } from '../../../../../../mol-plugin-ui/state/apply-action';
import { InitAssemblySymmetry3D, AssemblySymmetry3D, AssemblySymmetryPreset } from '../assembly-symmetry'; import { InitAssemblySymmetry3D, AssemblySymmetry3D, AssemblySymmetryPreset, tryCreateAssemblySymmetry } from '../assembly-symmetry';
import { AssemblySymmetryProvider, AssemblySymmetryProps, AssemblySymmetryDataProvider } from '../../../../../../mol-model-props/rcsb/assembly-symmetry'; import { AssemblySymmetryProvider, AssemblySymmetryProps, AssemblySymmetryDataProvider, AssemblySymmetry } from '../../../../../../mol-model-props/rcsb/assembly-symmetry';
import { ParameterControls } from '../../../../../../mol-plugin-ui/controls/parameters'; import { ParameterControls } from '../../../../../../mol-plugin-ui/controls/parameters';
import { ParamDefinition as PD } from '../../../../../../mol-util/param-definition'; import { ParamDefinition as PD } from '../../../../../../mol-util/param-definition';
import { StructureHierarchyManager } from '../../../../../../mol-plugin-state/manager/structure/hierarchy'; 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 { PluginStateObject } from '../../../../../../mol-plugin-state/objects';
import { PluginContext } from '../../../../../context'; import { PluginContext } from '../../../../../context';
import { Task } from '../../../../../../mol-task'; import { Task } from '../../../../../../mol-task';
import { PluginCommands } from '../../../../../commands';
interface AssemblySymmetryControlState extends CollapsableState { interface AssemblySymmetryControlState extends CollapsableState {
isBusy: boolean isBusy: boolean
...@@ -104,7 +103,17 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy ...@@ -104,7 +103,17 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
params.properties[AssemblySymmetryProvider.descriptor.name] = values; params.properties[AssemblySymmetryProvider.descriptor.name] = values;
await this.plugin.builders.structure.insertStructureProperties(s.cell, params); 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) => { paramsOnChange = (options: AssemblySymmetryProps) => {
...@@ -112,7 +121,7 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy ...@@ -112,7 +121,7 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
} }
get hasAssemblySymmetry3D() { 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() { get enable() {
...@@ -142,7 +151,5 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy ...@@ -142,7 +151,5 @@ export class AssemblySymmetryControls extends CollapsableControls<{}, AssemblySy
const EnableAssemblySymmetry3D = StateAction.build({ const EnableAssemblySymmetry3D = StateAction.build({
from: PluginStateObject.Molecule.Structure, from: PluginStateObject.Molecule.Structure,
})(({ a, ref, state }, plugin: PluginContext) => Task.create('Enable Assembly Symmetry', async ctx => { })(({ 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) await AssemblySymmetryPreset.apply(ref, Object.create(null), plugin)
})); }));
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment