Release 0.2.0 #5
							
								
								
									
										1
									
								
								TODO.md
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								TODO.md
									
									
									
									
									
								
							| @@ -22,6 +22,7 @@ | ||||
| - [ ] Add args verification to catch user errors + pretty error messages | ||||
| - [ ] PlantUML parser | ||||
| - [ ] (Message numbering) | ||||
| - [ ] Mainframes | ||||
| - [ ] Different types of groups (alt/loop/etc.) | ||||
| - [ ] Delays | ||||
| - [ ] Auto-fit in parent | ||||
| @@ -49,3 +49,19 @@ | ||||
|   show-bottom: true, | ||||
|   show-top: true, | ||||
| ) = {} | ||||
|  | ||||
| /// Sets some options for columns between participants | ||||
| /// | ||||
| /// Parameters `p1` and `p2` MUST be consecutive participants (also counting found/lost messages), but they do not need to be in the left to right order | ||||
| /// - p1 (str): The first neighbouring participant | ||||
| /// - p2 (str): The second neighbouring participant | ||||
| /// - width (auto, int, float, length): Optional fixed width of the column\ If the column's content (e.g. sequence comments) is larger, it will overflow | ||||
| /// - margin (int, float, length): Additional margin to add to the column\ This margin is not included in `width` and `min-width`, but rather added separately | ||||
| /// - min-width (int, float, length): Minimum width of the column\ If set to a larger value than `width`, the latter will be overriden | ||||
| #let _col( | ||||
|   p1, | ||||
|   p2, | ||||
|   width: auto, | ||||
|   margin: 0, | ||||
|   min-width: 0 | ||||
| ) = {} | ||||
										
											Binary file not shown.
										
									
								
							| @@ -145,3 +145,22 @@ chronos.diagram({ | ||||
|  | ||||
|   _gap() | ||||
| }) | ||||
|  | ||||
| #chronos.diagram({ | ||||
|   import chronos: * | ||||
|  | ||||
|   _par("a", display-name: "Alice") | ||||
|   _par("b", display-name: "Bob") | ||||
|   _par("c", display-name: "Caleb") | ||||
|   _par("d", display-name: "Danny") | ||||
|   _par("e", display-name: "Erika") | ||||
|  | ||||
|   _col("a", "b") | ||||
|   _col("b", "c", width: 2cm) | ||||
|   _col("c", "d", margin: .5cm) | ||||
|   _col("d", "e", min-width: 2cm) | ||||
|  | ||||
|   //_seq("b", "c", comment: [Hello World !]) | ||||
|   //_seq("c", "d", comment: [Hello World]) | ||||
|   //_seq("d", "e", comment: [Hello World]) | ||||
| }) | ||||
							
								
								
									
										
											BIN
										
									
								
								manual.pdf
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								manual.pdf
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -155,7 +155,7 @@ chronos.diagram({ | ||||
|     doc-ref: doc-ref | ||||
|   ) | ||||
| ) | ||||
| #tidy.show-module(par-docs, show-outline: false) | ||||
| #tidy.show-module(par-docs, show-outline: false, sort-functions: none) | ||||
|  | ||||
| #pagebreak(weak: true) | ||||
|  | ||||
|   | ||||
| @@ -18,6 +18,17 @@ | ||||
|   ),) | ||||
| } | ||||
|  | ||||
| #let _col(p1, p2, width: auto, margin: 0, min-width: 0) = { | ||||
|   return (( | ||||
|     type: "col", | ||||
|     p1: p1, | ||||
|     p2: p2, | ||||
|     width: width, | ||||
|     margin: margin, | ||||
|     min-width: min-width | ||||
|   ),) | ||||
| } | ||||
|  | ||||
| #let diagram(elements, width: auto) = { | ||||
|   if elements == none { | ||||
|     return | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| #let version = version(0, 1, 1) | ||||
| #import "diagram.typ": diagram, from-plantuml, _gap, _evt | ||||
| #import "diagram.typ": diagram, from-plantuml, _gap, _evt, _col | ||||
|  | ||||
| #import "sequence.typ": _seq | ||||
| #import "group.typ": _grp | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| #import "@preview/cetz:0.2.2": canvas, draw | ||||
| #import "utils.typ": get-participants-i, get-style | ||||
| #import "utils.typ": get-participants-i, get-style, normalize-units | ||||
| #import "group.typ" | ||||
| #import "participant.typ" | ||||
| #import participant: PAR-SPECIALS | ||||
| @@ -194,6 +194,37 @@ | ||||
|     } | ||||
|     widths.at(i) = w | ||||
|   } | ||||
|  | ||||
|   for elmt in elements { | ||||
|     if elmt.type == "col" { | ||||
|       let i1 = pars-i.at(elmt.p1) | ||||
|       let i2 = pars-i.at(elmt.p2) | ||||
|       if calc.abs(i1 - i2) != 1 { | ||||
|         let i-min = calc.min(i1, i2) | ||||
|         let i-max = calc.max(i1, i2) | ||||
|         let others = pars-i.pairs() | ||||
|                            .sorted(key: p => p.last()) | ||||
|                            .slice(i-min + 1, i-max) | ||||
|                            .map(p => "'" + p.first() + "'") | ||||
|                            .join(", ") | ||||
|         panic( | ||||
|           "Column participants must be consecutive (participants (" + | ||||
|           others + | ||||
|           ") are in between)" | ||||
|         ) | ||||
|       } | ||||
|       let i = calc.min(i1, i2) | ||||
|  | ||||
|       if elmt.width != auto { | ||||
|         widths.at(i) = normalize-units(elmt.width) | ||||
|       } | ||||
|       widths.at(i) = calc.max( | ||||
|         widths.at(i), | ||||
|         normalize-units(elmt.min-width) | ||||
|       ) + normalize-units(elmt.margin) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return widths | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,3 +1,12 @@ | ||||
| #let normalize-units(value) = { | ||||
|   if type(value) == int or type(value) == float { | ||||
|     return value | ||||
|   } | ||||
|   if type(value) == length { | ||||
|     return value / 1pt | ||||
|   } | ||||
|   panic("Unsupported type '" + str(type(value)) + "'") | ||||
| } | ||||
| #let get-participants-i(participants) = { | ||||
|   let pars-i = (:) | ||||
|   for (i, p) in participants.enumerate() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user