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