Diff
diff --git a/docs/cstyle/plugins/flex/index.html b/docs/cstyle/plugins/flex/index.html
index dc5889b..4421d39 100644
--- a/docs/cstyle/plugins/flex/index.html
+++ b/docs/cstyle/plugins/flex/index.html
@@ -103,36 +103,36 @@
- 4 "fmt"
- 5 "gui/cstyle"
- 6 "gui/element"
- 7 "gui/utils"
- 8 "slices"
- 9 "strings"
- 10)
- 11
- 12func Init() cstyle.Plugin {
- 13 return cstyle.Plugin{
- 14 Selector: func(n *element.Node) bool {
- 15 styles := map[string]string{
- 16 "display": "flex",
- 17 // "justify-content": "*",
- 18 // "align-content": "*",
- 19 // "align-items": "*",
- 20 // "flex-wrap": "*",
- 21 // "flex-direction": "*",
- 22 }
- 23 matches := true
- 24 for name, value := range styles {
- 25 if n.Style[name] != value && !(value == "*") && n.Style[name] != "" {
- 26 matches = false
- 27 }
- 28 }
- 29 return matches
- 30 },
- 31 Level: 2,
- 32 Handler: func(n *element.Node, state *map[string]element.State) {
- 33 // !ISSUE: align-items is not impleamented
- 34 // + issues with the width when notaspans are included
- 35 s := *state
- 36 self := s[n.Properties.Id]
- 37 // Brief: justify does not align the bottom row correctly
- 38 // y axis also needs to be done
- 39 verbs := strings.Split(n.Style["flex-direction"], "-")
+ 4 "gui/cstyle"
+ 5 "gui/element"
+ 6 "gui/utils"
+ 7 "slices"
+ 8 "strings"
+ 9)
+ 10
+ 11func Init() cstyle.Plugin {
+ 12 return cstyle.Plugin{
+ 13 Selector: func(n *element.Node) bool {
+ 14 styles := map[string]string{
+ 15 "display": "flex",
+ 16 "justify-content": "*",
+ 17 "align-content": "*",
+ 18 "align-items": "*",
+ 19 "flex-wrap": "*",
+ 20 "flex-direction": "*",
+ 21 }
+ 22 matches := true
+ 23 for name, value := range styles {
+ 24 if n.Style[name] != value && !(value == "*") && n.Style[name] != "" {
+ 25 matches = false
+ 26 }
+ 27 }
+ 28 return matches
+ 29 },
+ 30 Level: 2,
+ 31 Handler: func(n *element.Node, state *map[string]element.State) {
+ 32 // !ISSUE: align-items is not impleamented
+ 33 s := *state
+ 34 self := s[n.Properties.Id]
+ 35 // Brief: justify does not align the bottom row correctly
+ 36 // y axis also needs to be done
+ 37 verbs := strings.Split(n.Style["flex-direction"], "-")
+ 38
+ 39 orderedNode := order(*n, state, n.Children, verbs[0], len(verbs) > 1, n.Style["flex-wrap"] == "wrap")
@@ -140,160 +140,246 @@
- 41 orderedNode := order(*n, state, n.Children, verbs[0], len(verbs) > 1, n.Style["flex-wrap"] == "wrap")
- 42 // fmt.Println(orderedNode)
- 43 fmt.Println("######")
- 44 for y := range orderedNode[0] {
- 45 fmt.Print(y, " ")
- 46 }
- 47 fmt.Print("\n")
- 48
- 49 for x, row := range orderedNode {
- 50 fmt.Print(x, " ")
- 51 for _, col := range row {
- 52 fmt.Print(col.Properties.Id, " ")
- 53 }
- 54 fmt.Print("\n")
- 55 }
- 56
- 57 // c := s[n.Children[0].Properties.Id]
- 58 // c.Width = 100
- 59 // (*state)[n.Children[0].Properties.Id] = c
- 60
- 61 (*state)[n.Properties.Id] = self
- 62 },
- 63 }
- 64}
- 65
- 66func order(p element.Node, state *map[string]element.State, elements []element.Node, direction string, reversed, wrap bool) [][]element.Node {
- 67 // Get the state of the parent node
- 68 s := *state
- 69 self := s[p.Properties.Id]
- 70
- 71 // Variables for handling direction and margins
- 72 var dir, marginStart, marginEnd string
- 73 if direction == "column" {
- 74 dir = "Height"
- 75 marginStart = "Top"
- 76 marginEnd = "Bottom"
- 77 } else {
- 78 dir = "Width"
- 79 marginStart = "Left"
- 80 marginEnd = "Right"
- 81 }
- 82
- 83 // Get the maximum size in the specified direction
- 84 max, _ := utils.GetStructField(&self, dir)
- 85
- 86 // Container for the ordered nodes
- 87 nodes := [][]element.Node{}
- 88
- 89 if wrap {
- 90 // If wrapping is enabled
- 91 counter := 0
- 92 if direction == "column" {
- 93 // Collect nodes for column direction
- 94 collector := []element.Node{}
- 95 for _, v := range elements {
- 96 vState := s[v.Properties.Id]
- 97 elMax := vState.Height
- 98 elMS, _ := utils.GetStructField(&vState.Margin, marginStart)
- 99 elME, _ := utils.GetStructField(&vState.Margin, marginEnd)
-100 tMax := elMax + elMS.(float32) + elME.(float32)
-101
-102 // Check if the current element can fit in the current row/column
-103 if counter+int(tMax) < int(max.(float32)) {
-104 collector = append(collector, v)
-105 } else {
-106 if reversed {
-107 slices.Reverse(collector)
-108 }
-109 nodes = append(nodes, collector)
-110 collector = []element.Node{}
-111 collector = append(collector, v)
-112 counter = 0
-113 }
-114 counter += int(tMax)
-115 }
-116 if len(collector) > 0 {
-117 nodes = append(nodes, collector)
-118 }
-119 } else {
-120 // Collect nodes for row direction
-121 var mod int
-122 for _, v := range elements {
-123 vState := s[v.Properties.Id]
-124 elMax := vState.Width
-125 elMS, _ := utils.GetStructField(&vState.Margin, marginStart)
-126 elME, _ := utils.GetStructField(&vState.Margin, marginEnd)
-127 tMax := elMax + elMS.(float32) + elME.(float32)
-128
-129 // Check if the current element can fit in the current row/column
-130 if counter+int(tMax) < int(max.(float32)) {
-131 if len(nodes)-1 < mod {
-132 nodes = append(nodes, []element.Node{v})
-133 } else {
-134 nodes[mod] = append(nodes[mod], v)
-135 }
-136 } else {
-137 mod = 0
-138 counter = 0
-139 if len(nodes)-1 < mod {
-140 nodes = append(nodes, []element.Node{v})
-141 } else {
-142 nodes[mod] = append(nodes[mod], v)
-143 }
-144 }
-145 counter += int(tMax)
-146 mod++
-147 }
-148 if reversed {
-149 slices.Reverse(nodes)
-150 }
-151 }
-152 } else {
-153 // If wrapping is not enabled
-154 var tMax float32
-155 for _, v := range elements {
-156 vState := s[v.Properties.Id]
-157 elMax, _ := utils.GetStructField(&vState, dir)
-158 elMS, _ := utils.GetStructField(&vState.Margin, marginStart)
-159 elME, _ := utils.GetStructField(&vState.Margin, marginEnd)
-160 tMax += elMax.(float32) + elMS.(float32) + elME.(float32)
-161 }
-162
-163 pMax, _ := utils.GetStructField(&self, dir)
-164
-165 // Resize nodes to fit
-166 var newSize float32
-167 if tMax > pMax.(float32) {
-168 newSize = pMax.(float32) / float32(len(elements))
-169 }
-170 if dir == "Width" {
-171 for _, v := range elements {
-172 vState := s[v.Properties.Id]
-173 if newSize != 0 {
-174 vState.Width = newSize
-175 }
-176 nodes = append(nodes, []element.Node{v})
-177 }
-178 if reversed {
-179 slices.Reverse(nodes)
-180 }
-181 } else {
-182 nodes = append(nodes, []element.Node{})
-183 for _, v := range elements {
-184 vState := s[v.Properties.Id]
-185 if newSize != 0 {
-186 vState.Height = newSize
-187 }
-188 nodes[0] = append(nodes[0], v)
-189 }
-190 if reversed {
-191 slices.Reverse(nodes[0])
-192 }
-193 }
-194 }
-195
-196 // Update the state of the parent node
-197 (*state)[p.Properties.Id] = self
-198
-199 return nodes
-200}
+ 41 // var i int
+ 42
+ 43 colWidth := self.Width / float32(len(orderedNode))
+ 44
+ 45 var xOffset, yOffset float32
+ 46 // if n.Style["justify-content"] == "space-evenly" {
+ 47 // b, _ := utils.ConvertToPixels(n.Children[i].Properties.Border.Width, n.Children[i].Properties.EM, n.Properties.Computed["width"])
+ 48 // cwV := utils.Max((colWidth-(n.Children[i].Properties.Computed["width"]+(b*2)))/2, 0)
+ 49 // xOffset = cwV
+ 50 // }
+ 51
+ 52 posTrack := map[int]int{}
+ 53 p := 0
+ 54
+ 55 for a, column := range orderedNode {
+ 56 var maxColumnHeight float32
+ 57 for _, item := range column {
+ 58 itemState := s[item.Properties.Id]
+ 59 maxColumnHeight = utils.Max(itemState.Height, maxColumnHeight)
+ 60 }
+ 61
+ 62 yOffset = s[n.Children[0].Properties.Id].Y
+ 63 for _, item := range column {
+ 64 var i int
+ 65 for c, v := range n.Children {
+ 66 if v.Properties.Id == item.Properties.Id {
+ 67 i = c
+ 68 }
+ 69 }
+ 70 posTrack[p] = i
+ 71 p++
+ 72 itemState := s[item.Properties.Id]
+ 73 cState := s[n.Children[i].Properties.Id]
+ 74 // n.Children[i] = item
+ 75 if n.Style["justify-content"] == "space-between" {
+ 76 cwV := utils.Max((colWidth - (itemState.Width)), 0)
+ 77 // fmt.Println(colWidth, (itemState.Width), cwV, xOffset)
+ 78 if a == 0 {
+ 79 cState.X += 0
+ 80 } else if a == len(orderedNode)-1 {
+ 81 cState.X += cwV
+ 82 } else {
+ 83 cState.X += cwV / 2
+ 84 }
+ 85 } else if n.Style["justify-content"] == "flex-end" || n.Style["justify-content"] == "center" {
+ 86 dif := self.Width - (xOffset)
+ 87 if n.Style["justify-content"] == "center" {
+ 88 dif = dif / 2
+ 89 }
+ 90 cState.X += dif
+ 91 } else if n.Style["justify-content"] == "flex-start" || n.Style["justify-content"] == "" {
+ 92 cState.X += xOffset
+ 93 } else {
+ 94 cwV := utils.Max((colWidth-(itemState.Width))/2, 0)
+ 95 var offset float32
+ 96 if n.Style["justify-content"] == "space-evenly" {
+ 97 offset = ((cwV * 2) / float32(len(orderedNode))) * float32(a)
+ 98 }
+ 99 cState.X += xOffset + (cwV - offset)
+100 }
+101 cState.Y = yOffset
+102 yOffset += maxColumnHeight
+103 (*state)[n.Children[i].Properties.Id] = cState
+104 i++
+105 }
+106 xOffset += colWidth
+107 }
+108
+109 content := n.Style["align-content"]
+110
+111 if n.Style["flex-direction"] == "column" {
+112 content = n.Style["justify-content"]
+113 }
+114
+115 if content != "" && content != "flex-start" {
+116 var min, max, rows, col, currY float32
+117 min = 1000000000000
+118 for _, v := range n.Children {
+119 vState := s[v.Properties.Id]
+120 min = utils.Min(min, vState.Y)
+121 max = utils.Max(max, vState.Height+vState.Y)
+122 if vState.Y > currY {
+123 rows++
+124 currY = vState.Y
+125 }
+126 }
+127
+128 height := max - min
+129 rowHeight := ((self.Height - height) / rows)
+130 for e := range n.Children {
+131 i := posTrack[e]
+132 cState := s[n.Children[i].Properties.Id]
+133 row := float32(int(e % int(rows)))
+134 if row == 0 {
+135 col++
+136 }
+137 if len(orderedNode[int(col)-1]) <= int(row) {
+138 row = 0
+139 }
+140
+141 if content == "center" {
+142 cState.Y += (self.Height - height) / 2
+143 } else if content == "flex-end" {
+144 cState.Y += (self.Height - height)
+145 } else if content == "space-around" {
+146 cState.Y += (rowHeight * row) + (rowHeight / 2)
+147 } else if content == "space-evenly" {
+148 cState.Y += (rowHeight * row) + (rowHeight / 2)
+149 } else if content == "space-between" {
+150 cState.Y += (((self.Height - height) / (rows - 1)) * row)
+151 } else if content == "stretch" {
+152 cState.Y += (rowHeight * row)
+153 if n.Children[i].Style["height"] == "" {
+154 cState.Height = self.Height / rows
+155 }
+156 }
+157 (*state)[n.Children[i].Properties.Id] = cState
+158
+159 }
+160
+161 }
+162 (*state)[n.Properties.Id] = self
+163 },
+164 }
+165}
+166
+167func order(p element.Node, state *map[string]element.State, elements []element.Node, direction string, reversed, wrap bool) [][]element.Node {
+168 s := *state
+169 self := s[p.Properties.Id]
+170 var dir, marginStart, marginEnd string
+171 if direction == "column" {
+172 dir = "Height"
+173 marginStart = "Top"
+174 marginEnd = "Bottom"
+175 } else {
+176 dir = "Width"
+177 marginStart = "Left"
+178 marginEnd = "Right"
+179 }
+180 max, _ := utils.GetStructField(&self, dir)
+181
+182 nodes := [][]element.Node{}
+183
+184 if wrap {
+185 counter := 0
+186 if direction == "column" {
+187 collector := []element.Node{}
+188 for _, v := range elements {
+189 vState := s[v.Properties.Id]
+190 elMax := vState.Height
+191 elMS, _ := utils.GetStructField(&vState.Margin, marginStart)
+192 elME, _ := utils.GetStructField(&vState.Margin, marginEnd)
+193 tMax := elMax + elMS.(float32) + elME.(float32)
+194 if counter+int(tMax) < int(max.(float32)) {
+195 collector = append(collector, v)
+196 } else {
+197 if reversed {
+198 slices.Reverse(collector)
+199 }
+200 nodes = append(nodes, collector)
+201 collector = []element.Node{}
+202 collector = append(collector, v)
+203 counter = 0
+204 }
+205 counter += int(tMax)
+206 }
+207 if len(collector) > 0 {
+208 nodes = append(nodes, collector)
+209 }
+210 } else {
+211 var mod int
+212 for _, v := range elements {
+213 vState := s[v.Properties.Id]
+214 elMax := vState.Width
+215 elMS, _ := utils.GetStructField(&vState.Margin, marginStart)
+216 elME, _ := utils.GetStructField(&vState.Margin, marginEnd)
+217 tMax := elMax + elMS.(float32) + elME.(float32)
+218 if counter+int(tMax) < int(max.(float32)) {
+219 if len(nodes)-1 < mod {
+220 nodes = append(nodes, []element.Node{v})
+221 } else {
+222 nodes[mod] = append(nodes[mod], v)
+223 }
+224 } else {
+225 mod = 0
+226 counter = 0
+227 if len(nodes)-1 < mod {
+228 nodes = append(nodes, []element.Node{v})
+229 } else {
+230 nodes[mod] = append(nodes[mod], v)
+231 }
+232 }
+233 counter += int(tMax)
+234 mod++
+235 }
+236 if reversed {
+237 slices.Reverse(nodes)
+238 }
+239 }
+240 } else {
+241 var tMax float32
+242 for _, v := range elements {
+243 vState := s[v.Properties.Id]
+244 elMax, _ := utils.GetStructField(&vState, dir)
+245 elMS, _ := utils.GetStructField(&vState.Margin, marginStart)
+246 elME, _ := utils.GetStructField(&vState.Margin, marginEnd)
+247 tMax += elMax.(float32) + elMS.(float32) + elME.(float32)
+248 }
+249
+250 pMax, _ := utils.GetStructField(&self, dir)
+251
+252 // Resize node to fit
+253 var newSize float32
+254 if tMax > pMax.(float32) {
+255 newSize = pMax.(float32) / float32(len(elements))
+256 }
+257 if dir == "Width" {
+258 for _, v := range elements {
+259 vState := s[v.Properties.Id]
+260 if newSize != 0 {
+261 vState.Width = newSize
+262 }
+263 nodes = append(nodes, []element.Node{v})
+264 }
+265 if reversed {
+266 slices.Reverse(nodes)
+267 }
+268 } else {
+269 nodes = append(nodes, []element.Node{})
+270 for _, v := range elements {
+271 vState := s[v.Properties.Id]
+272 if newSize != 0 {
+273 vState.Height = newSize
+274 }
+275 nodes[0] = append(nodes[0], v)
+276 }
+277 if reversed {
+278 slices.Reverse(nodes[0])
+279 }
+280 }
+281
+282 }
+283 (*state)[p.Properties.Id] = self
+284
+285 return nodes
+286}