Inline Plugin
# Init?(go)
1package inline
2
3import (
4 "gui/cstyle"
5 "gui/element"
6)
7
8func Init() cstyle.Plugin {
9 return cstyle.Plugin{
10 Styles: map[string]string{
11 "display": "inline",
12 },
13 Level: 1,
14 Handler: func(n *element.Node, state *map[string]element.State) {
15 s := *state
16 self := s[n.Properties.Id]
17 parent := s[n.Parent.Properties.Id]
18 copyOfX := self.X
19 copyOfY := self.Y
20 xCollect := float32(0)
21 for i, v := range n.Parent.Children {
22 vState := s[v.Properties.Id]
23 if vState.Style["position"] != "absolute" {
24 if vState.Style["display"] != "inline" {
25 xCollect = 0
26 } else {
27 if v.Properties.Id == n.Properties.Id {
28 if self.X+xCollect+self.Width > ((parent.Width)-parent.Padding.Right)+parent.X && i > 0 {
29 // Break Node
30 sibling := s[n.Parent.Children[i-1].Properties.Id]
31 self.Y += sibling.Height
32 self.X = copyOfX
33 } else if i > 0 {
34 // Node did not break
35 self.X += xCollect
36 }
37 break
38 } else {
39 if vState.Style["display"] == "inline" {
40 if colliderDetection(vState, self) {
41 xCollect += vState.Width
42 } else {
43 xCollect = 0
44 }
45 }
46 }
47 }
48 }
49 }
50 propagateOffsets(n, copyOfX, copyOfY, self, state)
51 self.Style["inlineText"] = "true"
52 (*state)[n.Properties.Id] = self
53 },
54 }
55}
56
57func propagateOffsets(n *element.Node, copyOfX, copyOfY float32, self element.State, state *map[string]element.State) {
58 s := *state
59 for _, v := range n.Children {
60 vState := s[v.Properties.Id]
61 vState.X += self.X - copyOfX
62 vState.Y += self.Y - copyOfY
63 if len(v.Children) > 0 {
64 propagateOffsets(&v, copyOfX, copyOfY, self, state)
65 }
66 (*state)[v.Properties.Id] = vState
67 }
68}
69
70func colliderDetection(s1, s2 element.State) bool {
71 s1Min := s1.Y
72 s1Max := s1.Y + s1.Height
73 s2Min := s2.Y
74 s2Max := s2.Y + s2.Height
75 return s1Min > s2Min && s1Min < s2Max || s1Max > s2Min && s1Min < s2Max || s2Min > s1Min && s2Min < s1Max || s2Max > s1Min && s2Min < s1Max
76}