Compare commits
	
		
			9 Commits
		
	
	
		
			f812ac93c2
			...
			dev
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1000a3a19a | |||
| f3763cb1f7 | |||
| c19d507486 | |||
| fe01e63dd0 | |||
| d6c390f3c5 | |||
| bbc8bb0339 | |||
| f39e14654a | |||
| aca2d858fe | |||
| 6c97bb807f | 
| @@ -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" { | ||||
|   | ||||
| @@ -81,7 +81,7 @@ | ||||
|   draw.content( | ||||
|     (x, y), | ||||
|     p.display-name, | ||||
|     anchor: if bottom {"north"} else {"south"} | ||||
|     anchor: if bottom {"north"} else {"base"} | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @@ -109,7 +109,7 @@ | ||||
|   draw.content( | ||||
|     (x, y), | ||||
|     p.display-name, | ||||
|     anchor: if bottom {"north"} else {"south"} | ||||
|     anchor: if bottom {"north"} else {"base"} | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @@ -127,7 +127,7 @@ | ||||
|   draw.content( | ||||
|     (x, y), | ||||
|     p.display-name, | ||||
|     anchor: if bottom {"north"} else {"south"} | ||||
|     anchor: if bottom {"north"} else {"base"} | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @@ -150,7 +150,7 @@ | ||||
|   draw.content( | ||||
|     (x, y), | ||||
|     p.display-name, | ||||
|     anchor: if bottom {"north"} else {"south"} | ||||
|     anchor: if bottom {"north"} else {"base"} | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @@ -183,7 +183,7 @@ | ||||
|   draw.content( | ||||
|     (x, y), | ||||
|     p.display-name, | ||||
|     anchor: if bottom {"north"} else {"south"} | ||||
|     anchor: if bottom {"north"} else {"base"} | ||||
|   ) | ||||
| } | ||||
|  | ||||
| @@ -287,7 +287,7 @@ | ||||
|   draw.content( | ||||
|     (x, y), | ||||
|     p.display-name, | ||||
|     anchor: if bottom {"north"} else {"south"} | ||||
|     anchor: if bottom {"north"} else {"base"} | ||||
|   ) | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -39,5 +39,5 @@ | ||||
|   } | ||||
|   _grp(name, desc: desc, type: "loop", elmts) | ||||
| } | ||||
| #let _opt(desc, elmts) = grp("opt", desc: desc, type: "opt", elmts) | ||||
| #let _break(desc, elmts) = grp("break", desc: desc, type: "break", elmts) | ||||
| #let _opt(desc, elmts) = _grp("opt", desc: desc, type: "opt", elmts) | ||||
| #let _break(desc, elmts) = _grp("break", desc: desc, type: "break", elmts) | ||||
|   | ||||
| Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB | 
							
								
								
									
										4
									
								
								tests/special-group/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| # generated by tytanic, do not edit | ||||
|  | ||||
| diff/** | ||||
| out/** | ||||
							
								
								
									
										
											BIN
										
									
								
								tests/special-group/ref/1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 12 KiB | 
							
								
								
									
										
											BIN
										
									
								
								tests/special-group/ref/2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 11 KiB | 
							
								
								
									
										
											BIN
										
									
								
								tests/special-group/ref/3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 17 KiB | 
							
								
								
									
										
											BIN
										
									
								
								tests/special-group/ref/4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								tests/special-group/ref/5.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.3 KiB | 
							
								
								
									
										71
									
								
								tests/special-group/test.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,71 @@ | ||||
| #set page(width: auto, height: auto) | ||||
| #import "/src/lib.typ": * | ||||
|  | ||||
| #let preamble = { | ||||
|   _par("a", display-name: [Alice]) | ||||
|   _par("b", display-name: [Bob]) | ||||
|   _col("a", "b", width: 2cm) | ||||
| } | ||||
|  | ||||
| #diagram({ | ||||
|   preamble | ||||
|   _grp("Group 1", { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
|   _grp("Group 2", desc: [Description], { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
| }) | ||||
|  | ||||
| #pagebreak() | ||||
|  | ||||
| #diagram({ | ||||
|   preamble | ||||
|   _alt( | ||||
|     "case 1", { | ||||
|       _seq("a", "b") | ||||
|     }, | ||||
|     "case 2", { | ||||
|       _seq("a", "b") | ||||
|     }, | ||||
|     "case 3", { | ||||
|       _seq("a", "b") | ||||
|     } | ||||
|   ) | ||||
| }) | ||||
|  | ||||
| #pagebreak() | ||||
|  | ||||
| #diagram({ | ||||
|   preamble | ||||
|   _loop("loop 1", { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
|   _loop("loop 2", min: 1, { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
|   _loop("loop 3", max: 10, { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
|   _loop("loop 3", min: 1, max: 10, { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
| }) | ||||
|  | ||||
| #pagebreak() | ||||
|  | ||||
| #diagram({ | ||||
|   preamble | ||||
|   _opt("Optional", { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
| }) | ||||
|  | ||||
| #pagebreak() | ||||
|  | ||||
| #diagram({ | ||||
|   preamble | ||||
|   _break("Break", { | ||||
|     _seq("a", "b") | ||||
|   }) | ||||
| }) | ||||