mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
214
lua/vgui/diconlayout.lua
Normal file
214
lua/vgui/diconlayout.lua
Normal file
@@ -0,0 +1,214 @@
|
||||
--[[
|
||||
| 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 PANEL = {}
|
||||
|
||||
AccessorFunc( PANEL, "m_iSpaceX", "SpaceX" )
|
||||
AccessorFunc( PANEL, "m_iSpaceY", "SpaceY" )
|
||||
AccessorFunc( PANEL, "m_iBorder", "Border" )
|
||||
AccessorFunc( PANEL, "m_iLayoutDir", "LayoutDir" )
|
||||
|
||||
AccessorFunc( PANEL, "m_bStretchW", "StretchWidth", FORCE_BOOL )
|
||||
AccessorFunc( PANEL, "m_bStretchH", "StretchHeight", FORCE_BOOL )
|
||||
|
||||
function PANEL:Init()
|
||||
|
||||
self:SetDropPos( "46" )
|
||||
|
||||
self:SetSpaceX( 0 )
|
||||
self:SetSpaceY( 0 )
|
||||
self:SetBorder( 0 )
|
||||
self:SetLayoutDir( TOP )
|
||||
|
||||
self:SetStretchWidth( false )
|
||||
self:SetStretchHeight( true )
|
||||
|
||||
self.LastW = 0
|
||||
self.LastH = 0
|
||||
|
||||
end
|
||||
|
||||
function PANEL:Layout()
|
||||
|
||||
self.LastW = 0
|
||||
self.LastH = 0
|
||||
self:InvalidateLayout()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:LayoutIcons_TOP()
|
||||
|
||||
local x = self.m_iBorder
|
||||
local y = self.m_iBorder
|
||||
local RowHeight = 0
|
||||
local MaxWidth = self:GetWide() - self.m_iBorder
|
||||
|
||||
for k, v in ipairs( self:GetChildren() ) do
|
||||
|
||||
if ( !v:IsVisible() ) then continue end
|
||||
|
||||
local w, h = v:GetSize()
|
||||
if ( x + w > MaxWidth || ( v.OwnLine && x > self.m_iBorder ) ) then
|
||||
|
||||
x = self.m_iBorder
|
||||
y = y + RowHeight + self.m_iSpaceY
|
||||
RowHeight = 0
|
||||
|
||||
end
|
||||
|
||||
v:SetPos( x, y )
|
||||
|
||||
x = x + v:GetWide() + self.m_iSpaceX
|
||||
RowHeight = math.max( RowHeight, v:GetTall() )
|
||||
|
||||
-- Start a new line if this panel is meant to be on its own line
|
||||
if ( v.OwnLine ) then
|
||||
x = MaxWidth + 1
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:LayoutIcons_LEFT()
|
||||
|
||||
local x = self.m_iBorder
|
||||
local y = self.m_iBorder
|
||||
local RowWidth = 0
|
||||
local MaxHeight = self:GetTall() - self.m_iBorder
|
||||
|
||||
for k, v in ipairs( self:GetChildren() ) do
|
||||
|
||||
if ( !v:IsVisible() ) then continue end
|
||||
|
||||
local w, h = v:GetSize()
|
||||
if ( y + h > MaxHeight || ( v.OwnLine && y > self.m_iBorder ) ) then
|
||||
|
||||
y = self.m_iBorder
|
||||
x = x + RowWidth + self.m_iSpaceX
|
||||
RowWidth = 0
|
||||
|
||||
end
|
||||
|
||||
v:SetPos( x, y )
|
||||
|
||||
y = y + v:GetTall() + self.m_iSpaceY
|
||||
RowWidth = math.max( RowWidth, v:GetWide() )
|
||||
|
||||
-- Start a new line if this panel is meant to be on its own line
|
||||
if ( v.OwnLine ) then
|
||||
y = MaxHeight + 1
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:PerformLayout()
|
||||
|
||||
local ShouldLayout = false
|
||||
|
||||
if ( self.LastW != self:GetWide() ) then ShouldLayout = true end
|
||||
if ( self.LastH != self:GetTall() ) then ShouldLayout = true end
|
||||
|
||||
self.LastW = self:GetWide()
|
||||
self.LastH = self:GetTall()
|
||||
|
||||
if ( ShouldLayout ) then
|
||||
|
||||
if ( self.m_iLayoutDir == LEFT ) then self:LayoutIcons_LEFT() end
|
||||
if ( self.m_iLayoutDir == TOP ) then self:LayoutIcons_TOP() end
|
||||
|
||||
end
|
||||
|
||||
self:SizeToChildren( self:GetStretchWidth(), self:GetStretchHeight() )
|
||||
|
||||
end
|
||||
|
||||
function PANEL:OnModified()
|
||||
|
||||
-- Override me
|
||||
|
||||
end
|
||||
|
||||
function PANEL:OnChildRemoved()
|
||||
|
||||
self:Layout()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:OnChildAdded( child )
|
||||
|
||||
local dn = self:GetDnD()
|
||||
if ( dn ) then
|
||||
child:Droppable( self:GetDnD() )
|
||||
end
|
||||
|
||||
if ( self:IsSelectionCanvas() ) then
|
||||
child:SetSelectable( true )
|
||||
end
|
||||
|
||||
self:Layout()
|
||||
|
||||
end
|
||||
|
||||
function PANEL:Copy()
|
||||
|
||||
local copy = vgui.Create( "DIconLayout", self:GetParent() )
|
||||
copy:CopyBase( self )
|
||||
copy:SetSortable( self:GetSortable() )
|
||||
copy:SetDnD( self:GetDnD() )
|
||||
copy:SetSpaceX( self:GetSpaceX() )
|
||||
copy:SetSpaceX( self:GetSpaceX() )
|
||||
copy:SetSpaceY( self:GetSpaceY() )
|
||||
copy:SetBorder( self:GetBorder() )
|
||||
copy:SetSelectionCanvas( self:GetSelectionCanvas() )
|
||||
copy.OnModified = self.OnModified
|
||||
|
||||
copy:CopyContents( self )
|
||||
|
||||
return copy
|
||||
|
||||
end
|
||||
|
||||
function PANEL:CopyContents( from )
|
||||
|
||||
for k, v in ipairs( from:GetChildren() ) do
|
||||
|
||||
v:Copy():SetParent( self )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function PANEL:GenerateExample( ClassName, PropertySheet, Width, Height )
|
||||
|
||||
local pnl = vgui.Create( ClassName )
|
||||
pnl:MakeDroppable( "ExampleDraggable", false )
|
||||
pnl:SetSize( 200, 200 )
|
||||
pnl:SetUseLiveDrag( true )
|
||||
pnl:SetSelectionCanvas( true )
|
||||
pnl:SetSpaceX( 4 )
|
||||
pnl:SetSpaceY( 4 )
|
||||
|
||||
for i = 1, 32 do
|
||||
|
||||
local btn = pnl:Add( "DButton" )
|
||||
btn:SetSize( 32, 32 )
|
||||
btn:SetText( i )
|
||||
|
||||
end
|
||||
|
||||
PropertySheet:AddSheet( ClassName, pnl, nil, true, true )
|
||||
|
||||
end
|
||||
|
||||
derma.DefineControl( "DIconLayout", "", PANEL, "DDragBase" )
|
||||
Reference in New Issue
Block a user