diff --git a/src/mol-geo/representation/structure/spacefill.ts b/src/mol-geo/representation/structure/spacefill.ts index de7352294e8b09aea3eac47495f085874f30e06a..796ab996c06064cfed35e45072db3aefdb9ab7c5 100644 --- a/src/mol-geo/representation/structure/spacefill.ts +++ b/src/mol-geo/representation/structure/spacefill.ts @@ -161,19 +161,11 @@ export default function Spacefill(): UnitsRepresentation<SpacefillProps> { createColors(currentGroup, vertexMap, newProps.colorTheme, spheres.values) } - // TODO handle in a generic way - if (spheres.values.uAlpha.ref.value !== newProps.alpha) { - ValueCell.update(spheres.values.uAlpha, newProps.alpha) - } - if (spheres.values.dDoubleSided.ref.value !== newProps.doubleSided) { - ValueCell.update(spheres.values.dDoubleSided, newProps.doubleSided) - } - if (spheres.values.dFlipSided.ref.value !== newProps.flipSided) { - ValueCell.update(spheres.values.dFlipSided, newProps.flipSided) - } - if (spheres.values.dFlatShaded.ref.value !== newProps.flatShaded) { - ValueCell.update(spheres.values.dFlatShaded, newProps.flatShaded) - } + ValueCell.updateIfChanged(spheres.values.uAlpha, newProps.alpha) + ValueCell.updateIfChanged(spheres.values.dDoubleSided, newProps.doubleSided) + ValueCell.updateIfChanged(spheres.values.dFlipSided, newProps.flipSided) + ValueCell.updateIfChanged(spheres.values.dFlatShaded, newProps.flatShaded) + spheres.state.visible = newProps.visible spheres.state.depthMask = newProps.depthMask diff --git a/src/mol-util/index.ts b/src/mol-util/index.ts index 472fc968475f37fb414097bb0f2a81b760f0ef47..17612ea0b256f32e32977ba1a7cb2496ace9e748 100644 --- a/src/mol-util/index.ts +++ b/src/mol-util/index.ts @@ -30,6 +30,8 @@ export function arrayEqual<T>(arr1: T[], arr2: T[]) { return true } +const hasOwnProperty = Object.prototype.hasOwnProperty; + export function deepEqual(a: any, b: any) { // from https://github.com/epoberezkin/fast-deep-equal MIT if (a === b) return true; @@ -62,7 +64,7 @@ export function deepEqual(a: any, b: any) { if (regexpA !== regexpB) return false for (let i = 0; i < keys.length; i++) { - if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false + if (!hasOwnProperty.call(b, keys[i])) return false } for (let i = 0; i < keys.length; i++) { @@ -75,8 +77,6 @@ export function deepEqual(a: any, b: any) { return false } -const hasOwnProperty = Object.prototype.hasOwnProperty; - export function shallowEqual<T>(a: T, b: T) { if (!a) { if (!b) return true; @@ -170,7 +170,7 @@ function _shallowMerge<T>(source: T) { return ret; } -export const merge: (<T>(source: T, ...rest: Partial<T>[]) => T)= _shallowMerge; +export const merge: (<T>(source: T, ...rest: Partial<T>[]) => T) = _shallowMerge; function padTime(n: number) { return (n < 10 ? '0' : '') + n } export function formatTime(d: Date) { diff --git a/src/mol-util/value-cell.ts b/src/mol-util/value-cell.ts index 948f5d2837a0a9e1b32750235ec6fd14b8519530..3edcbf2aa0a0eb2e7ab20b37987fb0488f415897 100644 --- a/src/mol-util/value-cell.ts +++ b/src/mol-util/value-cell.ts @@ -2,6 +2,7 @@ * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> + * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { idFactory } from './id-factory' @@ -55,6 +56,11 @@ namespace ValueCell { export function set<T, D>(cell: ValueCell<T, D>, box: ValueBox<T, D>): ValueCell<T, D> { return ValueRef.set(cell, box); } + + /** Updates the cell if the value is has changed, comparing by reference */ + export function updateIfChanged<T, D>(cell: ValueCell<T, D>, value: T): ValueCell<T, D> { + return cell.ref.value !== value ? update(cell, value) : cell + } } export { ValueRef, ValueBox, ValueCell }; \ No newline at end of file