Browse Source

add ValueCell.updateIfChanged

Alexander Rose 6 years ago
parent
commit
6059b0b9a1

+ 5 - 13
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
 

+ 4 - 4
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) {

+ 6 - 0
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 };