fixed new participants not detected in syncs

fixes #20
This commit is contained in:
2026-01-21 16:17:23 +01:00
parent 34ec00768f
commit 4231233f76
3 changed files with 63 additions and 40 deletions

View File

@@ -4,27 +4,24 @@
#let render(sync) = get-ctx(ctx => { #let render(sync) = get-ctx(ctx => {
set-ctx(c => { set-ctx(c => {
c.sync = ( c.sync = (
ctx: ctx,
bottoms: (), bottoms: (),
starts: (), starts: (),
y: ctx.y start-y: ctx.y,
align-y: ctx.y
) )
c.in-sync = true
return c return c
}) })
})
// Compute heights #let in-sync-render(elmt) = {
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 => { set-ctx(c => {
c.y = ctx.y c.y = c.sync.start-y
return c return c
}) })
draw.hide({ draw.hide({
(e.draw)(e) (elmt.draw)(elmt)
}) })
set-ctx(c => { set-ctx(c => {
c.sync.starts.push(c.last-drawn.start-info.y) c.sync.starts.push(c.last-drawn.start-info.y)
@@ -33,23 +30,36 @@
}) })
} }
#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 => { set-ctx(c => {
c.sync-y = calc.min(..c.sync.starts) let new-sync = c.sync
return c 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() { for (i, e) in sync.elmts.enumerate() {
set-ctx(c => { set-ctx(c => {
let dy = c.sync.starts.at(i) - ctx.y let dy = c.sync.starts.at(i) - c.sync.start-y
c.y = c.sync-y - dy c.y = c.sync.align-y - dy
return c return c
}) })
(e.draw)(e) (e.draw)(e)
} }
set-ctx(c => { 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") c.remove("sync")
return c return c
}) })

View File

@@ -2,6 +2,7 @@
#import "draw/note.typ": get-box as get-note-box, get-size as get-note-size #import "draw/note.typ": get-box as get-note-box, get-size as get-note-size
#import "draw/participant.typ" #import "draw/participant.typ"
#import "draw/sync.typ": in-sync-render
#import "utils.typ": * #import "utils.typ": *
#import "/src/consts.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 seq-update-lifelines(participants, pars-i, seq) = {
let participants = participants let participants = participants
let com = if seq.comment == none {""} else {seq.comment} let com = if seq.comment == none {""} else {seq.comment}
@@ -308,7 +293,6 @@
#let compute-columns-width(participants, elements, pars-i) = { #let compute-columns-width(participants, elements, pars-i) = {
elements = elements.filter(is-elmt) elements = elements.filter(is-elmt)
elements = unwrap-syncs(elements)
let cells let cells
(participants, elements, cells) = compute-max-lifeline-levels(participants, elements, pars-i) (participants, elements, cells) = compute-max-lifeline-levels(participants, elements, pars-i)
@@ -334,7 +318,8 @@
lifelines: participants.map(_ => ( lifelines: participants.map(_ => (
level: 0, level: 0,
lines: () lines: ()
)) )),
in-sync: false
) )
chronos-ctx.insert( chronos-ctx.insert(
"widths", "widths",
@@ -393,8 +378,14 @@
if not is-elmt(elmt) { if not is-elmt(elmt) {
(elmt,) (elmt,)
} else if "draw" in elmt and elmt.type != "par" { } else if "draw" in elmt and elmt.type != "par" {
get-ctx(ctx => {
if ctx.in-sync and elmt.type != "sync-end" {
in-sync-render(elmt)
} else {
(elmt.draw)(elmt) (elmt.draw)(elmt)
} }
})
}
} }
set-ctx(ctx => { set-ctx(ctx => {

View File

@@ -1,4 +1,5 @@
#import "draw/group.typ": render-end as grp-render-end #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 "utils.typ": get-group-span, is-elmt
#import "/src/participant.typ": _exists as par-exists, _par #import "/src/participant.typ": _exists as par-exists, _par
#import "/src/sequence.typ": _seq #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 update-group-children(elmts, i) = {
let elmts = elmts let elmts = elmts
let group-end = elmts.at(i) let group-end = elmts.at(i)
@@ -59,6 +78,9 @@
if elmt.type == "grp" { if elmt.type == "grp" {
elmts = flatten-group(elmts, i) elmts = flatten-group(elmts, i)
} else if elmt.type == "sync" {
elmts = flatten-sync(elmts, i)
} else if elmt.type == "seq" { } else if elmt.type == "seq" {
if elmt.enable-dst { if elmt.enable-dst {
activation-history.push(elmt) activation-history.push(elmt)