Files
wnsrc/lua/sui/vgui/sui_threegrid.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

99 lines
2.2 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local math = math
local table = table
local ipairs = ipairs
local SUI, NAME = CURRENT_SUI, CURRENT_SUI.name
local Panel = {}
AccessorFunc(Panel, "horizontalMargin", "HorizontalMargin", FORCE_NUMBER)
AccessorFunc(Panel, "verticalMargin", "VerticalMargin", FORCE_NUMBER)
AccessorFunc(Panel, "columns", "Columns", FORCE_NUMBER)
AccessorFunc(Panel, "Wide2", "Wide2", FORCE_NUMBER)
function Panel:Init()
self:SetHorizontalMargin(0)
self:SetVerticalMargin(0)
self.Rows = {}
self.Cells = {}
end
function Panel:AddCell(pnl)
local cols = self:GetColumns()
local idx = math.floor(#self.Cells / cols) + 1
local rows = self.Rows[idx]
if not rows then
rows = self:CreateRow()
self.Rows[idx] = rows
end
local margin = self:GetHorizontalMargin()
local dockl, dockt, _, dockb = pnl:GetDockMargin()
pnl:SetParent(rows)
pnl:Dock(LEFT)
pnl:DockMargin(dockl, dockt, #rows.Items + 1 < cols and self:GetHorizontalMargin() or 0, dockb)
pnl:SetWide(((self:GetWide2() or self:GetWide()) - margin * (cols - 1)) / cols)
table.insert(rows.Items, pnl)
table.insert(self.Cells, pnl)
self:CalculateRowHeight(rows)
end
function Panel:CreateRow()
local row = self:Add("Panel")
row:Dock(TOP)
row:DockMargin(0, 0, 0, self:GetVerticalMargin())
row.Items = {}
return row
end
function Panel:CalculateRowHeight(row)
local height = 0
for k, v in ipairs(row.Items) do
local _, t, _, b = v:GetDockMargin()
height = math.max(height, v:GetTall() + t + b)
end
row:SetTall(height)
end
function Panel:Skip()
local cell = vgui.Create("Panel")
self:AddCell(cell)
end
function Panel:CalculateRowHeights()
for _, row in ipairs(self.Rows) do
self:CalculateRowHeight(row)
end
end
function Panel:Clear()
for _, row in ipairs(self.Rows) do
for _, cell in ipairs(row.Items) do
cell:Remove()
end
row:Remove()
end
self.Cells, self.Rows = {}, {}
end
Panel.OnRemove = Panel.Clear
sui.register("ThreeGrid", Panel, NAME .. ".ScrollPanel")