Explorar el Código

more selection helper fixes

- use structure from last decorator as reference
- handle that oldObj is not defined for inserts
Alexander Rose hace 4 años
padre
commit
8a4ab9bdb9
Se han modificado 1 ficheros con 15 adiciones y 12 borrados
  1. 15 12
      src/mol-plugin-state/manager/structure/selection.ts

+ 15 - 12
src/mol-plugin-state/manager/structure/selection.ts

@@ -244,10 +244,9 @@ export class StructureSelectionManager extends StatefulPluginComponent<Structure
     }
 
     private onUpdate(ref: string, oldObj: PSO.Molecule.Structure | undefined, obj: PSO.Molecule.Structure) {
-        if (!oldObj?.data) return;
 
         // no change to structure
-        if (oldObj === obj || oldObj.data === obj.data) return;
+        if (oldObj === obj || oldObj?.data === obj.data) return;
 
         // ignore decorators to get stable ref
         const cell = this.plugin.helpers.substructureParent.get(obj.data, true);
@@ -256,33 +255,37 @@ export class StructureSelectionManager extends StatefulPluginComponent<Structure
         ref = cell.transform.ref;
         if (!this.entries.has(ref)) return;
 
-        // remap the old selection to be related to the new object if possible.
-        if (Structure.areUnitAndIndicesEqual(oldObj.data, obj.data)) {
-            this.entries.set(ref, remapSelectionEntry(this.entries.get(ref)!, obj.data));
+        // use structure from last decorator as reference
+        const structure = this.plugin.helpers.substructureParent.get(obj.data)?.obj?.data;
+        if (!structure) return;
+
+        // oldObj is not defined for inserts (e.g. TransformStructureConformation)
+        if (!oldObj || Structure.areUnitAndIndicesEqual(oldObj.data, obj.data)) {
+            this.entries.set(ref, remapSelectionEntry(this.entries.get(ref)!, structure));
 
             // remap referenceLoci & prevHighlight if needed and possible
-            if (this.referenceLoci?.structure.root === oldObj.data.root) {
-                this.referenceLoci = StructureElement.Loci.remap(this.referenceLoci, obj.data);
+            if (this.referenceLoci?.structure.root === structure.root) {
+                this.referenceLoci = StructureElement.Loci.remap(this.referenceLoci, structure);
             }
 
             // remap history locis if needed and possible
             let changedHistory = false;
             for (const e of this.state.additionsHistory) {
-                if (e.loci.structure === oldObj.data) {
-                    e.loci = StructureElement.Loci.remap(e.loci, obj.data);
+                if (e.loci.structure.root === structure.root) {
+                    e.loci = StructureElement.Loci.remap(e.loci, structure);
                     changedHistory = true;
                 }
             }
             if (changedHistory) this.events.additionsHistoryUpdated.next();
         } else {
             // clear the selection for ref
-            this.entries.set(ref, new SelectionEntry(StructureElement.Loci(obj.data, [])));
+            this.entries.set(ref, new SelectionEntry(StructureElement.Loci(structure, [])));
 
-            if (this.referenceLoci?.structure.root === oldObj.data.root) {
+            if (this.referenceLoci?.structure.root === structure.root) {
                 this.referenceLoci = undefined;
             }
 
-            this.clearHistoryForStructure(oldObj.data);
+            this.clearHistoryForStructure(structure);
 
             this.state.stats = void 0;
             this.events.changed.next();