From 153f30a3f8d397e44b7134881514053dd1113f99 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Thu, 7 Mar 2019 15:35:27 +0100 Subject: [PATCH] mol-plugin: set initial repr state when modifer is removed --- .../behavior/static/representation.ts | 7 ++++++ src/mol-plugin/state/objects.ts | 9 ++++++- .../state/transforms/representation.ts | 24 +++++++++++++------ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/mol-plugin/behavior/static/representation.ts b/src/mol-plugin/behavior/static/representation.ts index 06959d02b..b84697c9d 100644 --- a/src/mol-plugin/behavior/static/representation.ts +++ b/src/mol-plugin/behavior/static/representation.ts @@ -72,6 +72,13 @@ export function SyncStructureRepresentation3DState(ctx: PluginContext) { ctx.canvas3d.update(data.source.data.repr); ctx.canvas3d.requestDraw(true); }); + events.object.removed.subscribe(e => { + if (!SO.Molecule.Structure.Representation3DState.is(e.obj)) return; + const data = e.obj.data as SO.Molecule.Structure.Representation3DStateData; + data.source.data.repr.setState(data.initialState); + ctx.canvas3d.update(data.source.data.repr); + ctx.canvas3d.requestDraw(true); + }); } diff --git a/src/mol-plugin/state/objects.ts b/src/mol-plugin/state/objects.ts index 003da6788..c73a2d03d 100644 --- a/src/mol-plugin/state/objects.ts +++ b/src/mol-plugin/state/objects.ts @@ -84,7 +84,14 @@ export namespace PluginStateObject { export namespace Structure { export class Representation3D extends CreateRepresentation3D<StructureRepresentation<any> | ShapeRepresentation<any, any, any>, Structure>({ name: 'Structure 3D' }) { } - export interface Representation3DStateData { source: Representation3D, state: Partial<StructureRepresentationState>, info?: unknown } + + export interface Representation3DStateData { + source: Representation3D, + /** used to restore state when the obj is removed */ + initialState: Partial<StructureRepresentationState>, + state: Partial<StructureRepresentationState>, + info?: unknown + } export class Representation3DState extends Create<Representation3DStateData>({ name: 'Structure 3D State', typeClass: 'Object' }) { } } } diff --git a/src/mol-plugin/state/transforms/representation.ts b/src/mol-plugin/state/transforms/representation.ts index d4bba6964..c1e9e8bef 100644 --- a/src/mol-plugin/state/transforms/representation.ts +++ b/src/mol-plugin/state/transforms/representation.ts @@ -247,7 +247,12 @@ const UnwindStructureAssemblyRepresentation3D = PluginStateTransform.BuiltIn({ const structure = a.data.source.data; const unitTransforms = new StructureUnitTransforms(structure); unwindStructureAssembly(structure, unitTransforms, params.t); - return new SO.Molecule.Structure.Representation3DState({ state: { unitTransforms }, info: structure, source: a }, { label: `Unwind T = ${params.t.toFixed(2)}` }); + return new SO.Molecule.Structure.Representation3DState({ + state: { unitTransforms }, + initialState: { unitTransforms: new StructureUnitTransforms(structure) }, + info: structure, + source: a + }, { label: `Unwind T = ${params.t.toFixed(2)}` }); }, update({ a, b, newParams, oldParams }) { const structure = b.data.info as Structure; @@ -274,15 +279,20 @@ const ExplodeStructureRepresentation3D = PluginStateTransform.BuiltIn({ return true; }, apply({ a, params, spine }) { - const srcStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; - const unitTransforms = new StructureUnitTransforms(srcStructure); - explodeStructure(srcStructure, unitTransforms, params.t); - return new SO.Molecule.Structure.Representation3DState({ state: { unitTransforms }, info: srcStructure, source: a }, { label: `Explode T = ${params.t.toFixed(2)}` }); + const rootStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; + const unitTransforms = new StructureUnitTransforms(rootStructure); + explodeStructure(rootStructure, unitTransforms, params.t); + return new SO.Molecule.Structure.Representation3DState({ + state: { unitTransforms }, + initialState: { unitTransforms: new StructureUnitTransforms(rootStructure) }, + info: rootStructure, + source: a + }, { label: `Explode T = ${params.t.toFixed(2)}` }); }, update({ a, b, newParams, oldParams, spine }) { - const srcStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; + const rootStructure = spine.getRootOfType(SO.Molecule.Structure)!.data; const structure = b.data.info as Structure; - if (srcStructure !== structure) return StateTransformer.UpdateResult.Recreate; + if (rootStructure !== structure) return StateTransformer.UpdateResult.Recreate; if (oldParams.t === newParams.t) return StateTransformer.UpdateResult.Unchanged; const unitTransforms = b.data.state.unitTransforms!; explodeStructure(structure, unitTransforms, newParams.t); -- GitLab