diff --git a/src/mol-repr/visual.ts b/src/mol-repr/visual.ts index 6c10097e6edfdf52afaa3489a1e26f44bb9b297c..13689cee537941376284cf6bea4b98144bee1a3e 100644 --- a/src/mol-repr/visual.ts +++ b/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); diff --git a/src/mol-util/marker-action.ts b/src/mol-util/marker-action.ts index 04e0becaeb2adfce2cbd74c105788fba602eaefb..25b5b1671501bfeee821009f907aa79235f0ea2b 100644 --- a/src/mol-util/marker-action.ts +++ b/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; } \ No newline at end of file