refactored groups to use CeTZ style + fixed spacing
This commit is contained in:
		| @@ -1,22 +1,50 @@ | ||||
| #import "/src/cetz.typ": draw | ||||
| #import "/src/cetz.typ": draw, styles | ||||
|  | ||||
| #import "/src/consts.typ": * | ||||
| #import "/src/core/utils.typ": get-ctx, set-ctx, expand-parent-group | ||||
| #import "/src/core/utils.typ": expand-parent-group, get-ctx, normalize-units, set-ctx | ||||
|  | ||||
| #let group-default-style = ( | ||||
|   name: ( | ||||
|     inset: ( | ||||
|       x: 5pt, | ||||
|       y: 3pt | ||||
|     ), | ||||
|     stroke: auto, | ||||
|     fill: auto | ||||
|   ), | ||||
|   desc: ( | ||||
|     inset: 3pt | ||||
|   ), | ||||
|   divider: (dash: (2pt, 1pt), thickness: .5pt), | ||||
|   padding: 10pt, | ||||
|   stroke: auto | ||||
| ) | ||||
|  | ||||
| #let render-start(grp) = get-ctx(ctx => { | ||||
|   let grp = grp | ||||
|   ctx.y -= Y-SPACE | ||||
|   let m = measure( | ||||
|     box( | ||||
|       grp.name, | ||||
|       inset: ( | ||||
|         left: 5pt, | ||||
|         right: 5pt, | ||||
|         top: 3pt, | ||||
|         bottom: 3pt | ||||
|       ), | ||||
|     ) | ||||
|   let style = styles.resolve( | ||||
|     ctx.style, | ||||
|     merge: grp.style, | ||||
|     root: "group", | ||||
|     base: group-default-style | ||||
|   ) | ||||
|  | ||||
|   let grp = grp | ||||
|   grp.insert("resolved-style", style) | ||||
|   ctx.y -= ctx.style.y-space | ||||
|  | ||||
|   let name = box( | ||||
|     text(grp.name, weight: "bold"), | ||||
|     inset: style.name.inset | ||||
|   ) | ||||
|   grp.insert("rendered-name", name) | ||||
|  | ||||
|   let desc = box( | ||||
|     text([\[#grp.desc\]], weight: "bold", size: .8em), | ||||
|     inset: style.desc.inset | ||||
|   ) | ||||
|   grp.insert("rendered-desc", desc) | ||||
|  | ||||
|   let m = measure(name) | ||||
|   ctx.groups = ctx.groups.map(g => { | ||||
|     if g.group.min-i == grp.min-i { g.start-lvl += 1 } | ||||
|     if g.group.max-i == grp.max-i { g.end-lvl += 1 } | ||||
| @@ -34,6 +62,7 @@ | ||||
|     max-x: ctx.x-pos.at(grp.max-i) + 10 | ||||
|   )) | ||||
|   ctx.y -= m.height / 1pt | ||||
|   ctx.y += ctx.style.y-space / 2 | ||||
|  | ||||
|   set-ctx(c => { | ||||
|     c.y = ctx.y | ||||
| @@ -44,56 +73,62 @@ | ||||
|  | ||||
|  | ||||
| #let draw-group(x0, x1, y0, y1, group) = { | ||||
|   let name = text(group.name, weight: "bold") | ||||
|   let m = measure(box(name)) | ||||
|   let w = m.width / 1pt + 15 | ||||
|   let h = m.height / 1pt + 6 | ||||
|   let style = group.resolved-style | ||||
|   let name = group.rendered-name | ||||
|   let desc = group.rendered-desc | ||||
|   let m = measure(name) | ||||
|   let w = m.width / 1pt | ||||
|   let h = m.height / 1pt | ||||
|   draw.rect( | ||||
|     (x0, y0), | ||||
|     (x1, y1) | ||||
|     (x1, y1), | ||||
|     stroke: style.stroke | ||||
|   ) | ||||
|  | ||||
|   let x1 = x0 + w | ||||
|   let x2 = x1 + 5 | ||||
|   draw.line( | ||||
|     (x0, y0), | ||||
|     (x0 + w, y0), | ||||
|     (x0 + w, y0 - h / 2), | ||||
|     (x0 + w - 5, y0 - h), | ||||
|     (x2, y0), | ||||
|     (x2, y0 - h / 2), | ||||
|     (x1, y0 - h), | ||||
|     (x0, y0 - h), | ||||
|     fill: COL-GRP-NAME, | ||||
|     stroke: style.name.stroke, | ||||
|     fill: style.name.fill, | ||||
|     close: true | ||||
|   ) | ||||
|   draw.content( | ||||
|     (x0, y0), | ||||
|     name, | ||||
|     anchor: "north-west", | ||||
|     padding: (left: 5pt, right: 10pt, top: 3pt, bottom: 3pt) | ||||
|     anchor: "north-west" | ||||
|   ) | ||||
|  | ||||
|   if group.desc != none { | ||||
|     draw.content( | ||||
|       (x0 + w, y0), | ||||
|       text([\[#group.desc\]], weight: "bold", size: .8em), | ||||
|       anchor: "north-west", | ||||
|       padding: 3pt | ||||
|       (x2, y0), | ||||
|       desc, | ||||
|       anchor: "north-west" | ||||
|     ) | ||||
|   } | ||||
| } | ||||
|  | ||||
| #let draw-else(x0, x1, y, elmt) = { | ||||
|   let style = elmt.resolved-style | ||||
|   draw.line( | ||||
|     (x0, y), | ||||
|     (x1, y), | ||||
|     stroke: (dash: (2pt, 1pt), thickness: .5pt) | ||||
|     stroke: style.divider | ||||
|   ) | ||||
|   draw.content( | ||||
|     (x0, y), | ||||
|     text([\[#elmt.desc\]], weight: "bold", size: .8em), | ||||
|     anchor: "north-west", | ||||
|     padding: 3pt | ||||
|     elmt.rendered-desc, | ||||
|     anchor: "north-west" | ||||
|   ) | ||||
| } | ||||
|  | ||||
| #let render-end(group) = get-ctx(ctx => { | ||||
|   ctx.y -= Y-SPACE | ||||
|   let y = ctx.y - ctx.style.y-space / 2 | ||||
|   ctx.y -= ctx.style.y-space / 2 | ||||
|   let ( | ||||
|     start-y, | ||||
|     group, | ||||
| @@ -102,10 +137,11 @@ | ||||
|     min-x, | ||||
|     max-x | ||||
|   ) = ctx.groups.pop() | ||||
|   let x0 = min-x - 10 | ||||
|   let x1 = max-x + 10 | ||||
|   let padding = normalize-units(group.resolved-style.padding) | ||||
|   let x0 = min-x - padding | ||||
|   let x1 = max-x + padding | ||||
|    | ||||
|   draw-group(x0, x1, start-y, ctx.y, group) | ||||
|   draw-group(x0, x1, start-y, y, group) | ||||
|  | ||||
|   if group.grp-type == "alt" { | ||||
|     for (else-y, else-elmt) in group.elses { | ||||
| @@ -122,12 +158,33 @@ | ||||
|   expand-parent-group(x0, x1) | ||||
| }) | ||||
|  | ||||
| #let render-else(else_) = set-ctx(ctx => { | ||||
|   ctx.y -= Y-SPACE | ||||
|   let m = measure(text([\[#else_.desc\]], weight: "bold", size: .8em)) | ||||
| #let render-else(else_) = get-ctx(ctx => { | ||||
|   let group = ctx.groups.last().group | ||||
|   let style = styles.resolve( | ||||
|     ctx.style, | ||||
|     merge: group.style, | ||||
|     root: "group", | ||||
|     base: group-default-style | ||||
|   ) | ||||
|   ctx.y -= ctx.style.y-space / 2 | ||||
|  | ||||
|   let desc = box( | ||||
|     text([\[#else_.desc\]], weight: "bold", size: .8em), | ||||
|     inset: style.desc.inset | ||||
|   ) | ||||
|   let m = measure(desc) | ||||
|   let else_ = else_ | ||||
|   else_.insert("resolved-style", style) | ||||
|   else_.insert("rendered-desc", desc) | ||||
|   ctx.groups.last().group.elses.push(( | ||||
|     ctx.y, else_ | ||||
|   )) | ||||
|   ctx.y -= m.height / 1pt | ||||
|   return ctx | ||||
|   ctx.y += ctx.style.y-space / 2 | ||||
|    | ||||
|   set-ctx(c => { | ||||
|     c.y = ctx.y | ||||
|     c.groups = ctx.groups | ||||
|     return c | ||||
|   }) | ||||
| }) | ||||
| @@ -35,6 +35,9 @@ | ||||
|   let pars-i = get-participants-i(participants) | ||||
|  | ||||
|   for elmt in group.elmts { | ||||
|     if not is-elmt(elmt) { | ||||
|       continue | ||||
|     } | ||||
|     if elmt.type == "seq" { | ||||
|       let i1 = pars-i.at(elmt.p1) | ||||
|       let i2 = pars-i.at(elmt.p2) | ||||
|   | ||||
| @@ -1,23 +1,25 @@ | ||||
| #import "core/draw/group.typ" | ||||
|  | ||||
| #let _grp(name, desc: none, type: "default", elmts) = { | ||||
| #let _grp(name, desc: none, type: "default", elmts, ..style) = { | ||||
|   return (( | ||||
|     type: "grp", | ||||
|     draw: group.render-start, | ||||
|     name: name, | ||||
|     desc: desc, | ||||
|     grp-type: type, | ||||
|     elmts: elmts | ||||
|     elmts: elmts, | ||||
|     style: style.named() | ||||
|   ),) | ||||
| } | ||||
|  | ||||
| #let _alt(desc, elmts, ..args) = { | ||||
| #let _alt(desc, elmts, ..elses-style) = { | ||||
|   let all-elmts = () | ||||
|   all-elmts += elmts | ||||
|   let args = args.pos() | ||||
|   for i in range(0, args.len(), step: 2) { | ||||
|     let else-desc = args.at(i) | ||||
|     let else-elmts = args.at(i + 1, default: ()) | ||||
|   let elses = elses-style.pos() | ||||
|   let style = elses-style.named() | ||||
|   for i in range(0, elses.len(), step: 2) { | ||||
|     let else-desc = elses.at(i) | ||||
|     let else-elmts = elses.at(i + 1, default: ()) | ||||
|     all-elmts.push(( | ||||
|       type: "else", | ||||
|       draw: group.render-else, | ||||
| @@ -26,10 +28,10 @@ | ||||
|     all-elmts += else-elmts | ||||
|   } | ||||
|  | ||||
|   return _grp("alt", desc: desc, type: "alt", all-elmts) | ||||
|   return _grp("alt", desc: desc, type: "alt", all-elmts, ..style) | ||||
| } | ||||
|  | ||||
| #let _loop(desc, min: none, max: auto, elmts) = { | ||||
| #let _loop(desc, min: none, max: auto, elmts, ..style) = { | ||||
|   let name = "loop" | ||||
|   if min != none { | ||||
|     if max == auto { | ||||
| @@ -37,7 +39,7 @@ | ||||
|     } | ||||
|     name += "(" + str(min) + "," + str(max) + ")" | ||||
|   } | ||||
|   _grp(name, desc: desc, type: "loop", elmts) | ||||
|   _grp(name, desc: desc, type: "loop", elmts, ..style) | ||||
| } | ||||
| #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, ..style) = _grp("opt", desc: desc, type: "opt", elmts, ..style.named()) | ||||
| #let _break(desc, elmts, ..style) = _grp("break", desc: desc, type: "break", elmts, ..style.named()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user