From 4231233f76298fceac6037366ab78c8215fc770f Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Wed, 21 Jan 2026 16:17:23 +0100 Subject: [PATCH] fixed new participants not detected in syncs fixes #20 --- src/core/draw/sync.typ | 52 +++++++++++++++++++++++++----------------- src/core/renderer.typ | 29 ++++++++--------------- src/core/setup.typ | 22 ++++++++++++++++++ 3 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/core/draw/sync.typ b/src/core/draw/sync.typ index b681947..050fe90 100644 --- a/src/core/draw/sync.typ +++ b/src/core/draw/sync.typ @@ -4,52 +4,62 @@ #let render(sync) = get-ctx(ctx => { set-ctx(c => { c.sync = ( + ctx: ctx, bottoms: (), starts: (), - y: ctx.y + start-y: ctx.y, + align-y: ctx.y ) + c.in-sync = true return c }) +}) - // Compute heights +#let in-sync-render(elmt) = { + set-ctx(c => { + c.y = c.sync.start-y + return c + }) + draw.hide({ + (elmt.draw)(elmt) + }) + set-ctx(c => { + c.sync.starts.push(c.last-drawn.start-info.y) + c.sync.bottoms.push(c.y) + return c + }) +} + +#let render-end(sync) = get-ctx(ctx => { for e in sync.elmts { assert(is-elmt(e), message: "Sync element can only contain chronos elements, found " + repr(e)) assert( e.type == "seq", message: "Sync element can only contain sequences, found '" + e.type + "'" ) - - set-ctx(c => { - c.y = ctx.y - return c - }) - draw.hide({ - (e.draw)(e) - }) - set-ctx(c => { - c.sync.starts.push(c.last-drawn.start-info.y) - c.sync.bottoms.push(c.y) - return c - }) } set-ctx(c => { - c.sync-y = calc.min(..c.sync.starts) - return c + let new-sync = c.sync + if new-sync.starts.len() != 0 { + new-sync.align-y = calc.min(..new-sync.starts) + } + new-sync.remove("ctx") + return c.sync.ctx + (sync: new-sync) }) - // Draw aligned elements for (i, e) in sync.elmts.enumerate() { set-ctx(c => { - let dy = c.sync.starts.at(i) - ctx.y - c.y = c.sync-y - dy + let dy = c.sync.starts.at(i) - c.sync.start-y + c.y = c.sync.align-y - dy return c }) (e.draw)(e) } set-ctx(c => { - c.y = calc.min(..c.sync.bottoms) + let heights = c.sync.starts.zip(c.sync.bottoms).map(((s, b)) => b - s) + c.y = c.sync.align-y + calc.min(..heights) c.remove("sync") return c }) diff --git a/src/core/renderer.typ b/src/core/renderer.typ index 1bb3297..14cf8d5 100644 --- a/src/core/renderer.typ +++ b/src/core/renderer.typ @@ -2,6 +2,7 @@ #import "draw/note.typ": get-box as get-note-box, get-size as get-note-size #import "draw/participant.typ" +#import "draw/sync.typ": in-sync-render #import "utils.typ": * #import "/src/consts.typ": * @@ -15,22 +16,6 @@ }) } -#let unwrap-syncs(elements) = { - let i = 0 - while i < elements.len() { - let elmt = elements.at(i) - if elmt.type == "sync" { - elements = ( - elements.slice(0, i + 1) + - elmt.elmts + - elements.slice(i + 1) - ) - } - i += 1 - } - return elements -} - #let seq-update-lifelines(participants, pars-i, seq) = { let participants = participants let com = if seq.comment == none {""} else {seq.comment} @@ -308,7 +293,6 @@ #let compute-columns-width(participants, elements, pars-i) = { elements = elements.filter(is-elmt) - elements = unwrap-syncs(elements) let cells (participants, elements, cells) = compute-max-lifeline-levels(participants, elements, pars-i) @@ -334,7 +318,8 @@ lifelines: participants.map(_ => ( level: 0, lines: () - )) + )), + in-sync: false ) chronos-ctx.insert( "widths", @@ -393,7 +378,13 @@ if not is-elmt(elmt) { (elmt,) } else if "draw" in elmt and elmt.type != "par" { - (elmt.draw)(elmt) + get-ctx(ctx => { + if ctx.in-sync and elmt.type != "sync-end" { + in-sync-render(elmt) + } else { + (elmt.draw)(elmt) + } + }) } } diff --git a/src/core/setup.typ b/src/core/setup.typ index 7873526..776b2bb 100644 --- a/src/core/setup.typ +++ b/src/core/setup.typ @@ -1,4 +1,5 @@ #import "draw/group.typ": render-end as grp-render-end +#import "draw/sync.typ": render-end as sync-render-end #import "utils.typ": get-group-span, is-elmt #import "/src/participant.typ": _exists as par-exists, _par #import "/src/sequence.typ": _seq @@ -18,6 +19,24 @@ ) } +#let flatten-sync(elmts, i) = { + let sync = elmts.at(i) + elmts.at(i) = sync + let start = sync + start.remove("elmts") + return ( + elmts.slice(0, i) + + (start,) + + sync.elmts + + (( + type: "sync-end", + draw: sync-render-end, + elmts: sync.elmts + ),) + + elmts.slice(i + 1) + ) +} + #let update-group-children(elmts, i) = { let elmts = elmts let group-end = elmts.at(i) @@ -58,6 +77,9 @@ if elmt.type == "grp" { elmts = flatten-group(elmts, i) + + } else if elmt.type == "sync" { + elmts = flatten-sync(elmts, i) } else if elmt.type == "seq" { if elmt.enable-dst {