From 0cff9d67993a523e031e51b757cac88949f4d9ec Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Fri, 21 Jun 2024 17:26:50 +0200 Subject: [PATCH] implemented aligned notes --- gallery/notes.pdf | Bin 90766 -> 91771 bytes gallery/notes.typ | 30 +++++++++++++++++++++++++--- src/diagram.typ | 10 ++++++++++ src/note.typ | 17 +++++++++++++--- src/renderer.typ | 49 ++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 94 insertions(+), 12 deletions(-) diff --git a/gallery/notes.pdf b/gallery/notes.pdf index 7e65f04fbccde3d2e624717b045a21ad047ec4d6..e114639d21543ad7ed581b803172db90f3a167b3 100644 GIT binary patch delta 18129 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 CX9c1F delta 17189 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 diff --git a/gallery/notes.typ b/gallery/notes.typ index f2f20fa..7e4ba7e 100644 --- a/gallery/notes.typ +++ b/gallery/notes.typ @@ -74,10 +74,19 @@ #chronos.diagram({ _par("a", display-name: "Alice") _par("b", display-name: "Bob") + _par("c", display-name: "Charlie") + _par("d", display-name: "Donald") + _par("e", display-name: "Eddie") _note("over", [initial state of Alice], pos: "a") - _note("over", [initial state of Bob], pos: "b", aligned: true) - _seq("b", "a", comment: [hello]) + _note("over", [initial state of Bob the builder], pos: "b", aligned: true) + + _note("over", [Note 1], pos: "a") + _note("over", [Note 2], pos: "b", aligned: true) + _note("over", [Note 3], pos: "c", aligned: true) + + _seq("a", "d") + _note("over", [this is an extremely long note], pos: ("d", "e")) }) #pagebreak() @@ -111,4 +120,19 @@ _note("over", [ #underline([This is hosted], stroke: rgb("#FF33FF")) by #box(baseline: 50%, image("gitea.png", width: 1cm, height: 1cm, fit: "contain")) ], pos: ("a", "b")) -}) \ No newline at end of file +}) + +// TODO +/* +#pagebreak() + +#chronos.diagram({ + _par("a", display-name: [Alice]) + _par("b", display-name: [Bob]) + + _seq("a", "b", comment: [Hello]) + _note("left", [This is a note]) + + _seq("[", "a", comment: [Test]) + _note("left", [This is also a note]) +})*/ \ No newline at end of file diff --git a/src/diagram.typ b/src/diagram.typ index 48685dc..03c41b8 100644 --- a/src/diagram.typ +++ b/src/diagram.typ @@ -58,6 +58,7 @@ // List participants let linked = () let last-seq = none + let last-note = none for (i, elmt) in elmts.enumerate() { if elmt.type == "par" { participants.push(elmt) @@ -107,12 +108,21 @@ seq.insert("linked-note", elmt) elmts.at(last-seq.i) = seq } + if elmt.aligned { + let n = last-note.elmt + n.aligned-with = elmt + elmts.at(last-note.i) = n + } elmts.at(i) = elmt if elmt.side == "left" { linked.push("[") } else if elmt.side == "right" { linked.push("]") } + last-note = ( + elmt: elmt, + i: i + ) } } linked = linked.dedup() diff --git a/src/note.typ b/src/note.typ index 39281da..4c12eb3 100644 --- a/src/note.typ +++ b/src/note.typ @@ -15,6 +15,16 @@ ) #let _note(side, content, pos: none, color: COL-NOTE, shape: "default", aligned: false) = { + if side == "over" { + if pos == none { + panic("Pos cannot be none with side 'over'") + } + } + if aligned { + if side != "over" { + panic("Aligned notes can only be over a participant (got side '" + side + "')") + } + } return (( type: "note", side: side, @@ -22,7 +32,8 @@ pos: pos, color: color, shape: shape, - aligned: aligned + aligned: aligned, + aligned-with: none ),) } @@ -66,7 +77,7 @@ if note.side == "over" { if type(note.pos) == array { let xs = note.pos.map(par => x-pos.at(pars-i.at(par))) - return xs.sum() / xs.len() + return (calc.min(..xs) + calc.max(..xs)) / 2 } } return x-pos.at(pars-i.at(note.pos)) @@ -162,7 +173,7 @@ anchor: "center" ) - if note.pos != none or note.side == "across" { + if note.aligned-with == none and (note.pos != none or note.side == "across") { y -= h } diff --git a/src/renderer.typ b/src/renderer.typ index 540a4ce..42d8f9f 100644 --- a/src/renderer.typ +++ b/src/renderer.typ @@ -65,23 +65,36 @@ } else if elmt.type == "note" { let (p1, p2) = (none, none) + let cell = none if elmt.side == "left" { p1 = "[" p2 = elmt.pos + cell = get-note-box(elmt) } else if elmt.side == "right" { p1 = elmt.pos p2 = "]" + cell = get-note-box(elmt) + } else if elmt.side == "over" { + if elmt.aligned-with != none { + let box1 = get-note-box(elmt) + let box2 = get-note-box(elmt.aligned-with) + let m1 = measure(box1) + let m2 = measure(box2) + cell = box(width: (m1.width + m2.width) / 2, height: calc.max(m1.height, m2.height)) + p1 = elmt.pos + p2 = elmt.aligned-with.pos + } } - if p1 != none and p2 != none { + if p1 != none and p2 != none and cell != none { let i1 = pars-i.at(p1) let i2 = pars-i.at(p2) cells.push( ( elmt: elmt, - i1: i1, - i2: i2, - cell: get-note-box(elmt) + i1: calc.min(i1, i2), + i2: calc.max(i1, i2), + cell: cell ) ) } @@ -101,6 +114,28 @@ widths.push(w1 / 2pt + w2 / 2pt + PAR-SPACE) } + // Compute minimum width for over notes + for n in elements.filter(e => (e.type == "note" and + e.side == "over" and + type(e.pos) == str)) { + + let m = note.get-size(n) + let i = pars-i.at(n.pos) + + if i < widths.len() { + widths.at(i) = calc.max( + widths.at(i), + m.width / 2 + NOTE-GAP + ) + } + if i > 0 { + widths.at(i - 1) = calc.max( + widths.at(i - 1), + m.width / 2 + NOTE-GAP + ) + } + } + // Compute minimum width for simple sequences (spanning 1 column) for cell in cells.filter(c => c.i2 - c.i1 == 1) { let m = measure(cell.cell) @@ -111,7 +146,7 @@ } // Compute minimum width for self sequences - for cell in cells.filter(c => c.i1 == c.i2) { + for cell in cells.filter(c => c.elmt.type == "seq" and c.i1 == c.i2) { let m = measure(cell.cell) let i = cell.i1 if cell.elmt.flip { @@ -252,7 +287,9 @@ // Note } else if elmt.type == "note" { if not elmt.linked { - y -= Y-SPACE + if not elmt.aligned { + y -= Y-SPACE + } let shps (y, shps) = draw-note(elmt, y, lifelines) shapes += shps