Fix group overflows #19
| @@ -3,6 +3,9 @@ | |||||||
| #import "/src/consts.typ": * | #import "/src/consts.typ": * | ||||||
| #import "/src/core/utils.typ": get-ctx, set-ctx, expand-parent-group | #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 render-start(grp) = get-ctx(ctx => { | ||||||
|   let grp = grp |   let grp = grp | ||||||
|   ctx.y -= Y-SPACE |   ctx.y -= Y-SPACE | ||||||
| @@ -44,8 +47,8 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| #let draw-group(x0, x1, y0, y1, group) = { | #let draw-group(x0, x1, y0, y1, group) = { | ||||||
|   let name = text(group.name, weight: "bold") |   let name = display-name(group.name) | ||||||
|   let m = measure(box(name)) |   let m = measure(name) | ||||||
|   let w = m.width / 1pt + 15 |   let w = m.width / 1pt + 15 | ||||||
|   let h = m.height / 1pt + 6 |   let h = m.height / 1pt + 6 | ||||||
|   draw.rect( |   draw.rect( | ||||||
| @@ -71,7 +74,7 @@ | |||||||
|   if group.desc != none { |   if group.desc != none { | ||||||
|     draw.content( |     draw.content( | ||||||
|       (x0 + w, y0), |       (x0 + w, y0), | ||||||
|       text([\[#group.desc\]], weight: "bold", size: .8em), |       display-desc(group.desc), | ||||||
|       anchor: "north-west", |       anchor: "north-west", | ||||||
|       padding: 3pt |       padding: 3pt | ||||||
|     ) |     ) | ||||||
| @@ -86,7 +89,7 @@ | |||||||
|   ) |   ) | ||||||
|   draw.content( |   draw.content( | ||||||
|     (x0, y), |     (x0, y), | ||||||
|     text([\[#elmt.desc\]], weight: "bold", size: .8em), |     display-desc(elmt.desc), | ||||||
|     anchor: "north-west", |     anchor: "north-west", | ||||||
|     padding: 3pt |     padding: 3pt | ||||||
|   ) |   ) | ||||||
| @@ -105,6 +108,22 @@ | |||||||
|   let x0 = min-x - 10 |   let x0 = min-x - 10 | ||||||
|   let x1 = max-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) |   draw-group(x0, x1, start-y, ctx.y, group) | ||||||
|  |  | ||||||
|   if group.grp-type == "alt" { |   if group.grp-type == "alt" { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user