Revision Difference
PANEL:PerformLayout#546832
<function name="PerformLayout" parent="PANEL" type="hook">
<ishook>yes</ishook>
<description>
Called whenever the panels' layout needs to be performed again. This means all child panels must be re-positioned to fit the possibly new size of this panel.
This can be triggered in numerous ways:
* <page>Panel:InvalidateLayout</page> was called this or previous frame (depending on the argument)
* A child element was added to this panel (TODO: Verify me)
* The size of this panel has changed
<warning>Do **NOT** call this function directly. Use <page>Panel:InvalidateLayout</page> instead!</warning>
</description>⤶
⤶
<example>⤶
<description>Creating a resizeable DFrame with a 'sidebar' that rescales along with the DFrame</description>⤶
<code>⤶
local frame = vgui.Create("DFrame")⤶
frame:SetSize(500, 400)⤶
frame:Center()⤶
frame:SetSizable(true)⤶
⤶
-- oPerformLayout stores the original PerformLayout function⤶
-- We store it because we are going to overwrite it with our own to scale the Sidebar⤶
-- We then call the original function to maintain proper functionality of the frame⤶
-- You can find the original PerformLayout here https://github.com/Facepunch/garrysmod/blob/master/garrysmod/lua/vgui/dframe.lua#L234-L258⤶
local oPerformLayout = frame.PerformLayout⤶
frame.PerformLayout = function(pnl, w, h)⤶
oPerformLayout(pnl, w, h)⤶
pnl.Sidebar:SetWide(w*0.5)⤶
end⤶
⤶
frame.Sidebar = frame:Add("DPanel")⤶
frame.Sidebar:Dock(LEFT)⤶
frame.Sidebar.Paint = function(pnl, w, h)⤶
surface.SetDrawColor(255, 0, 0)⤶
surface.DrawRect(0, 0, w, h)⤶
end⤶
frame.Sidebar.PerformLayout = function(pnl, w, h)⤶
local buttonWidth = w*0.5⤶
local buttonHeight = h*0.5⤶
pnl.Button:SetSize(buttonWidth, buttonHeight)⤶
⤶
-- now we center our button⤶
pnl.Button:SetPos(⤶
w/2 - buttonWidth/2,⤶
h/2 - buttonHeight/2⤶
)⤶
end⤶
⤶
frame.Sidebar.Button = frame.Sidebar:Add("DButton")⤶
frame.Sidebar.Button:SetText("Hello!")⤶
</code>⤶
</example>⤶
⤶
</description>⤶
<realm>Client</realm>
<predicted>No</predicted>
<args>
<arg name="width" type="number">The panels current width.</arg>
<arg name="height" type="number">The panels current height.</arg>
</args>
</function>