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