added short/start/end arrows

This commit is contained in:
Louis Heredero 2024-06-19 17:52:56 +02:00
parent 8deb26441d
commit 27ad9da458
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
6 changed files with 71 additions and 10 deletions

Binary file not shown.

Binary file not shown.

View File

@ -39,3 +39,13 @@
_seq("charlie", "alice", comment: "ok", dashed: true, disable-src: true) _seq("charlie", "alice", comment: "ok", dashed: true, disable-src: true)
}) })
#chronos.diagram({
import chronos: *
_seq("?", "Alice", comment: [?->\ *short* to actor1])
_seq("[", "Alice", comment: [\[->\ *from start* to actor1])
_seq("[", "Bob", comment: [\[->\ *from start* to actor2])
_seq("?", "Bob", comment: [?->\ *short* to actor2])
_seq("Alice", "]", comment: [->\]\ from actor1 *to end*])
_seq("Alice", "?", comment: [->?\ *short* from actor1])
_seq("Alice", "Bob", comment: [->\ from actor1 to actor2])
})

View File

@ -1,6 +1,6 @@
#import "utils.typ": get-group-span #import "utils.typ": get-group-span
#import "renderer.typ": render #import "renderer.typ": render
#import "participant.typ" as participant: _par #import "participant.typ" as participant: _par, PAR-SPECIALS
#let _gap(size: 20) = { #let _gap(size: 20) = {
return (( return ((
@ -45,6 +45,22 @@
} }
} }
let pars = participants
participants = ()
participants.push(_par("[", invisible: true).first())
for (i, p) in pars.enumerate() {
let before = _par("?" + p.name, invisible: true).first()
let after = _par(p.name + "?", invisible: true).first()
if i == 0 {
participants.push(before)
} else {
participants.insert(-1, before)
}
participants.push(p)
participants.push(after)
}
participants.push(_par("]", invisible: true).first())
// Add index to participant // Add index to participant
for (i, p) in participants.enumerate() { for (i, p) in participants.enumerate() {
p.insert("i", i) p.insert("i", i)
@ -57,6 +73,12 @@
let (min-i, max-i) = get-group-span(participants, elmt) let (min-i, max-i) = get-group-span(participants, elmt)
elmts.at(i).insert("min-i", min-i) elmts.at(i).insert("min-i", min-i)
elmts.at(i).insert("max-i", max-i) elmts.at(i).insert("max-i", max-i)
} else if elmt.type == "seq" {
if elmt.p1 == "?" {
elmts.at(i).p1 = "?" + elmt.p2
} else if elmt.p2 == "?" {
elmts.at(i).p2 = elmt.p1 + "?"
}
} }
} }

View File

@ -1,16 +1,23 @@
#import "@preview/cetz:0.2.2": draw #import "@preview/cetz:0.2.2": draw
#import "consts.typ": * #import "consts.typ": *
#let _par(name, display-name: auto, from-start: true) = { #let PAR-SPECIALS = "?[]"
#let _par(name, display-name: auto, from-start: true, invisible: false) = {
return (( return ((
type: "par", type: "par",
name: name, name: name,
display-name: if display-name == auto {name} else {display-name}, display-name: if display-name == auto {name} else {display-name},
from-start: from-start from-start: from-start,
invisible: invisible
),) ),)
} }
#let _exists(participants, name) = { #let _exists(participants, name) = {
if name == "?" or name == "[" or name == "]" {
return true
}
for p in participants { for p in participants {
if name == p.name { if name == p.name {
return true return true

View File

@ -2,10 +2,12 @@
#import "utils.typ": get-participants-i, get-style #import "utils.typ": get-participants-i, get-style
#import "group.typ" #import "group.typ"
#import "participant.typ" #import "participant.typ"
#import participant: PAR-SPECIALS
#import "sequence.typ" #import "sequence.typ"
#import "separator.typ" #import "separator.typ"
#import "consts.typ": * #import "consts.typ": *
#let DEBUG-INVISIBLE = false
#let get-columns-width(participants, elements) = { #let get-columns-width(participants, elements) = {
participants = participants.map(p => { participants = participants.map(p => {
@ -56,8 +58,10 @@
for i in range(participants.len() - 1) { for i in range(participants.len() - 1) {
let p1 = participants.at(i) let p1 = participants.at(i)
let p2 = participants.at(i + 1) let p2 = participants.at(i + 1)
let w1 = measure(box(p1.display-name)).width + PAR-PAD.last() * 2 let w1 = if p1.invisible {0pt} else {measure(box(p1.display-name)).width}
let w2 = measure(box(p2.display-name)).width + PAR-PAD.last() * 2 let w2 = if p2.invisible {0pt} else {measure(box(p2.display-name)).width}
w1 += PAR-PAD.last() * 2
w2 += PAR-PAD.last() * 2
widths.push(w1 / 2pt + w2 / 2pt + PAR-SPACE) widths.push(w1 / 2pt + w2 / 2pt + PAR-SPACE)
} }
@ -79,7 +83,7 @@
let m = measure(cell.cell) let m = measure(cell.cell)
widths.at(cell.i2 - 1) = calc.max( widths.at(cell.i2 - 1) = calc.max(
widths.at(cell.i2 - 1), widths.at(cell.i2 - 1),
m.width / 1pt - widths.slice(0, cell.i2 - 1).sum() m.width / 1pt - widths.slice(cell.i1, cell.i2 - 1).sum()
) )
} }
@ -115,7 +119,7 @@
// Draw participants (start) // Draw participants (start)
for p in participants { for p in participants {
if p.from-start { if p.from-start and not p.invisible {
shapes += draw-par(p) shapes += draw-par(p)
} }
} }
@ -174,8 +178,26 @@
// Draw vertical lines + lifelines + end participants // Draw vertical lines + lifelines + end participants
shapes += draw.on-layer(-1, { shapes += draw.on-layer(-1, {
for (i, p) in participants.enumerate() { if DEBUG-INVISIBLE {
let x = x-pos.at(i) for p in participants.filter(p => p.invisible) {
let color = if p.name.starts-with("?") {green} else if p.name.ends-with("?") {red} else {blue}
let x = x-pos.at(p.i)
draw.line(
(x, 0),
(x, y),
stroke: (paint: color, dash: "dotted")
)
draw.content(
(x, 0),
p.display-name,
anchor: "west",
angle: 90deg
)
}
}
for p in participants.filter(p => not p.invisible) {
let x = x-pos.at(p.i)
// Draw vertical line // Draw vertical line
let last-y = 0 let last-y = 0
@ -185,7 +207,7 @@
let lines = () let lines = ()
// Compute lifeline rectangles + destruction positions // Compute lifeline rectangles + destruction positions
for line in lifelines.at(i).lines { for line in lifelines.at(p.i).lines {
let event = line.first() let event = line.first()
if event == "create" { if event == "create" {
last-y = line.at(1) last-y = line.at(1)