-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGrid.lua
More file actions
139 lines (117 loc) · 4.16 KB
/
Copy pathGrid.lua
File metadata and controls
139 lines (117 loc) · 4.16 KB
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
if not gui then
gui = {}
end
gui.grid = class("gui.grid")
function gui.grid:created(col, styleFunc)
self.padding = {left = 10, right = 10, top = 10, bottom = 10}
self.spacing = 10
self.numCol = col
self.gridElementStyle = styleFunc or self:defaultStyle()
self.elementOrder = {}
self.elementSize = vec2(100,300)
-- Types: default, stretch, fit
self.fitType = "default"
self.oldSize = nil
end
function gui.grid:updateFitType(doPass)
if self.fitType == "fit" and (self.oldSize ~= self.entity.parent.size.x or doPass) then
local num = math.floor(self.entity.parent.size.x / self.elementSize.x)
for k = num, 1, -1 do
if self:checkSize(k) < self.entity.parent.size.x then
self.numCol = k
break
end
end
self.oldSize = self.entity.parent.size.x
elseif self.fitType == "stretch" and (self.oldSize ~= self.entity.parent.size.x or doPass) then
local newSize = (self.entity.parent.size.x - ((self.numCol - 1) * self.spacing) - (self.padding.left + self.padding.right)) / self.numCol
local ratio = newSize / self.elementSize.x
self.elementSize = self.elementSize * ratio
self.oldSize = self.entity.parent.size.x
end
end
function gui.grid:checkSize(numCol)
local width = (numCol * self.elementSize.x) + ((numCol - 1) * self.spacing) + (self.padding.left + self.padding.right)
return width
end
function gui.grid:setPadding(padding)
if type(padding) == "number" or padding.x ~= nil then
if type(padding) == "number" then
self.padding.left = padding
self.padding.right = padding
self.padding.top = padding
self.padding.bottom = padding
else
self.padding.left = padding.x
self.padding.right = padding.x
self.padding.top = padding.y
self.padding.bottom = padding.y
end
else
self.padding = padding
end
end
--computeSize
function gui.grid:changeSize()
self.numRow = math.ceil(#self.elementOrder / self.numCol)
local width = (self.numCol * self.elementSize.x) + ((self.numCol - 1) * self.spacing) + (self.padding.left + self.padding.right)
local height = (self.numRow * self.elementSize.y) + ((self.numRow - 1) * self.spacing) + (self.padding.top + self.padding.bottom)
self.entity.size = vec2(width, height)
end
function gui.grid:layout()
self:updateFitType()
self:reorderGrid()
self:changeSize()
end
function gui.grid:reorderGrid()
for k, element in ipairs(self.elementOrder) do
element.size = self.elementSize
element:anchor(LEFT, TOP)
element.pivot = vec2(0, 1)
if not element:has(gui.dragable) or not element:get(gui.dragable).isDragging then
local pos = self:getElementPos(k)
element.x = pos.x
element.y = pos.y
end
end
end
function gui.grid:defaultStyle()
return function(element, elementNumber)
element.sprite = asset.Square
element.color = color(255)
end
end
function gui.grid:addElement(...)
local element = self.gridElementStyle(#self.elementOrder + 1, ...)
element.parent = self.entity
element.size = self.elementSize
table.insert(self.elementOrder, element)
end
function gui.grid:getElement(num)
return self.elementOrder[num]
end
function gui.grid:getLastElement()
return self:getElement(#self.elementOrder)
end
function gui.grid:removeElement(num)
local element = self.elementOrder[num]
table.remove(self.elementOrder, num)
element:destroy()
end
function gui.grid:removeAll()
for k = #self.elementOrder, 1, -1 do
self:removeElement(k)
end
self.oldSize = nil
end
function gui.grid:clear()
self:removeAll()
end
function gui.grid:getElementPos(pos)
local col = ((pos - 1) % self.numCol) + 1
local row = (math.ceil(pos / self.numCol))
local xPos = self.padding.left + ((col-1) * self.elementSize.x) + ((col-1) * self.spacing)
local yPos = -(self.padding.top + ((row - 1) * self.elementSize.y) + ((row - 1) * self.spacing) )
return vec2(xPos, yPos)
end
Profiler.wrapClass(gui.grid)