Browse Source

fix partial marker average calculation

Alexander Rose 3 years ago
parent
commit
c9a3254bd6
2 changed files with 26 additions and 32 deletions
  1. 6 5
      src/mol-repr/visual.ts
  2. 20 27
      src/mol-util/marker-action.ts

+ 6 - 5
src/mol-repr/visual.ts

@@ -76,6 +76,7 @@ namespace Visual {
         const { tMarker, dMarkerType, uMarker, markerAverage, markerStatus, uGroupCount, instanceCount } = renderObject.values;
         const count = uGroupCount.ref.value * instanceCount.ref.value;
         const { array } = tMarker.ref.value;
+        const currentStatus = markerStatus.ref.value as MarkerInfo['status'];
 
         if (!isEveryLoci(loci)) {
             let intervalSize = 0;
@@ -90,9 +91,9 @@ namespace Visual {
         let average = -1;
         let status: MarkerInfo['status'] = -1;
         if (isEveryLoci(loci)) {
-            const info = getMarkerInfo(action, markerStatus.ref.value);
+            const info = getMarkerInfo(action, currentStatus);
             if (info.status !== -1) {
-                changed = markerStatus.ref.value !== info.status;
+                changed = currentStatus !== info.status;
                 if (changed) setMarkerValue(array, info.status, count);
             } else {
                 changed = applyMarkerAction(array, Interval.ofLength(count), action);
@@ -102,13 +103,13 @@ namespace Visual {
         } else {
             changed = lociApply(loci, interval => applyMarkerAction(array, interval, action), true);
             if (changed) {
-                average = getPartialMarkerAverage(action, markerStatus.ref.value);
+                average = getPartialMarkerAverage(action, currentStatus);
                 if (previous && previous.status !== -1 && average === -1 &&
                     MarkerActions.isReverse(previous.action, action) &&
                     Loci.areEqual(loci, previous.loci)
                 ) {
                     status = previous.status;
-                    average = status === 0 ? 0 : 1;
+                    average = status === 0 ? 0 : 0.5;
                 }
             }
         }
@@ -120,7 +121,7 @@ namespace Visual {
             if (previous) {
                 previous.action = action;
                 previous.loci = loci;
-                previous.status = markerStatus.ref.value as MarkerInfo['status'];
+                previous.status = currentStatus;
             }
             ValueCell.updateIfChanged(uMarker, status);
             if (status === -1) ValueCell.update(tMarker, tMarker.ref.value);

+ 20 - 27
src/mol-util/marker-action.ts

@@ -153,7 +153,7 @@ export interface MarkerInfo {
     status: 0 | 1 | 2 | 3 | -1
 }
 
-export function getMarkerInfo(action: MarkerAction, currentStatus: number): MarkerInfo {
+export function getMarkerInfo(action: MarkerAction, currentStatus: MarkerInfo['status']): MarkerInfo {
     let average: MarkerInfo['average'] = -1;
     let status: MarkerInfo['status'] = -1;
     switch (action) {
@@ -224,52 +224,45 @@ export function getMarkerInfo(action: MarkerAction, currentStatus: number): Mark
  * Assumes the action is applied to a partial set that is
  * neither the empty set nor the full set.
  */
-export function getPartialMarkerAverage(action: MarkerAction, currentStatus: number): MarkerInfo['average'] {
+export function getPartialMarkerAverage(action: MarkerAction, currentStatus: MarkerInfo['status']) {
     switch (action) {
         case MarkerAction.Highlight:
-            return 1;
+            return 0.5;
         case MarkerAction.RemoveHighlight:
             if (currentStatus === 0) {
                 return 0;
-            } else if (currentStatus === 1) {
-                return -1;
             } else if (currentStatus === 2 || currentStatus === 3) {
-                return 1;
+                return 0.5;
+            } else { // 1 | -1
+                return -1;
             }
-            return -1;
         case MarkerAction.Select:
-            return 1;
+            return 0.5;
         case MarkerAction.Deselect:
             if (currentStatus === 1 || currentStatus === 3) {
-                return 1;
+                return 0.5;
             } else if (currentStatus === 0) {
                 return 0;
-            } else if (currentStatus === 2) {
+            } else { // 2 | -1
                 return -1;
             }
-            return -1;
         case MarkerAction.Toggle:
-            if (currentStatus === 1) {
-                return 1;
-            } else if (currentStatus === 2) {
-                return 1;
-            } else if (currentStatus === 3) {
-                return 1;
-            } else if (currentStatus === 0) {
-                return 1;
+            if (currentStatus === -1) {
+                return -1;
+            } else { // 0 | 1 | 2 | 3
+                return 0.5;
             }
-            return -1;
         case MarkerAction.Clear:
-            if (currentStatus === 1) {
-                return 1;
-            } else if (currentStatus === 2) {
-                return 1;
-            } else if (currentStatus === 3) {
-                return 1;
+            if (currentStatus === -1) {
+                return -1;
             } else if (currentStatus === 0) {
                 return 0;
+            } else { // 1 | 2 | 3
+                return 0.5;
             }
+        case MarkerAction.None:
             return -1;
+        default:
+            assertUnreachable(action);
     }
-    return -1;
 }