Bläddra i källkod

mol-state: add tag to StateObject

David Sehnal 6 år sedan
förälder
incheckning
10460d9251
3 ändrade filer med 10 tillägg och 4 borttagningar
  1. 2 0
      src/mol-state/object.ts
  2. 0 4
      src/mol-state/reducer.ts
  3. 8 0
      src/mol-state/state.ts

+ 2 - 0
src/mol-state/object.ts

@@ -18,6 +18,8 @@ interface StateObject<D = any, T extends StateObject.Type = StateObject.Type<any
     readonly data: D,
     readonly label: string,
     readonly description?: string,
+    // assigned by reconciler to be StateTransform.props.tag
+    readonly tag?: string
 }
 
 namespace StateObject {

+ 0 - 4
src/mol-state/reducer.ts

@@ -1,4 +0,0 @@
-// TODO: state reducers
-// The idea is to have "reduced"/computed objects from a state
-// basicaly something like this Reduce(selection: StateSelection) => Value
-// the reducer would be automatically called each time a state update is finished and any object of the selection is updated.

+ 8 - 0
src/mol-state/state.ts

@@ -580,6 +580,7 @@ async function updateNode(ctx: UpdateContext, currentRef: Ref): Promise<UpdateNo
     if (!oldTree.transforms.has(currentRef) || !current.params) {
         current.params = params;
         const obj = await createObject(ctx, currentRef, transform.transformer, parent, params.values);
+        updateTag(obj, transform);
         current.obj = obj;
 
         return { ref: currentRef, action: 'created', obj };
@@ -596,10 +597,12 @@ async function updateNode(ctx: UpdateContext, currentRef: Ref): Promise<UpdateNo
             case StateTransformer.UpdateResult.Recreate: {
                 const oldObj = current.obj;
                 const newObj = await createObject(ctx, currentRef, transform.transformer, parent, newParams);
+                updateTag(newObj, transform);
                 current.obj = newObj;
                 return { ref: currentRef, action: 'replaced', oldObj, obj: newObj };
             }
             case StateTransformer.UpdateResult.Updated:
+                updateTag(current.obj, transform);
                 return { ref: currentRef, action: 'updated', obj: current.obj! };
             default:
                 return { action: 'none' };
@@ -607,6 +610,11 @@ async function updateNode(ctx: UpdateContext, currentRef: Ref): Promise<UpdateNo
     }
 }
 
+function updateTag(obj: StateObject | undefined, transform: StateTransform) {
+    if (!obj || obj === StateObject.Null) return;
+    (obj.tag as string | undefined) = transform.props.tag;
+}
+
 function runTask<T>(t: T | Task<T>, ctx: RuntimeContext) {
     if (typeof (t as any).runInContext === 'function') return (t as Task<T>).runInContext(ctx);
     return t as T;