Implement write-only context.

This commit is contained in:
2023-01-16 20:50:14 +08:00
parent bc4fec33ef
commit 9d6bdd968f

View File

@@ -52,8 +52,9 @@ namespace Cryville.Crtr {
try { try {
var nctxs = r.Key.MatchStatic(state, rc); var nctxs = r.Key.MatchStatic(state, rc);
var roflag = r.Key.annotations.Contains("if"); var roflag = r.Key.annotations.Contains("if");
var woflag = r.Key.annotations.Contains("then");
foreach (var nctx in nctxs) { foreach (var nctx in nctxs) {
var nrctx = new RuntimeSkinContext(nctx, ctx.WriteTransform, roflag); var nrctx = new RuntimeSkinContext(nctx, ctx, roflag, woflag);
MatchStatic(r.Value, state, nrctx); MatchStatic(r.Value, state, nrctx);
} }
} }
@@ -84,10 +85,9 @@ namespace Cryville.Crtr {
var psrcs = e.Context.ReadContext.PropSrcs; var psrcs = e.Context.ReadContext.PropSrcs;
if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs); if (psrcs != null) ChartPlayer.etor.ContextCascadeInsert(psrcs);
var nctx = e.Selectors.MatchDynamic(state, e.Context.ReadContext); var nctx = e.Selectors.MatchDynamic(state, e.Context.ReadContext);
if (nctx != null) MatchDynamic( if (nctx != null) MatchDynamic(e.Element, state, new RuntimeSkinContext(
e.Element, state, nctx, e.Context, e.Selectors.annotations.Contains("if"), e.Selectors.annotations.Contains("then")
new RuntimeSkinContext(nctx, e.Context.ReadContext.Transform, e.Selectors.annotations.Contains("if")) ));
);
if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); if (psrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
} }
ChartPlayer.etor.ContextEvent = null; ChartPlayer.etor.ContextEvent = null;
@@ -109,10 +109,9 @@ namespace Cryville.Crtr {
foreach (var r in rel.elements) { foreach (var r in rel.elements) {
if (!r.Key.IsUpdatable(state)) continue; if (!r.Key.IsUpdatable(state)) continue;
var nctx = r.Key.MatchDynamic(state, rc); var nctx = r.Key.MatchDynamic(state, rc);
if (nctx != null) MatchDynamic( if (nctx != null) MatchDynamic(r.Value, state, new RuntimeSkinContext(
r.Value, state, nctx, ctx, r.Key.annotations.Contains("if"), r.Key.annotations.Contains("then")
new RuntimeSkinContext(nctx, ctx.WriteTransform, r.Key.annotations.Contains("if")) ));
);
} }
if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard(); if (rc.PropSrcs != null) ChartPlayer.etor.ContextCascadeDiscard();
} }
@@ -151,9 +150,19 @@ namespace Cryville.Crtr {
ReadContext = r; ReadContext = r;
WriteTransform = w; WriteTransform = w;
} }
public RuntimeSkinContext(SkinContext newctx, Transform oldctx, bool roflag) { public RuntimeSkinContext(SkinContext newctx, RuntimeSkinContext oldctx, bool roflag, bool woflag) {
if (roflag) {
ReadContext = newctx;
WriteTransform = oldctx.WriteTransform;
}
else if (woflag) {
ReadContext = oldctx.ReadContext;
WriteTransform = newctx.Transform;
}
else {
ReadContext = newctx; ReadContext = newctx;
WriteTransform = roflag ? oldctx : newctx.Transform; WriteTransform = newctx.Transform;
}
} }
} }
} }