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