Implement skin context property source injection.

This commit is contained in:
2023-01-16 15:23:57 +08:00
parent 4222176979
commit e3a805b855
2 changed files with 14 additions and 0 deletions

View File

@@ -100,6 +100,10 @@ namespace Cryville.Crtr {
public void ContextCascadeInsert() {
ContextCascade[_cascadeHeight++].Clear();
}
public void ContextCascadeInsert(Dictionary<int, PropSrc.Arbitrary> srcs) {
ContextCascadeInsert();
foreach (var src in srcs) ContextCascadeUpdate(src.Key, src.Value);
}
public void ContextCascadeUpdate(int key, PropSrc.Arbitrary value) {
ContextCascade[_cascadeHeight - 1][key] = value;
}

View File

@@ -36,6 +36,7 @@ namespace Cryville.Crtr {
void MatchStatic(SkinElement rel, ContainerState state, RuntimeSkinContext ctx) {
var rc = ctx.ReadContext;
ChartPlayer.etor.ContextTransform = rc.Transform;
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs);
foreach (var p in rel.properties) {
if (p.Key.Name == 0)
rc.Transform.gameObject.AddComponent(p.Key.Component);
@@ -62,6 +63,7 @@ namespace Cryville.Crtr {
);
}
}
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
}
public void MatchDynamic(ContainerState state) {
if (dynprops.Count == 0 && dynelems.Count == 0) return;
@@ -70,17 +72,23 @@ namespace Cryville.Crtr {
ChartPlayer.etor.ContextEvent = state.Container;
for (int i = 0; i < dynprops.Count; i++) {
DynamicProperty p = dynprops[i];
var psrcs = p.Context.ReadContext.PropSrcs;
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs);
var prop = GetPropOp(p.Context.WriteTransform, p.Key);
if (state.CloneType > prop.UpdateCloneType) continue;
ChartPlayer.etor.Evaluate(prop.Operator, p.Value);
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
}
for (int i = 0; i < dynelems.Count; i++) {
DynamicElement e = dynelems[i];
var psrcs = e.Context.ReadContext.PropSrcs;
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs);
var nctx = e.Selectors.MatchDynamic(state, e.Context.ReadContext);
if (nctx != null) MatchDynamic(
e.Element, state,
new RuntimeSkinContext(nctx, e.Context.ReadContext.Transform, e.Selectors.annotations.Contains("if"))
);
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
}
ChartPlayer.etor.ContextEvent = null;
ChartPlayer.etor.ContextState = null;
@@ -89,6 +97,7 @@ namespace Cryville.Crtr {
void MatchDynamic(SkinElement rel, ContainerState state, RuntimeSkinContext ctx) {
var rc = ctx.ReadContext;
ChartPlayer.etor.ContextTransform = rc.Transform;
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeInsert(rc.PropSrcs);
foreach (var p in rel.properties) {
if (p.Key.Name == 0)
throw new InvalidOperationException("Component creation in dynamic context is not allowed");
@@ -105,6 +114,7 @@ namespace Cryville.Crtr {
new RuntimeSkinContext(nctx, ctx.WriteTransform, r.Key.annotations.Contains("if"))
);
}
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
}
SkinProperty GetPropOp(Transform obj, SkinPropertyKey key) {
var ctype = key.Component;