/
fraction.go
78 lines (69 loc) · 1.88 KB
/
fraction.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package typeset
import (
"gioui.org/f32"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/op/clip"
"gioui.org/op/paint"
"gioui.org/unit"
"github.com/wrnrlr/foxtrot/style"
"image"
)
type Fraction struct {
Numerator, Denominator Shape
}
func (f *Fraction) Dimensions(gtx *layout.Context, s style.Style) layout.Dimensions {
dN := f.Numerator.Dimensions(gtx, s)
dD := f.Denominator.Dimensions(gtx, s)
width := max(dN.Size.X, dD.Size.X)
height := dN.Size.Y + dD.Size.Y + int(unit.Sp(4).V)
dims := layout.Dimensions{
Size: image.Point{X: width, Y: height},
Baseline: height / 2}
return dims
}
func (f *Fraction) Layout(gtx *layout.Context, s style.Style) {
dims := f.Dimensions(gtx, s)
var stack op.StackOp
stack.Push(gtx.Ops)
dN := f.Numerator.Dimensions(gtx, s)
leftOffset := float32(dims.Size.X-dN.Size.X) / 2
offset := f32.Point{X: leftOffset, Y: 0}
op.TransformOp{}.Offset(offset).Add(gtx.Ops)
f.Numerator.Layout(gtx, s)
stack.Pop()
topOffset := float32(dN.Size.Y + gtx.Px(unit.Sp(1)))
height := gtx.Px(unit.Sp(1))
w := float32(dims.Size.X)
h := float32(height)
stack.Push(gtx.Ops)
offset = f32.Point{X: 0, Y: topOffset}
op.TransformOp{}.Offset(offset).Add(gtx.Ops)
size := float32(gtx.Px(unit.Sp(1)))
var p clip.Path
p.Begin(gtx.Ops)
p.Move(f32.Point{X: 0, Y: 0})
p.Line(f32.Point{X: w, Y: 0})
p.Line(f32.Point{X: 0, Y: size})
p.Line(f32.Point{X: -w, Y: 0})
p.Line(f32.Point{X: 0, Y: -size})
p.End()
paint.PaintOp{f32.Rectangle{Max: f32.Point{X: w, Y: h}}}.Add(gtx.Ops)
stack.Pop()
topOffset += float32(gtx.Px(unit.Sp(1)))
stack.Push(gtx.Ops)
dD := f.Denominator.Dimensions(gtx, s)
leftOffset = float32(dims.Size.X-dD.Size.X) / 2
offset = f32.Point{X: leftOffset, Y: topOffset}
op.TransformOp{}.Offset(offset).Add(gtx.Ops)
f.Denominator.Layout(gtx, s)
stack.Pop()
gtx.Dimensions = dims
}
func max(x, y int) int {
if x > y {
return x
} else {
return y
}
}