forked from HEL/chronos
		
	refactored groups, separators and delays
This commit is contained in:
		
							
								
								
									
										120
									
								
								src/core/draw/group.typ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								src/core/draw/group.typ
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
#import "../utils.typ": get-ctx, set-ctx
 | 
			
		||||
#import "../../consts.typ": *
 | 
			
		||||
#import "../../cetz.typ": draw
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
      ),
 | 
			
		||||
    )
 | 
			
		||||
  )
 | 
			
		||||
  ctx.groups = ctx.groups.map(g => {
 | 
			
		||||
    if g.at(1).min-i == grp.min-i { g.at(2) += 1 }
 | 
			
		||||
    if g.at(1).max-i == grp.max-i { g.at(3) += 1 }
 | 
			
		||||
    g
 | 
			
		||||
  })
 | 
			
		||||
  if grp.grp-type == "alt" {
 | 
			
		||||
    grp.insert("elses", ())
 | 
			
		||||
  }
 | 
			
		||||
  ctx.groups.push((ctx.y, grp, 0, 0))
 | 
			
		||||
  ctx.y -= m.height / 1pt
 | 
			
		||||
 | 
			
		||||
  set-ctx(c => {
 | 
			
		||||
    c.y = ctx.y
 | 
			
		||||
    c.groups = ctx.groups
 | 
			
		||||
    return c
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
  draw.rect(
 | 
			
		||||
    (x0, y0),
 | 
			
		||||
    (x1, y1)
 | 
			
		||||
  )
 | 
			
		||||
  draw.merge-path(
 | 
			
		||||
    fill: COL-GRP-NAME,
 | 
			
		||||
    close: true,
 | 
			
		||||
    {
 | 
			
		||||
      draw.line(
 | 
			
		||||
        (x0, y0),
 | 
			
		||||
        (x0 + w, y0),
 | 
			
		||||
        (x0 + w, y0 - h / 2),
 | 
			
		||||
        (x0 + w - 5, y0 - h),
 | 
			
		||||
        (x0, y0 - h)
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  )
 | 
			
		||||
  draw.content(
 | 
			
		||||
    (x0, y0),
 | 
			
		||||
    name,
 | 
			
		||||
    anchor: "north-west",
 | 
			
		||||
    padding: (left: 5pt, right: 10pt, top: 3pt, bottom: 3pt)
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  if group.desc != none {
 | 
			
		||||
    draw.content(
 | 
			
		||||
      (x0 + w, y0),
 | 
			
		||||
      text([\[#group.desc\]], weight: "bold", size: .8em),
 | 
			
		||||
      anchor: "north-west",
 | 
			
		||||
      padding: 3pt
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#let draw-else(x0, x1, y, elmt) = {
 | 
			
		||||
  draw.line(
 | 
			
		||||
    (x0, y),
 | 
			
		||||
    (x1, y),
 | 
			
		||||
    stroke: (dash: (2pt, 1pt), thickness: .5pt)
 | 
			
		||||
  )
 | 
			
		||||
  draw.content(
 | 
			
		||||
    (x0, y),
 | 
			
		||||
    text([\[#elmt.desc\]], weight: "bold", size: .8em),
 | 
			
		||||
    anchor: "north-west",
 | 
			
		||||
    padding: 3pt
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#let render-end(group) = get-ctx(ctx => {
 | 
			
		||||
  ctx.y -= Y-SPACE
 | 
			
		||||
  let (start-y, group, start-lvl, end-lvl) = ctx.groups.pop()
 | 
			
		||||
  let x0 = ctx.x-pos.at(group.min-i) - start-lvl * 10 - 20
 | 
			
		||||
  let x1 = ctx.x-pos.at(group.max-i) + end-lvl * 10 + 20
 | 
			
		||||
  
 | 
			
		||||
  draw-group(x0, x1, start-y, ctx.y, group)
 | 
			
		||||
 | 
			
		||||
  if group.grp-type == "alt" {
 | 
			
		||||
    for (else-y, else-elmt) in group.elses {
 | 
			
		||||
      draw-else(x0, x1, else-y, else-elmt)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  set-ctx(c => {
 | 
			
		||||
    c.y = ctx.y
 | 
			
		||||
    c.groups = ctx.groups
 | 
			
		||||
    return c
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
#let render-else(else_) = set-ctx(ctx => {
 | 
			
		||||
  ctx.y -= Y-SPACE
 | 
			
		||||
  let m = measure(text([\[#else_.desc\]], weight: "bold", size: .8em))
 | 
			
		||||
  ctx.groups.last().at(1).elses.push((
 | 
			
		||||
    ctx.y, else_
 | 
			
		||||
  ))
 | 
			
		||||
  ctx.y -= m.height / 1pt
 | 
			
		||||
  return ctx
 | 
			
		||||
})
 | 
			
		||||
		Reference in New Issue
	
	Block a user