From ca5d1865cc1b700f891820cca9d9705fbe4a2fd6 Mon Sep 17 00:00:00 2001
From: David Sehnal <david.sehnal@gmail.com>
Date: Wed, 16 Oct 2019 12:43:50 +0200
Subject: [PATCH] mol-model: Loci fixes

---
 src/mol-model/loci.ts                              | 14 +++++++++-----
 .../behavior/dynamic/volume-streaming/behavior.ts  |  2 +-
 src/mol-plugin/util/structure-element-selection.ts |  1 +
 3 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/mol-model/loci.ts b/src/mol-model/loci.ts
index 633bbf5cd..a119a3be5 100644
--- a/src/mol-model/loci.ts
+++ b/src/mol-model/loci.ts
@@ -16,15 +16,15 @@ import { Structure } from './structure/structure';
 /** A Loci that includes every loci */
 export const EveryLoci = { kind: 'every-loci' as 'every-loci' }
 export type EveryLoci = typeof EveryLoci
-export function isEveryLoci(x: any): x is EveryLoci {
+export function isEveryLoci(x?: Loci): x is EveryLoci {
     return !!x && x.kind === 'every-loci';
 }
 
 /** A Loci that is empty */
 export const EmptyLoci = { kind: 'empty-loci' as 'empty-loci' }
 export type EmptyLoci = typeof EmptyLoci
-export function isEmptyLoci(x: Loci): x is EmptyLoci {
-    return !!x && (x.kind === 'empty-loci' || (x.kind === 'element-loci' && x.elements.length === 0));
+export function isEmptyLoci(x?: Loci): x is EmptyLoci {
+    return !!x && x.kind === 'empty-loci';
 }
 
 /** A generic data loci */
@@ -34,7 +34,7 @@ export interface DataLoci {
     readonly tag: string
     readonly indices: OrderedSet<number>
 }
-export function isDataLoci(x: any): x is DataLoci {
+export function isDataLoci(x?: Loci): x is DataLoci {
     return !!x && x.kind === 'data-loci';
 }
 export function areDataLociEqual(a: DataLoci, b: DataLoci) {
@@ -76,7 +76,11 @@ namespace Loci {
         return false
     }
 
-    export function isEmpty(loci: Loci): boolean {
+    export function isEvery(loci?: Loci): loci is EveryLoci {
+        return !!loci && loci.kind === 'every-loci';
+    }
+
+    export function isEmpty(loci: Loci): loci is EmptyLoci {
         if (isEveryLoci(loci)) return false
         if (isEmptyLoci(loci)) return true
         if (isDataLoci(loci)) return isDataLociEmpty(loci)
diff --git a/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts b/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts
index 59385d880..d0b2292f9 100644
--- a/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts
+++ b/src/mol-plugin/behavior/dynamic/volume-streaming/behavior.ts
@@ -259,7 +259,7 @@ export namespace VolumeStreaming {
         }
 
         private getBoxFromLoci(loci: StructureElement.Loci | EmptyLoci): Box3D {
-            if (isEmptyLoci(loci) || StructureElement.Loci.isEmpty(loci)) {
+            if (Loci.isEmpty(loci)) {
                 return Box3D.empty();
             }
 
diff --git a/src/mol-plugin/util/structure-element-selection.ts b/src/mol-plugin/util/structure-element-selection.ts
index 3dd8f2abb..051929e0b 100644
--- a/src/mol-plugin/util/structure-element-selection.ts
+++ b/src/mol-plugin/util/structure-element-selection.ts
@@ -161,6 +161,7 @@ class StructureElementSelectionManager {
         if (!entry) return;
 
         let xs = loci.elements[0];
+        if (!xs) return;
         let e: StructureElement.Loci['elements'][0] | undefined;
         for (const _e of entry.selection.elements) {
             if (xs.unit === _e.unit) {
-- 
GitLab