diff --git a/src/core/draw/group.typ b/src/core/draw/group.typ index 8604eaa..a182594 100644 --- a/src/core/draw/group.typ +++ b/src/core/draw/group.typ @@ -3,6 +3,9 @@ #import "/src/consts.typ": * #import "/src/core/utils.typ": get-ctx, set-ctx, expand-parent-group +#let display-name(name) = text(name, weight: "bold") +#let display-desc(desc) = text([\[#desc\]], weight: "bold", size: .8em) + #let render-start(grp) = get-ctx(ctx => { let grp = grp ctx.y -= Y-SPACE @@ -44,8 +47,8 @@ #let draw-group(x0, x1, y0, y1, group) = { - let name = text(group.name, weight: "bold") - let m = measure(box(name)) + let name = display-name(group.name) + let m = measure(name) let w = m.width / 1pt + 15 let h = m.height / 1pt + 6 draw.rect( @@ -71,7 +74,7 @@ if group.desc != none { draw.content( (x0 + w, y0), - text([\[#group.desc\]], weight: "bold", size: .8em), + display-desc(group.desc), anchor: "north-west", padding: 3pt ) @@ -86,7 +89,7 @@ ) draw.content( (x0, y), - text([\[#elmt.desc\]], weight: "bold", size: .8em), + display-desc(elmt.desc), anchor: "north-west", padding: 3pt ) @@ -105,6 +108,22 @@ let x0 = min-x - 10 let x1 = max-x + 10 + // Fit name and descriptions + let name-m = measure(display-name(group.name)) + let width = name-m.width / 1pt + 15 + if group.desc != none { + let desc-m = measure(display-desc(group.desc)) + width += desc-m.width / 1pt + 6 + } + if group.grp-type == "alt" { + width = calc.max(width, ..group.elses.map(e => { + let elmt = e.at(1) + let desc-m = measure(display-desc(elmt.desc)) + return desc-m.width / 1pt + 6 + })) + } + x1 = calc.max(x1, x0 + width + 3) + draw-group(x0, x1, start-y, ctx.y, group) if group.grp-type == "alt" { diff --git a/src/core/draw/sequence.typ b/src/core/draw/sequence.typ index 49103e6..ac26b7d 100644 --- a/src/core/draw/sequence.typ +++ b/src/core/draw/sequence.typ @@ -1,8 +1,8 @@ -#import "/src/cetz.typ": draw, vector +#import "/src/cetz.typ": draw, vector, coordinate #import "note.typ" #import "/src/consts.typ": * -#import "/src/core/utils.typ": get-ctx, set-ctx +#import "/src/core/utils.typ": get-ctx, set-ctx, expand-parent-group #let get-arrow-marks(sym, color) = { if sym == none { @@ -223,6 +223,11 @@ ).at(seq.comment-align) } + expand-parent-group( + calc.min(x1, x2, x-mid), + calc.max(x1, x2, x-mid) + ) + } else { pts = ( (x1, start-info.y), @@ -261,6 +266,11 @@ (p1, p2) = (p2, p1) } comment-angle = vector.angle2(p1, p2) + + expand-parent-group( + calc.min(x1, x2), + calc.max(x1, x2) + ) } // Start circle tip @@ -335,8 +345,23 @@ comment, anchor: comment-anchor, angle: comment-angle, - padding: 3pt + padding: 3pt, + name: "comment" ) + + // TODO: Improve this + draw.get-ctx(c => { + let (_, left, right) = coordinate.resolve( + c, + "comment.west", + "comment.east" + ) + expand-parent-group( + left.at(0), + right.at(0) + ) + }) + } if seq.create-dst { diff --git a/tests/special-group/ref/1.png b/tests/special-group/ref/1.png index 75af4d7..a84209f 100644 Binary files a/tests/special-group/ref/1.png and b/tests/special-group/ref/1.png differ diff --git a/tests/special-group/ref/3.png b/tests/special-group/ref/3.png index 23c06b3..ac39b4d 100644 Binary files a/tests/special-group/ref/3.png and b/tests/special-group/ref/3.png differ