Browse Source

Store IndexPairBonds as a dynamic property

dsehnal 3 years ago
parent
commit
650d38dff8

+ 3 - 0
CHANGELOG.md

@@ -6,10 +6,13 @@ Note that since we don't clearly distinguish between a public and private interf
 
 ## [Unreleased]
 
+## [v3.2.0] - 2022-02-17
+
 - Rename "best database mapping" to "SIFTS Mapping"
 - Add schema and export support for ``atom_site.pdbx_sifts_xref_*`` fields
 - Add schema export support for ``atom_site.pdbx_label_index`` field
 - Add `traceOnly` parameter to chain/UniProt-based structure alignment
+- Store ``IndexPairBonds`` as a dynamic property.
 
 ## [v3.1.0] - 2022-02-06
 

+ 18 - 7
src/mol-model-formats/structure/common/property.ts

@@ -1,7 +1,8 @@
 /**
- * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2020-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ * @author David Sehnal <david.sehnal@gmail.com>
  */
 
 import { Model } from '../../../mol-model/structure';
@@ -44,7 +45,7 @@ interface FormatPropertyProvider<T> {
 }
 
 namespace FormatPropertyProvider {
-    export function create<T>(descriptor: CustomPropertyDescriptor): FormatPropertyProvider<T> {
+    export function create<T>(descriptor: CustomPropertyDescriptor, options?: { asDynamic?: boolean }): FormatPropertyProvider<T> {
         const { name } = descriptor;
         const formatRegistry = new FormatRegistry<T>();
 
@@ -55,21 +56,31 @@ namespace FormatPropertyProvider {
                 return formatRegistry.isApplicable(model);
             },
             get(model: Model): T | undefined {
-                if (model._staticPropertyData[name]) return model._staticPropertyData[name];
+                const store = options?.asDynamic ? model._dynamicPropertyData : model._staticPropertyData;
+
+                if (store[name]) return store[name];
                 if (model.customProperties.has(descriptor)) return;
 
                 const obtain = formatRegistry.get(model.sourceData.kind);
                 if (!obtain) return;
 
-                model._staticPropertyData[name] = obtain(model);
+                store[name] = obtain(model);
                 model.customProperties.add(descriptor);
-                return model._staticPropertyData[name];
+                return store[name];
             },
             set(model: Model, value: T) {
-                model._staticPropertyData[name] = value;
+                if (options?.asDynamic) {
+                    model._dynamicPropertyData[name] = value;
+                } else {
+                    model._staticPropertyData[name] = value;
+                }
             },
             delete(model: Model) {
-                delete model._staticPropertyData[name];
+                if (options?.asDynamic) {
+                    delete model._dynamicPropertyData[name];
+                } else {
+                    delete model._staticPropertyData[name];
+                }
             }
         };
     }

+ 2 - 1
src/mol-model-formats/structure/property/bonds/index-pair.ts

@@ -2,6 +2,7 @@
  * Copyright (c) 2019-2022 Mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
+ * @author David Sehnal <david.sehnal@gmail.com>
  */
 
 import { CustomPropertyDescriptor } from '../../../../mol-model/custom-property';
@@ -42,7 +43,7 @@ export namespace IndexPairBonds {
         name: 'index_pair_bonds',
     };
 
-    export const Provider = FormatPropertyProvider.create<IndexPairBonds>(Descriptor);
+    export const Provider = FormatPropertyProvider.create<IndexPairBonds>(Descriptor, { asDynamic: true });
 
     export type Data = {
         pairs: {