Browse Source

mol-state: StateActionManager.remove

David Sehnal 5 years ago
parent
commit
7eb2952ec5

+ 2 - 3
src/mol-plugin/behavior/dynamic/custom-props/rcsb/assembly-symmetry.ts

@@ -11,7 +11,6 @@ import { getAssemblySymmetryAxesRepresentation, AssemblySymmetryAxesParams } fro
 import { AssemblySymmetryClusterColorThemeProvider } from '../../../../../mol-model-props/rcsb/themes/assembly-symmetry-cluster';
 import { PluginStateTransform, PluginStateObject } from '../../../../state/objects';
 import { Task } from '../../../../../mol-task';
-import { PluginSpec } from '../../../../spec';
 import { PluginContext } from '../../../../context';
 import { StateTransformer } from '../../../../../mol-state';
 
@@ -23,7 +22,7 @@ export const RCSBAssemblySymmetry = PluginBehavior.create<{ autoAttach: boolean
         private provider = AssemblySymmetryProvider
 
         register(): void {
-            this.ctx.state.dataState.actions.add(PluginSpec.Action(AssemblySymmetryAxes3D).action)
+            this.ctx.state.dataState.actions.add(AssemblySymmetryAxes3D)
             this.ctx.customStructureProperties.register(this.provider, this.params.autoAttach);
             this.ctx.structureRepresentation.themeCtx.colorThemeRegistry.add('rcsb-assembly-symmetry-cluster', AssemblySymmetryClusterColorThemeProvider)
         }
@@ -36,7 +35,7 @@ export const RCSBAssemblySymmetry = PluginBehavior.create<{ autoAttach: boolean
         }
 
         unregister() {
-            // TODO remove `AssemblySymmetryAxes3D` from `this.ctx.state.dataState.actions`
+            this.ctx.state.dataState.actions.remove(AssemblySymmetryAxes3D)
             this.ctx.customStructureProperties.unregister(this.provider.descriptor.name);
             this.ctx.structureRepresentation.themeCtx.colorThemeRegistry.remove('rcsb-assembly-symmetry-cluster')
         }

+ 24 - 0
src/mol-state/action/manager.ts

@@ -7,6 +7,8 @@
 import { StateAction } from '../action';
 import { StateObject, StateObjectCell } from '../object';
 import { StateTransformer } from '../transformer';
+import { UUID } from '../../mol-util';
+import { arraySetRemove } from '../../mol-util/array';
 
 export { StateActionManager }
 
@@ -32,6 +34,28 @@ class StateActionManager {
         return this;
     }
 
+    remove(actionOrTransformer: StateAction | StateTransformer | UUID) {
+        const id = StateTransformer.is(actionOrTransformer) 
+            ? actionOrTransformer.toAction().id 
+            : UUID.is(actionOrTransformer)
+            ? actionOrTransformer
+            : actionOrTransformer.id;
+
+        const action = this.actions.get(id);
+        if (!action) return this;
+
+        this.actions.delete(id);
+        for (const t of action.definition.from) {
+            const xs = this.fromTypeIndex.get(t.type);
+            if (!xs) continue;
+
+            arraySetRemove(xs, action);
+            if (xs.length === 0) this.fromTypeIndex.delete(t.type);
+        }
+
+        return this;
+    }
+
     fromCell(cell: StateObjectCell, ctx: unknown): ReadonlyArray<StateAction> {
         const obj = cell.obj;
         if (!obj) return [];

+ 4 - 0
src/mol-util/uuid.ts

@@ -31,6 +31,10 @@ namespace UUID {
         });
         return uuid as any;
     }
+
+    export function is(x: any): x is UUID {
+        return typeof x === 'string';
+    }
 }
 
 export default UUID;